STM32CubeMX->FreeRTOS+USART接收不定长数据
由于本人做的一个项目功能相对复杂,要求使用操作系统,且项目工程中有很多需要串口操作的外设,所以需要对串口设计不定长的收发功能,裸机跑惯了的孩子就是比较野,一天瞎吉尔弄,现在是不是GG,这里先批评一下自己。为了解决这一问题并做个笔记,就有了这篇博客。
实现思路:
使用串口、定时器记录接收到的数据,每5ms进入一次处理函数(一条数据处理完毕)
使用一个计数位、一个标志位、一个暂存buff
标志位置1则认为数据处理完成,将数据打印出来
使用硬件功能:串口3及中断,定时器7及中断
使用操作系统元素:一个互斥量
使能RTOS后会RTOS会强制调用系统时钟,所以在使能了操作系统之后需要将系统时钟换为定时器TIM1
操作步骤
-
启动STM32CubeMX并对芯片选型
主要设置- 串口3及中断使能,115200,8,None,1
- 定时器7及中断使能,预分频9000-1,自动重载50-1(时钟树APB1、2为90MHz)
- SYS时钟源设为定时器1
- 使能FreeRTOS,创建1个串口任务、创建1个互斥量
- 使能两个GPIO输出驱动LED
以上都清楚的大佬转到代码功能实现继续
-
使能RCC时钟源为外部时钟

3. 设置SYS调试方式为串口,时钟源改为定时器1

4. 设置时钟树,是APB1、2为90MHz,或者自行设定,在后面定时器工作会用到

5. 使能串口3,并启用串口3中断,串口3设置为115200,8Bit,None,1(不知道什么意思的就没有必要看下去了)

6. 使能定时器7,并使能中断,定时器预分频系数与之前的90MHz相关,需要通过预分频系数和自动重载值将定时时间设为5ms【200Hz】,不会算的看我定时器博客(这里我用了一个不常用的定时器,用哪个都可以,只要注意好定时器隶属哪根时钟线就行)

7. 使能FreeRTOS并创建一个串口任务和一个二值量(二值信号量用于串口数据接收完成后进入串口任务)


8. 设置两个IO输出作为一个可视化依据

9. 项目命名、选择使用的程序编辑软件我的是MDK_ARM V5、分离.c.h文件,点击右上角GENERATE CODE生成工程

- 打开项目,先编译没有错误之后再进行修改
代码功能实现
-
首先在usart.c文件对串口3进行printf函数重定义,使串口3可用printf函数输出
内容加入到/* USER CODE BEGIN 0 */框架内
/* USER CODE BEGIN 0 */ /********************************************************************************/ #include "stdio.h" //加入以下代码,支持printf函数,而不需要选择use MicroLIB //#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #if 1 #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE { int handle; }; FILE __stdout; //定义_sys_exit()以避免使用半主机模式 void _sys_exit(int x) { x

本文介绍如何在STM32CubeMX中结合FreeRTOS实现串口的不定长数据收发功能。通过使用定时器记录数据,每5ms处理一次,配合标志位和缓冲区,确保数据的正确接收和处理。实验结果验证了方案的有效性。
&spm=1001.2101.3001.5002&articleId=106205243&d=1&t=3&u=2240d0e2d1694e00b9d50fa2436fd00b)
8863

被折叠的 条评论
为什么被折叠?



