1. 为什么要在FreeRTOS里玩转UART串口?
如果你刚开始接触STM32,可能还在用HAL_Delay()让LED灯闪烁,或者用轮询的方式读取一个按键的状态。这种“单线程”的编程方式,在简单的玩具项目里没问题,但一旦你的项目复杂起来,比如需要一边采集传感器数据,一边通过串口向上位机发送数据,同时还得响应按键操作,你就会发现代码逻辑变得一团糟,各种while循环和标志位满天飞,一个地方卡住,整个系统都停了。
这时候,FreeRTOS 就该登场了。你可以把它理解为一个“超级管家”,它能把你的单片机CPU时间切成非常小的时间片,然后分配给不同的“任务”。比如,任务A专门负责闪烁LED,任务B专门负责通过串口发送数据,任务C专门等待串口接收数据。这些任务在宏观上看起来是“同时”运行的,互不干扰。你的编程思维就从“我下一步该做什么”变成了“我这个任务要一直做什么”,逻辑清晰太多了。
而 UART串口,几乎是嵌入式开发中最常用、最基础的通信外设。调试信息输出、与传感器模块通信、和电脑上位机交互,都离不开它。在FreeRTOS多任务环境下使用UART,核心要解决两个问题:一是如何安全地让多个任务“排队”使用同一个串口发送数据,避免数据被打断混杂;二是如何高效地接收数据,并及时通知给需要数据的任务。
STM32CubeMX这个图形化配置工具,正是为了解决STM32开发中繁琐的底层初始化而生的。它把芯片时钟、外设引脚、中断、DMA这些配置都变成了可视化的选项,点点鼠标就能生成完整的初始化代码。更重要的是,它集成了FreeRTOS的中间件,可以直接在图形界面里创建任务、信号量、队列,大大降低了RTOS的上手门槛。
所以,“Stm32CubeMX + FreeRTOS + UART” 这个组合,就是一个让你从单片机裸机编程迈向小型实时系统开发的“黄金入门套餐”。它能帮你快速搭建一个稳定、高效、易于维护的多任务通信框架。
2. 5分钟用CubeMX搭建FreeRTOS工程骨架
纸上得来终觉浅,我们直接动手。这里我以最经典的STM32F103C8T6(也就是常说的“蓝桥杯”核心板主控)为例,其他F1、F4、G0等系列操作几乎一模一样。
第一步:芯片选型与工程创建 打开STM32CubeMX,点击“New Project”。在芯片选择器里输入“STM32F103C8”,在中间列表里选中它,然后点击“Start Project”。CubeMX会自动为你打开这个芯片的引脚配置视图。
第二步:配置系统核心
- 系统时钟(RCC):在左侧“Pinout & Configuration”标签页,找到“System Core”下的RCC。将“High Speed Clock (HSE)”设置为“Crystal/Ceramic Resonator”。这样我们使用外部8MHz晶振。
- 调试接口(SYS):找到“System Core”下的SYS。将“Debug”设置为“Serial Wire”。这非常重要,它启用了SWD下载和调试接口(对应芯片的PA13和PA14引脚),否则芯片可能被锁住。
第三步:配置UART外设 我们的目标是让串口1(USART1)工作。在芯片图形上找到PA9和PA10(或者左侧“Connectivity”列表里找USART1)。
- 点击PA9,在弹出的功能列表中选择“USART1_TX”。点击PA10,选择“USART1_RX”。引脚会变成绿色。
- 在左侧配置页面,进入“Connectivity” -> “USART1”。
- 将“Mode”设置为“Asynchronous”(异步通信),这是最常用的模式。
- 在下方参数设置中,“Baud Rate”设为115200(常用波特率),“Word Length”设为8 Bits(一个字节),“Parity”设为None(无校验),“Stop Bits”设为1。其他保持默认。
- 最关键的一步:点击上方“NVIC Settings”标签页,勾选“USART1 global interrupt”使能全局中断。这样我们才能使用中断方式接收数据。
第四步:启用并配置FreeRTOS
- 在左侧“Middleware and Software Packs”分类下,找到“FREERTOS”。点击它,在中间“Mode”设置里,将“Interface”从“Disabled”改为“CMSIS_V2”。CMSIS是ARM的通用接口标准,用起来更规范。
- 此时,左侧项目树里“FREERTOS”下会出现可配置项。我们进入“Tasks and Queues”标签页。
- 点击“Tasks”列表下方的“Add”按钮,创建一个新任务。我们可以创建两个:
Task_UART_Tx: 负责周期性地发送数据。将它的“Entry Function”改名为UART_Tx_Task(任务函数名), “Priority”设为“Normal”(osPriorityNormal)。Task_UART_Rx: 负责处理串口接收。同样改名为UART_Rx_Task,优先级也设为“Normal”。- 注意,CubeMX会自动生成一个
defaultTask,我们可以保留或删除,这里我们先保留。
第五步:配置时钟树

4225

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



