1. 什么是DMA与串口空闲中断
如果你正在用STM32做串口通信,特别是需要处理不定长数据帧的场景,肯定遇到过这样的烦恼:要么频繁进入接收中断影响效率,要么得手动判断数据包结束标志特别麻烦。其实STM32早就为我们准备好了硬件级的解决方案——DMA加上串口空闲中断(IDLE)的黄金组合。
DMA(直接存储器访问)就像是芯片内部的一个"快递小哥",能在不打扰CPU的情况下,自动在外设和内存之间搬运数据。比如串口接收到数据时,DMA会自动把数据从串口数据寄存器"搬"到你指定的内存缓冲区,完全不需要CPU参与。
而串口空闲中断则是个聪明的"信号灯"。当串口线上超过一个字节时间的空闲状态时(具体时间取决于波特率),就会触发这个中断。这意味着什么?意味着你可以准确知道一帧数据什么时候接收完毕,特别适合处理不定长数据包。
我刚开始做物联网设备时,总是用传统的接收中断方式,每来一个字节就中断一次,结果发现CPU大部分时间都在处理中断,真正有用的业务逻辑反而没时间跑。后来改用DMA+空闲中断的方案,CPU占用率直接从70%降到不到10%,效果立竿见影。
2. CubeMX环境配置详解
现在咱们来看看如何在CubeMX中配置这个功能。我用的是STM32F407系列,其他型号的配置也大同小异。
打开CubeMX后,首先在Pinout & Configuration页面找到USART模块。选择你要使用的串口,我这里用USART1作为例子。将Mode设置为Asynchronous(异步模式),波特率根据实际需要设置,常用的是115200。数据位8位,停止位1位,无校验位。
关键步骤来了:在DMA Settings标签页中,点击Add添加DMA通道。对于接收方向,选择USART1_RX,方向是Peripheral To Memory(外设到内存)。优先级可以设为Medium,模式一定要选择Circular(循环模式),这样DMA会持续接收数据而不需要手动重启。
内存地址自增要开启(Increment Memory Address),因为我们要把数据存放到数组中。外设地址不自增,因为始终是从USART->DR寄存器读取数据


4955

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



