1. 串口接收不定长数据的痛点与解决方案
在实际的嵌入式开发中,串口通信是最常用的外设之一,但处理不定长数据一直是个让人头疼的问题。传统的接收中断方式每个字节都会触发一次中断,当数据量大时频繁中断会严重影响系统性能。而DMA虽然能减轻CPU负担,但通常需要预先知道数据长度,对于不定长数据就显得力不从心。
我之前在做智能家居项目时就遇到过这个问题:需要从多个传感器节点接收不同长度的状态数据,每个节点的数据包长度都不固定。最初使用接收中断方式,结果发现系统大部分时间都在处理串口中断,其他任务根本得不到执行。后来改用DMA+超时判断,虽然好了一些,但超时时间设置成了难题——设太短容易误判,设太长又影响实时性。
直到发现了空闲中断这个神器,配合DMA使用,完美解决了不定长数据接收的问题。空闲中断的工作原理很简单:当串口检测到总线空闲(即一段时间没有新数据到达)时,就会触发中断。这个"一段时间"在STM32中是固定的一字节传输时间,由硬件自动检测,比软件超时判断更加精准可靠。
2. CubeMX配置步骤详解
使用STM32CubeMX配置串口空闲中断和DMA接收真的很方便,我习惯称之为"可视化编程"。打开CubeMX后,首先选择你的STM32型号,我这里以STM32F103C8T6为例,这个芯片是支持空闲中断的。
在Pinout & Configuration页面找到USART1,将Mode设置为Asynchronous(异步通信),波特率根据实际需要设置,常用的是115200。数据长度选8 bits,无校验位,1位停止位。这些参数要和你的通信对方保持一致,不然就像两个人说不同语言,根本无法沟通。
关键步骤来了:在NVIC Settings中使能USART1全局中断。这个千万不能忘记,我有次调试了半天才发现中断没打开,白白浪费了好几个小时。然后在DMA Settings中添加DMA请求,点击Add,选择USART1_RX,方向设置为Peripheral To Memory。
DMA的模式要选Circular(循环模式),这样接收完一包数据后会自动准备接收下一包,不需要手动重启。数据宽度都是Byte,优先级可以根据系统需求设置。我


1907

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



