STM32 HAL库串口空闲中断+DMA接收不定长数据实战解析

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,因为串口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值