自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(56)
  • 资源 (8)
  • 问答 (2)
  • 收藏
  • 关注

原创 FreeRTOS遍历所有任务的TCB并获得栈的最大使用量

FreeRTOS的任务栈的大小应该如何设置才能尽可能地不浪费内存呢?最直接的方法当然是运行一段时间任务,然后看看任务所使用的最大堆栈大小为多少,然后以此为基准多设置一点点。那么应该怎么实现呢?

2022-11-30 17:26:42 296 1

原创 泰凌微BLE实操(2):ATT自定义UUID并实现Notification数据传输

GATT(Generic Attribute Protocol)的实质是由多个Attribute构成,每个Attribute都具有一定的信息量,当多个不同种类的Attribute就反映出一个基本的service。UUID用来区分每个Attribute类型,全长为16字节。在中定义了一些标准的UUID。多个Attrbute组成一个,每个Attribute都有一个值,用来区分不同的Attribute。

2022-11-23 23:13:45 78

原创 BLE学习(4):蓝牙地址类型和设备的隐私

蓝牙地址也被称为蓝牙MAC地址,它能唯一标识一个蓝牙设备的48位的值。在蓝牙规范中,它被称为BD_ADDR。和,其中。

2022-11-21 23:27:42 163

原创 BLE学习(3):ATT和GATT详解

ATT协议负责管理设备之间的数据存储。它为服务端提供了一种客户端可以进行读写的Attribute数据结构,并为客户端提供了访问、写入和读取数据的机制(访问方法和权限)。GATT层定义了一个层次化的数据结构,它有助于理解存储在服务端中数据之间的关系。

2022-11-21 00:06:01 429

原创 BLE学习(2):广播包报文格式详解

为了能够充分理解蓝牙的广播,我们先了解一下BLE架构的GAP()层。在一个BLE设备中GAP可以实现:发现蓝牙设备和广播报文并连接、广播并接受连接、发送广播报文、发现蓝牙设备和广播报文但不连接(仅扫描)。对于连接模式而言,两个设备之间可以双向传输数据;对于一个正在广播中的设备而言,无法接收数据(但有一个例外:可以回复报文)。

2022-11-18 18:29:53 539

原创 BLE学习(1):蓝牙协议栈的介绍

GATT封装了ATT,主要用来规范attribute中的数据内容,并将不同的attribute进行分组分类。负责协调蓝牙LE链路中配置文件的交换,配置文件包括诸如handle分配、UUID和权限等信息和数据。GAP用于指定设备的角色(Server/Client)、工作模式和过程。它还管理连接的建立和安全。HCI层负责处理主机和控制器之间的通信。HCI为数据包数据的传输和接收定义了一组命令和事件。)两种技术的协议栈。)层的任务,它直接与蓝牙PHY层直接相连,并管理链路状态。下图展示了蓝牙的协议栈和OSI(

2022-11-18 15:48:15 280

原创 C语言结构体字节对齐的设置 #pragma和__attribute__

CPU不会一个字节一个字节地读或写内存,而是一次访问2/4/6/8/16/32/64字节,因为这比读一个字节要快得多。假设CPU按四字节对齐,我们把四字节称为一个chunk,此时要读内存0x03-0x06的内容,CPU就会读取0x00~0x03和0x04-0x07两个chunk,然后把两个chunk读到的内容移位并组合返回给用户。char b;};CPU就会在结构体最后填充两个字节,以保证字节对齐。

2022-11-18 11:36:13 339

原创 泰凌微BLE实操(1):HCI层事件的注册和使用

断开连接事件属于HCI事件中,所以这里以建立连接和断开连接的事件为例。但是这毕竟是泰凌微官方给的事件,我们还是想知道真正的蓝牙协议中是如何处理这个事件,还有原始的报文是什么样的。是通过HCI将Controller所有的event报告给Host。来处理产生的事件,加入我们连接成功要获得连接句柄。首先我们来看一下在Host或App层接收。其中Octet为拉丁文,即字节,可以看到。

2022-11-17 22:31:15 177

原创 C语言 CRC32分段计算实现

最近在写BootLoader过程中,需要对整个二进制文件进行CRC校验然后填写到汇编自定义的偏移处,然后这个保存CRC结果的位置不需要计算,所以从NXP提取了一个CRC校验的代码,可以一段一段将数据加进来校验。

2022-11-17 20:53:52 208

原创 NXP BootLoader源码分析并改写SD卡启动

NXP BootLoader的分析并改写为SD启动

2022-11-17 14:38:54 259

原创 PMSM FOC位置环S曲线控制算法(恒定急动度)

之前做FOC位置环控制的时候,简单地加了一个S曲线控制,参考链接如下:FOC 单电阻采样 位置环控制伺服电机这里面我的代码实现其实就是在每step个ADC中断中,根据函数f(x)=11+e−xf(x)=\frac{1}{1+e^{-x}}f(x)=1+e−x1​生成一个uint16的S曲线定点数组,每次计算位置增加的比例,进而设置位置环的目标值。当然还需要考虑一些问题,比如S曲线有一些地方很平缓,增量不高,所以在还没到step个ADC中断的时候,PID就已经收敛了,所以电机就会在目标位置轻微抖动。当然..

2022-06-25 12:27:01 876

原创 QT实现背景图片上下拼接滚动

1、添加背景图片QPixmap back;back.load(":/img/gamemap.bmp");back = back.scaled(QSize(this->width(),this->height()));2、paintEvent函数(1)在头文件中声明paintEvent函数private: void paintEvent(QPaintEvent *event);paintEvent在父类中声明,这里重写这个绘制函数(2)编写paintEvent函数#in

2022-05-07 16:36:31 440

原创 QT 右键菜单栏的实现

有时我们希望在窗口中右键弹出菜单,这里来介绍一下QT中怎么实现,首先创建一个MainWindow项目。1、在mainwindow.h文件中添加槽声明private slots: void on_MainWindow_customContextMenuRequested(const QPoint &pos);槽函数的名字固定,QT内部已经设置好了其对应的触发信号,不同的窗口类名将函数名中的Mainwindow替换一下即可2、在构造函数中设置上下文菜单选项this->set

2022-05-07 15:51:32 3013 1

原创 C语言实现itoa函数【精简】

由于itoa函数仅在windows中可以使用,在linux中没有相应的函数,这里实现一个itoa函数,包括进制转换功能,正负数都能转换。具体见注释:char* itoa(int value, char* str, int radix) { static char dig[] = "0123456789" "abcdefghijklmnopqrstuvwxyz"; int n = 0, neg = 0; unsigned int v; char

2022-05-07 10:27:52 808

原创 QT串口 QSerialPort的使用与粘包处理

1、在工程的pro文件中加入串口模块QT += serialport2、添加头文件#include <QSerialPort>#include <QSerialPortInfo>3、连接串口接收数据信号到自己的槽函数写在窗口的构造函数中:QObject::connect(&serial, &QSerialPort::readyRead, this, &MainWindow::serialPort_readyRead);4、串口

2022-05-05 19:35:40 1061

原创 OpenCV NAO机器人辅助捡球丢球

1. 概述NAO机器人身高58cm,体重5.4kg。主要硬件包括CPU、主板、扬声器、话筒、红外线、相机、超声波(声呐)、传感器、电机、语音合成器、陀螺仪等。实验室中NAO机器人的型号为NAOH25,其构造如下:NAO机器人的操作系统为Gentoo Linux,它支持Windows、Linux、MacOS等操作系统的远程控制,可以在这些平台上编程控制NAO。头部CPU运行Linux内核,支持AldebaranRobotics内核NAOqi,NAOqi提供了一组应用程序接口(API)用于操作机器人,

2022-05-03 20:44:31 2353 5

原创 git reset命令--soft、--mixed、--hard的区别

文章目录1、git reset --soft2 git reset --mixed3 git reset --hard4 撤销4.1 撤销远程仓库中的commit4.2 git reset --hard的撤销5 总结1、git reset --soft假设我们现在有三个提交C1~C3,现在HEAD指向C3,#mermaid-svg-vXk0zD1Q0MRHIdrm {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;f

2022-05-03 19:25:33 2154

原创 Git合并操作之merge、rebase、squash详解

有时在一个分支上完成一个功能的开发,开发完成后需要将其合并到主分支中。或者有时提交了很多个commit,它们之间的改动并不是很多,想将它们合并成一个commit,此时就需要使用GIT的合并操作。下面来介绍一下GIT中的几种合并操作:1 git merge和git rebasegit merge不对仓库历史做任何改变,它会保留分支上所有的历史commit,然后简单地创建一个合并的commit。1.1 git merge使用git merge将master分支合并到feature分支git chec

2022-05-03 16:43:02 4909

原创 GIT基础入门:安装、配置、使用、分支管理、标签管理

文章目录一 连接GIT到Github二 基本配置三 基本使用四 分支管理4.1 理论4.2 相关指令五 标签管理一 连接GIT到Github1、GIT下载GIT下载地址,下载后打开Git Bash2、创建SSH Key并添加 ssh-keygen -t rsa -C 你的邮箱 #执行后全部回车即可在C:\Users\Administrator\.ssh中会生成公钥id_rsa.pub和私钥id_rsa复制公钥内容,并添加到Github中:Add new SSH keys3、连接G

2022-04-30 16:55:32 284

原创 μC/OS-II中最高优先级任务的判定

假设最多支持64个任务,先来看看判断最高优先级任务所用到的相关变量:uint8 OSRdyGrp:将64个任务分成了8组,该变量表示哪一组有就绪任务uint8 OSRdyTbl[8]:即上面的8组任务,对应每一组有8个任务,为1表示该任务就绪uint8 OSUnMapTbl[256]:μC/OS-II中优先级数字越低表示优先级越高。这里就是要获得最低位开始,第一位为1所在的位数。每次都要一位一位的判断很麻烦,干脆将结果做成一个表格,通过索引来获取寻找最高优先级任务相关代码:y = OSU

2022-04-28 11:38:30 216

原创 C语言正余弦函数定点查表算法原理及实现

如果用数学库中的sin和cos函数计算,可能涉及浮点、乘法、除法运算,运行速率较低。这里介绍一种正余弦查表算法。参考代码:SMT32 FOC电机库的mc_math.c。首先我们知道正弦和余弦的函数值差了90°,所以查表数据只需要保存正弦或者余弦的结果即可。待计算的角度范围为[0,2π],我们只需要保存的角度,其它象限的角度通过三角函数公式变换一下即可。(1)正余弦表格生成第一步当然是保存范围内正余弦函数的值,保存的越多计算结果越精确,但又消耗更多的存储空间。在STM32电机库中采用int16.

2022-04-24 16:21:30 1966 2

原创 C语言实现memcpy、memset、strcpy、strncpy、strcmp、strncmp、strlen

1、memcpyvoid *memcpy(void *dst, const void *src, unsigned int len){ void * ret = dst; while (len-- > 0) *((char *)dst)++ = *((char *)src)++; return ret;}2、memsetvoid * memset(void * s,char c,size_t count){ char *xs = (char *) s; while (

2022-04-21 21:39:55 643

原创 FOC 位置环S曲线之定点查表算法

在位置环中,若直接让电机到指定位置刚开始加速度过大,会对电机造成损坏,所以一般不会直接将实际位置误差进行PID计算,而是逐步地增加位置。本篇文章介绍一种简单的定点数查表实现S曲线一、原理实际上就是利用方程,其函数图像如下所示:可以看到该函数的值域是(0,1),斜率也是先增加再减小,就用这个函数作为我们电机运动的S曲线。代码中就是每隔一定时间设置位置环的目标值,位置误差的增长率就和这个S曲线函数相同。二、代码实现1、生成S曲线数组由于需要用定点S曲线,所以使用Q16格式来保存数组,

2022-04-16 20:16:07 964 4

原创 CORDIC算法 arctan反正切计算原理及C语言定点实现

之前做FOC算法的时候,用到了TLV493D磁传感芯片通过两个相差90°的正弦曲线计算角度,所以需要计算arctan的值。这里就基于CORDIC(坐标旋转数字计算方法,Coordinate Rotation Digital Computer)理论,实现一种arctan的定点计算方法。一、原理坐标旋转与FOC中的Park变换原理相同,CORDIC也是通过旋转坐标轴来求解反正切值的。如果去掉cosθ,这样不会影响角度旋转的结果,只是x和y都被缩小了cosθ,这样能简化计算,这称为伪旋

2022-04-06 21:12:22 1276

原创 Linux 进程间通信IPC概念与相关函数

一、介绍进程之间是相对独立的,不能直接访问彼此的资源,然而在逻辑上进程往往不是孤立的,彼此间需要进行数据交换——进程通信。进程间通信(IPC——Inter Process Communication )包括以下几种方式:(1)管道(Pipeline)管道是Linux最初支持的IPC方式,可分为无名管道, 命名管道。在管道通信中,发送进程以字符流形式将大量数据送入管道,接收进程可从管道接收数据,从而实现通信。(2)信号量 (Semaphore)信号量是一种被保护的变量,只能通过初始化和两个标准

2022-03-23 11:12:33 1160

原创 C语言结构体指定初始化

很多时候我们并不会使用到结构体中每一个成员,只想初始化其中某几个成员,这时候可以使用结构体的指定初始化。struct student { char *name; int num; int age; char group; float score;} ;(1)常规情况下:所有变量都要初始化struct student stu1 ={"Tom",12,18,"A",136.5};(2)指定初始化:在变量名前加一个“.”,每行用逗号隔开struct st

2022-03-11 10:52:18 797

原创 C语言 #和##的使用

Linux源代码中偶尔会遇到#号,虽然很少用到,但还是做个笔记:①#:对它所引用的宏变量左右各加上一个双引号前提: printf("123""456"); //printf是可以这样使用的,输出123456例: #define test(EXP) #EXP printf("123"test(45)"6");//等价于printf("123""45""6");②##:在带参数的宏定义中将两个子串(token)联接起来形成一个新子串(非字符串)。子串:编译器能够识

2022-03-11 10:47:33 902

原创 ARM常用汇编指令

1、常用指令(1)LDR、STR、MOVLDR R0,[R1] #R0 = *R1,读取R1指向内存区域中的内容,存入R0STR R0,[R1] #*R1 = R0,将R0写入R1指向的内存区域MOV R0,R1 #R0 = R1MOV R0,#0X10 #R0 = 0x10LDR R0,=0X12345678 #R0 = 0x12345678 #没有等号的话就是将0x12345678指向内存的值取出放入R0 伪指令,所有指令是32位,但MOV不能一次赋32位的

2022-03-11 10:32:46 3047

原创 Shell脚本 &&和||的使用

如果前一个指令执行正确,在Linux中会回传一个$?=0的值例1:判断文件是否存在,存在则创建另一个文件ls /tmp/abc && touch /tmp/abc/hehe例2:判断文件是否存在,不存在创建,存在则不做任何事ls /tmp/abc || touch /tmp/abc例3:判断文件是否存在,存在显示"exist",不存在显示"not exist"#有多个指令时按顺序执行,后一个根据前一个的$?执行ls /tmp/vbirding &am...

2022-03-10 21:25:59 2256

原创 Shell脚本的通配符和特殊符号

通配符: 符号 意义 * 0到无穷个任意字符 ? 一个任意字符 [] 如[abcd]表示a,b,c,d中任意一个 [-] 在编码顺序内的所有字符,如[0-9]表示0到9间的数字 [^] 反向选择,如[^abc]表示非a,b,c的其它字符 特殊符号:..

2022-03-10 21:18:41 700

原创 Shell脚本 单引号、双引号和反引号的区别

定义一个变量时,等号两边不能有空格,若有空格可用双引号或单引号将变量内容结合。(1)双引号内的特殊字符可保有原本的特性var="lang is $LANG"echo $var---输出---lang is en_US(2)单引号内的特殊字符仅为一般文本var='lang is $LANG'echo $var--输出--lang is $LANG特殊字符(包含空格)也可用"\"转义为一般字符(3)反引号:有的指令需要其它指令提供的信息,可用`指令`或$(指令),推荐使用后

2022-03-10 21:04:46 499

原创 嵌入式中volatile的使用

volatile关键字的意思为易变的,提醒编译器从变量地址中读取数据,而不是有时优化为暂时使用寄存器中的值。如果变量由别的程序或函数更新,特别是在中断中修改的话,编译器很可能会优化变量,将出现不一致的现象。比如说在中断中修改一个变量的值,但中断什么时候触发编译器并不知道,那编译器就会以为那段代码不会执行,从而优化掉。那volatile就告诉编译器这个变量是易变的,不要优化它。指令重排序的概念:static int num = 0;线程1: num = 2; ready = t

2021-12-10 23:04:20 97

原创 Linux 宏__builtin_expect的使用

__builtin_expect为gcc内置宏,在Linux源码中定义如下:#define likely(x) __builtin_expect(!!(x), 1)#define unlikely(x) __builtin_expect(!!(x), 0)例子(以unlikely为例,likely同理):int main(char *argv[], int argc){ int a = atoi (argv[1]); if (unlikely (a ==

2021-12-10 22:53:43 824

原创 FOC 单电阻采样 位置环控制伺服电机

FOC单电阻采样,位置环控制微型伺服电机,旋转到设定位置,S曲线平滑旋转过程。

2021-12-10 21:44:48 3889 1

原创 FOC电机库 定点PID代码分析

代码来源于STM32 FOC电机库中的pid_regulator.c。PID结构体typedef struct PID_Handle{ int16_t hDefKpGain; /**< Default @f$K_{pg}@f$ gain */ int16_t hDefKiGain; /**< Default @f$K_{ig}@f$ gain */ int16_t hKpGain; /**&lt

2021-12-05 11:26:36 1302 2

原创 FOC SVPWM函数PWMC_SetPhaseVoltage解析

一、扇区判断/* wUAlpha和wUBeta这里都乘了2,后面又除以了2,wY和wZ即没有分母 */wUAlpha = Valfa_beta.qV_Component1 * ( int32_t )pHandle->hT_Sqrt3;//hT_Sqrt3为2/√3wUBeta = -( Valfa_beta.qV_Component2 * ( int32_t )( pHandle->hPWMperiod ) ) * 2;wX = wUBeta;wY = ( wUBeta + wUA

2021-10-14 23:06:34 1583

原创 MOS管特性和导通过程

三极管是流控流器件,它不能驱动功率太大的器件,因为此时C极电流大,而CE压降为0.3V左右,在三极管上面消耗的功率就很大,还容易发热。所以压控压型的MOS管就诞生了。特性一开始给GS端电容充电的过程中是有电流的,当MOS管完全导通后,栅极基本没有电流。MOS管各极之间都因工艺有一个等效电容,这里引入三个电容的概念:(1)输入电容Ciss = Cgd + Cgs(2)输出电容Coss = Cgd + Cds(3)密勒电容Crss = Cgd与三极管的CE端导通压降固定不同,MOS管的

2021-05-02 20:12:35 4484

原创 死区时间的分析与设置

可以将MOS管理解为一个可调电阻,电压控制电流。MOS管的源极和栅极之间会有一个结电容。现在在栅极加上一个门电路(与门/非门/或门随意,用来模拟MOS管开关,即电平跳变的过程)。当门电路输出的信号跳变时,电流是非常大的,会导致MOS管发热,所以需要在门电路后面再串联一个电阻,这个电阻很小,一般在10Ω左右。图中电容实际是不存在的假设门电路的输出为方波,RC电路的充放电波形如下:假设图中Vm为5V。当输入从低电平跳变为高电平时:MOS管的栅极电压并不能一下从0变为5V,而MOS管栅极从0

2021-04-19 20:36:53 8326

原创 三极管原理及特性分析

在看这篇文章之前请务必确保掌握PN结、二极管原理详解与应用中的内容对于三极管的符号、PNP和NPN的区别等基础知识这里不做讲解文章目录1 原理1 原理先以NPN三极管为例:图中集电极电子应该画少点(掺杂少),尺寸应画高些(体积大,不易发热),后面会有说明基极和发射极正偏,所以发射极的电子会扩散到基极。由于集电极和基极PN结反偏,其耗尽区增大,方向为N->P的电场增大。此时增大电压不像正常浓度掺杂的PN结一样随着电压增大而漂移电流几乎不变,因为基极的掺杂很少且很薄,所以扩散到基极的.

2021-04-17 22:57:39 1164

原创 PN结、二极管原理详解与应用

文章目录1.非本征半导体2 PN结2.1 原理2.2 扩散、漂移和势垒电压2.3 正反向偏置2.4 PN结的二极管特性3 应用3.1 全波整流3.2 齐纳二极管(Zener Diode)1.非本征半导体(1)非本征N型半导体(非本征即掺杂的、不纯净的)Si为14族元素,我们可以添加13族或15族的元素使其变为非本征半导体,这里我们选15族的P使其变为非本征N型半导体。P有5个电子,Si有4个电子,而P有可能会取代某个Si原子:此时P的四个电子会和相邻的硅原子形成共价键,多出的那一个电子称为施主杂质

2021-04-17 21:34:28 2966 4

cortex-m4f-lazy-stacking-and-context-switching.pdf

cortex-m4f-lazy-stacking-and-context-switching.pdf

2022-12-02

ARMv8-M Architecture Reference Manual.pdf

ARMv8-M Architecture Reference Manual.pdf

2022-12-02

ARMv7 Architecture Reference Manual.pdf

ARMv7 Architecture Reference Manual.pdf

2022-12-02

Bluetooth 16-bit UUID Numbers Document

Bluetooth 16-bit UUID Numbers Document

2022-11-24

Supplement to the Bluetooth Core Specification

Supplement to the Bluetooth Core Specification

2022-11-24

QT右键菜单栏的实现源码

QT右键菜单栏实现

2022-11-18

蓝牙规范手册Core-V5.0

蓝牙规范手册Core-V5.0

2022-11-18

QT实现背景图片上下拼接滚动

背景图片无限滚动效果

2022-05-07

TI controlsuite

CONTROLSUITE安装包 Version: v3.4.9 Release date: 28-MAR-2018

2021-11-12

STM32_PMSM_FOC_SDK_V3.2 全部课件资料

part1~11,压缩包是11个PDF,蒋建国培训视频对应的资料

2021-10-18

华为技术有限公司c语言编程规范 PDF

华为技术有限公司c语言编程规范 PDF

2021-03-06

gnu-ld链接脚本浅析.pdf

gnu-ld链接脚本浅析.pdf

2021-03-03

lena_gray_512.tif

图像处理最为经典的lena图片,tiff格式。

2020-09-28

STM32 ST-LINK Utility v4.5.0.rar

STM32 ST-LINK Utility 最新版v4.5.0 stlink setup stlink升级固件

2020-08-31

STM32 PWM的OCToggle模式输出频率和占空比动态调整的波形

STM32官方例程中,关于TIM的例程应该是最多的,其中提供了OCToggle模式例程,但是我看网上基本没有人拿这个应用到频率和占空比可调的程序中,而是采用每次重新设置一次定时器的方式改变,很明显这样效率的程序是不可能应用在实际项目中的。我这个文件就是一个简单实现的一个.c文件。TIM_Period必须设置成65535,因为是动态改变,且C语言加法是循环的,也就是最大值+1=最小值。到了边界的时候,65530+6=1。

2020-02-24

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除