1. 串口通信的痛点与解决方案
在实际的嵌入式开发中,串口通信是最常用的外设之一,但处理不定长数据一直是个让人头疼的问题。我之前做物联网网关项目时,就经常遇到设备上传的数据长度不固定,有时候是几个字节的心跳包,有时候是上百字节的传感器数据。
最开始的笨办法是用接收中断,每来一个字节就中断一次。结果数据量一大,CPU光处理中断就忙不过来了,还出现了数据丢失的情况。后来改用超时判断,虽然好了一些,但要手动设置超时时间,不同设备还得调整参数,维护起来特别麻烦。
直到发现了串口空闲中断这个神器,配合DMA使用,简直就是不定长数据接收的完美解决方案!空闲中断是硬件自动检测线路空闲状态,不需要软件做超时判断。DMA则负责在后台搬运数据,完全解放CPU。两者结合既能高效接收数据,又不会占用太多系统资源。
2. 硬件与软件环境准备
2.1 硬件清单
做这个实验其实不需要很复杂的设备,基础的STM32开发板就能搞定。我用的是一块STM32F103C8T6核心板,也就是常说的"蓝莓板",性价比高而且资源足够。其他还需要:
- ST-Link调试器:用于程序下载和调试
- USB转TTL模块:我用的是CH340芯片的,便宜又好用
- 杜邦线若干:连接串口和电源线
接线的时候要注意,STM32的TX接USB转TTL的RX,RX接TX,千万别接反了。我有次熬夜调试,就是因为线接反了,数据死活收不到,排查了半天才发现问题。
2.2 软件环境
软件方面需要准备STM32CubeMX和IDE开发环境。我习惯用Keil MDK,但用STM32CubeIDE或者IAR也一样。STM32CubeMX真是个好东西,图形化配置外设,自动生成初始化代码,省去了很多繁琐的寄存器配置工作。
安装完软件后,记得要安装对应的HAL库。现在最新版本是HAL库V1.10.0,但用稍早一点的稳定版本也没问题,兼容性都很好。
3. CubeMX配置详解
3.1 串口基本参数配置
打开CubeMX,先配置系统时钟树。STM32F103C8T6最高能跑到72MHz,我们设置成这个频率,让串口工作在最稳定状态。
接着配置USART1,选择异步通信模式。波特率设成115200,这是最常用的速率,兼容性最好。数据长度选8位,不设校验位,停止位用1位。这些参数要和你的串口助手设置一致,不然收到的就是乱码。
记得开启全局中断,优先级设成中等水平。我一般设成2或3,不要太低也不要太高,避免影响其他重要中断的响应。
3.2 DMA通道配置
DMA配置是关键步骤。在DMA Settings标签页添加新通道,选择USART1_RX。方向设为Peripheral To Memory,这样数据是从串口外设到内存。
模式要选Circular,这是循环模式,DMA会不停地接收数据,不会因为缓冲区满而停止。数据宽度都选Byte,因为串口


176

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



