- 博客(171)
- 资源 (9)
- 收藏
- 关注
原创 线性自抗扰控制LADRC(一)---基础知识
LADRC(Linear Active Disturbance Rejection Control)是ADRC的线性化版本,通过简化非线性模块(如ESO和反馈律)降低计算复杂度,适用于实时控制系统(如电机驱动)。
2025-02-10 10:02:37
549
原创 STM32F4适配WINUSB2.0
USBD_DescriptorsTypeDef结构体定义部分添加如下内容。至此,修改部分就修改完成了,可以下载到单片机上进行验证测试了。修改USBD_GetDescriptor函数。将对应用到的配置描述符修改为如下内容。修改USBD_StdDevReq函数。修改USBD_StdItfReq函数。描述符结构体定义部分修改如下。文件最后添加如下函数实现。文件最后添加如下函数实现。修改开始部分的宏定义。
2025-01-06 15:24:14
507
原创 STM32F4适配WINUSB1.0
修改开始部分的宏定义,根据自己的需求修改即可,注意:VID和PID不要用和默认工程一样的。至此上面的工程就修改完成了编译下载到单片机上便能够正常识别为USB设备。USBD_GetDescriptor函数部分添加如下内容。USBD_StdDevReq函数部分添加如下内容。USB描述符类型定义结构体部分添加如下如下内容。USBD_CDC类定义部分添加如下内容。将配置描述符部分都修改为如下一样的内容。USB类定义部分添加如下内容。描述符部分后面添加如下内容。文件最后部分添加函数实现。文件最后添加函数实现。
2025-01-06 14:47:43
602
原创 STM32 ADC —测试实验
虽然配置了多个通道,但禁止扫描模式,相当于只配置了第一个通道。因而每次采样都是第一个通道的值。单次转换模式,每次转换完配置的这个通道后便会停止,因而不会触发OVR错误。连续采样模式下,如果不及时将数据寄存器中的数据读取出来,便会触发溢出错误上面的测试实验我们的主要目的是为了真正的区分清楚单次转换模式、连续转换模式、扫描模式之间的区别和联系,大多数写法在实际使用中并不推荐。
2024-12-02 20:31:14
1031
原创 STM32 ADC --- 知识点总结
启动ADC后,便会一直转换通道CH0,在每次转换结束后如果没有及时将数据寄存器中的值读出来,会触发溢出(OVR)错误。:这种情况其实和上面单通道采样情况是一样的,虽然配置了多个通道,但实际转换时只会转换第一个通道。在使用多通道采样的情况下一般都会使能扫描模式,下面的讨论中我们也会分析下禁止扫描模式的情况。这种模式是将序列寄存器中配置的所有通道扫描一次,然后再重新扫描,一直重复。这种模式是将序列寄存器中配置的所有通道扫描一次。例如:我们配置了采样通道CH0和CH1。例如:我们只配置了一个采样通道CH0。
2024-11-29 17:49:24
826
原创 STM32 ADC --- 多通道序列采样
这种使用方式需要注意的是每次通过函数启动转换后便会将整个序列的所有通道转换一次。错误用法示例:// ...这种方式其实两次采样的都是序列中第一个通道的值,因而第二次采样无法获取到正确的结果。
2024-11-29 11:37:21
586
原创 STM32 ADC --- DMA乒乓缓存
cubeMX默认生成的工程中是打开DMA中断的,这章我们需要用到该中断,固不要将该中断关闭(对于上节的配置使用将DMA中断关闭也是可以正常工作的)。参考文章:https://shequ.stmicroelectronics.cn/thread-625398-1-1.html。DMA在传输完成时会调用。
2024-11-15 20:32:27
720
原创 STM32 ADC --- DMA采样
如果先配置过不使用DMA的ADC工程,再重新配置使用DMA时,生成代码中ADC初始化在DMA初始化之前,这样可能导致ADC+DMA无法正常工作,因而无法正确获取到数据。函数启动,便可以以一直进行转换,只需要从指定的数组中读取数据即可。cubeMX配置工具中可以根据上图所示调整每个初始化函数的顺序。基于上面ADC配置为连续转换模式和DMA配置为循环模式。这样ADC+DMA才能正常工作。则需要在每次需要转换的时候通过。,否则可能无法正确获取到数据。正确的初始化顺序应该是。上面红框中选择配置为。
2024-11-15 17:24:44
902
原创 STM32 ADC --- 任意单通道采样
需求:有多个通道需要进行ADC采样,实现每次采样只采样一个通道,且可以随时采样不同通道的功能。这里我们想通过10通道和11通道分别进行ADC采样。需要注意的是:**当ADC规则转换中配置的转换数大于1时,cubeMX会自动将扫描转换模式使能。**但这里我们实际需要扫描转换模式为关闭,这里可以等下在代码中修改。还有个需要注意的地方是结束转换的选择:单个通道完成转换时即触发EOC标志位为了方便后续继续使用cubeMX生成代码不影响改动,我们采用重新初始化ADC的方式来实现需求:通过函数将ADC1重新初始化后
2024-11-15 11:51:04
1006
原创 Makefile简明使用教程(二)
通过利用Makefile函数,OBJECTS变量中的名称就可以简化了,且是根据SOURCES自动生成的,这样有新增文件时只需要修改SOURCES处即可。说明:从文件名序列中取出非目录的部分。即取出相对路径的文件名,最后一个斜杠后面的内容(不包括斜杠)。说明:从文件名序列中取出目录的部分,即取出文件所在的路径,最后一个斜杠前面的内容(包括斜杠):将SRC变量中所有以.c结尾的文件名替换成对应的以.o结尾的文件名,然后赋回给SRC。基于上一章v4的基础上继续优化。说明:指定文件的搜索路径。
2024-10-15 17:48:57
214
原创 QCustomPlot笔记(一)
QT中用于绘制曲线的第三方工具第一个压缩包中提供了源文件+文档+例子,使用时可以将帮助文档添加到QT的帮助文档中,这样在使用时直接按F1就可以获取上下文提示第二个压缩包提供了将qcustomplot源码编译为共享库的方法,和一个如何使用的案例第三个压缩包中仅包含源码文件。
2024-09-17 10:35:56
755
原创 vscode搭建ros开发环境问题记录(更新...)
然后重新加载工作空间便可以获得自动提示了。这里将头文件已经正确包含到。中代码中仍然不能自动补全,将C_CPP插件设置中的。
2024-09-15 16:45:00
544
原创 C++笔记---引用
有的说法是引用是变量的别名,和引用变量共占一块内存。这种说法仅是基于表面上的应用对引用的理解,因为编译器隐藏了引用的细节。通过引用的本质我们可以知道引用本质还是通过指针实现的,因此引用和指针占据同样大小的空间。引用传递也是通过指针实现的,因此也相当于将变量的地址传递给形参。单纯从理论上将,如果函数完全一致且不存在编译器优化的情况下两者的效率应该是一致的。首先指针传递是将变量的地址赋值给函数的形参,后续的操作都是基于地址进行操作。编译器不会专门开辟内存空间存储引用,而是将引用的地方替换为真正的地址。
2024-09-12 10:16:17
351
原创 C++笔记---指针常量和常量指针
指针常量:指针本身是一个常量,即指针一旦初始化后变不能改变,但指针指向的内容是可以改变的(常量指针:一个指向常量的指针,即指针指向的内容不可以修改,但指针本身是可以修改的。指针数组:一个数组,数组中存放的元素是指针(一个存放指针的数组)指针函数:一个函数,函数的类型(返回值)是指针。指针常量:指针是一个常量,本质是一个常量。常量指针:指向常量的指针,本质是一个指针。汉语描述一般前面是修饰后面是中心。函数指针:一个指针,指向函数的指针。数组指针:一个指针,指向数组的指针。读作指针,按顺序读即可。
2024-09-11 19:55:39
375
原创 Linux TCP服务器和客户端学习
socket这里实现的是单连接的情况,即一个服务器只能连接一个客户端。实现的功能是服务器端:等待客户端连接,连接后显示客户端发送的数据,并将数据原样发送给客户端。客户端:连接服务器,然后向服务器发送数据,并回显服务器返回的数据。
2024-09-09 18:16:34
480
原创 Makefile简明使用教程
这里我的理解是每一个.c文件都会生成一行对应的处理,正如上面完整的makefile文件中注释掉的那一部分,对于每一行来说第一个依赖文件和所有的依赖文件来说是一样的都是对应的那个.c文件。make有一种机制,会根据目标文件的修改和依赖文件的修改时间来判定要不要重新构建,按照上面的写法,某一个源文件稍作改动,所有文件都会重新编译。比较直观的写法,hello 为要构建的目标,main.c和message.c文件为依赖文件,下一行为生成目标要执行的命令。文件,可以通过-f参数来指定要使用的makefile文件。
2024-09-09 14:53:42
843
原创 redroid rk3588折腾笔记
第一步先要重新编译一个相应的内核环境,然后再通过docker运行相应镜像。手头有一个nanoPC-t6的3588板卡,想试下搭建云手机。
2024-09-01 10:59:51
1059
1
原创 RoboDK试用期间提示无效或过期的许可证
该目录下的文件全部删除掉,便可以正常使用RoboDK应用了,但是等软件关闭后还是会出现上面的问题,还需要执行同样的操作。RoboDK下载下来在试用期间提示如下信息,不知道什么原因。
2024-06-18 19:15:37
1579
原创 机械臂学习资料收集
机器人学之运动学笔记【3】—— 机械臂DH表示法+正向运动学(Forward Kinematics)标准DH建模与改进DH建模
2024-06-07 12:29:19
188
原创 STM32 MAP文件结合固件文件分析
MAP 文件分析可以参考之前的文章程序代码在未运行时在存储器空间内称为加载域,在运行时在存储器空间内称为运行域。在这里我们根据加载域的描述可以知道加载域的空间结束位置应该为0x08020000+0x00010978=0x08030978的位置。从下面的固件我们可以知道固件的实际结束位置应该是0x080305E8。这里的俩个位置并不一致是什么原因呢?我们继续往下逐步分析。上图内容的最后一行:结束地址为0x080304e0+0x20=0x08030500,和第一行中的描述一致。根据类型和属性可以知道这一部分
2024-05-24 20:14:31
1244
原创 Keil MDK map文件学习笔记
从flash的0x08030500位置开始加载数据,加载大小为0x000069b0大小的数据到RAM空间(上图最后一行0x200049b0+0x2000=0x200069b0)。这里要注意的是并非直接从0x08030500直接向后复制0x000069b0大小的数据到RAM中,实际是根据FLASH空间中的0x08030500后面的部分数据和之前的分散加载表等内容在RAM中生成的0x69b0空间。上面两个红框中的内容分别对应于全局函数和全局变量,并显示了所在执行域空间的位置和大小。
2024-05-24 15:52:17
1178
原创 基于STM32看Cotex-M内核中断向量表重定向
正常的执行过程为,启动时先执行Boot程序中的Reset_Handler函数然后经过分散加载,初始化堆栈,初始化C库后跳转到用户main函数执行,其中监测到不许要升级则通过跳转函数(设置主栈指针,将App中Reset_Handler函数的地址作为执行地址)跳转到App程序中的Reset_Handler函数,然后再经过分散加载,初始化堆栈,初始化C库等操作后跳转到用户main函数中执行,在main函数开始位置首先要修改VTOR的值,则后续的中断触发都会跳转到App代码中对应的中断服务函数中。
2024-05-24 13:25:54
1691
原创 基于STM32看Cortex-M内核相关的一些底层知识
向量表位于存储器的开头部分,它的头两个字为主栈指针(MSP)的初始值,以及代表复位处理起始地址的复位向量(参考本书图4.26和4.5.3节)。细心的你可以能已经发现了,这里固件中存储的向量表的地址和map文件中对应的函数地址不完全一致,差了1,这是因为向量表的LSB位必须置1以表示Thumb状态(Cortex-M处理器不支持ARM状态)从上面的map文件中我们可以看出程序的栈顶地址就是0x200069b0,从下面的固件中我们可以看出起始地址存放的就是栈顶指针的值。复位函数是系统上电后第一个执行的程序。
2024-05-23 17:39:45
684
3
原创 无刷电机中对霍尔同步电角度的理解
在自己的驱动程序中也使用了ST的方法来测量同步电角度,然后根据当前霍尔的状态再确定启动时的电角度。在霍尔无刷电机驱动时需要进行初始电角度定位,根据ST电机库提供的方法首先我们要测量同步电角度。
2024-05-13 17:18:51
811
原创 记一次使用STM32F042K6芯片内部HSI48M时钟导致CAN总线报错问题
深入去解决某个问题时,也会加深你对其它部分的了解和思考,比如这里让我又重新了解和CAN的采样点和CAN报错机制。
2024-04-12 20:33:36
620
原创 STM32笔记---CAN采样点设置和报错
这里我们可以在HAL库的CAN中断处理的部分找到依据,ERRIE中断使能后出错时会将主状态寄存器(MSR)中的ERRI位置位,然后再依次判断有哪些分开关管理的错误中断触发了。之前使用CAN总线一直没详细搞清楚,使能的错误中断都具体对应的是什么,使用的时候一下把所有的CAN错误中断都使能上,正好今天遇到的CAN总线的一些问题,详细看了下。再同步补偿宽度(SJW)的设置范围位1-4TQ,相当于CAN总线的采样点可以根据实际情况在1-4个TQ范围内进行调整,这个值大可以增大CAN波特率的容错范围。
2024-04-12 19:37:23
3291
原创 C语言知识点---char *a和char a[]
在 C 语言中,字符串实际上是使用空字符 \0 结尾的一维字符数组。因此,\0 是用于标记字符串的结束。= 17 ,a为数组名,sizeof可以直接计算数组所占空间的大小。= 4,p为指针变量,sizeof计算的是这个变量所占空间的大小。a为数组名,数组首元素的指针常量,因此a不能被赋值。: a为char类型数组名,表示数组的首地址,可以将数组名赋值给指针变量p。这两种形式都可以定义字符串。类型指针,表示用于存放。
2024-04-08 15:59:59
519
原创 vscode开发ESP32问题记录
首先可以通过vscode 中的IDF插件生成模板工程,这样会自动创建。文件夹中的一些json配置文件,保存后对应的波浪线警告便消失了。
2024-04-04 12:09:29
565
原创 ESP32学习---ESP-NOW(一)
ESP-NOW 是乐鑫定义的一种无线通信协议,能够在无路由器的情况下直接、快速、低功耗地控制智能设备。它能够与 Wi-Fi 和 Bluetooth LE 共存,支持乐鑫 ESP8266、ESP32、ESP32-S 和 ESP32-C 等多系列 SoC。ESP-NOW 广泛应用于智能家电、远程控制和传感器等领域。
2024-04-03 20:09:03
1004
原创 基于vscode Arduino插件开发Arduino项目
因此可以知道:vscode中的Arduino插件已经不支持添加Arduino IDE路径的方式了,转而使用了Arduino CLI(用于开发arduino的命令行工具)的方式。这样在vscode中开发Arduino可以不依赖于Arduino IDE,即不安装Arduino IDE也可以。意思是说:早期Arduino IDE的支持方式将在插件的下个发布版本中移除,请尽快使用Arduion CLI.指定输出路径,可以提高编译速度,也可以直接从输出路径中获取编译的二进制文件。便可以正常输出详细信息了。
2024-04-03 10:53:46
2477
1
原创 ESP32学习---ESP-NOW
这里使用3个模块之间互相传输数据,首先我们先要获取到3个模块的MAC地址,每个模块向外发送数据并同时接收来自于其它两个模块的数据。打开串口监视器复位模块显示信息中会包含如下信息即为mac地址。
2024-03-31 00:23:48
3531
原创 python知识点记录
版本是支持python2.7的最后版本,如果使用的是python2.7环境的话,需要安装正确的版本才能正常使用。是python的一个轻量级的定时任务调度库,可以实现每分钟,每天,每周的定时任务等,类似于Linux系统下的。官网地址:https://pypi.org/project/schedule/基于python的进程管理工具。
2024-03-29 23:41:45
299
vscode_stm32f411.rar
2021-04-30
STM32编码器模式测试例程
2018-11-19
WS2812驱动程序(SPI+DMA)
2018-10-28
基于STM32单片机的指纹识别模块的测试代码
2018-08-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人