在最近的项目开发过程中,我遇到了不少之前没见过的问题,而这些问题仿佛都有一些精妙的解决方案,好记性不如烂笔头,所以也就有了这篇小记
⚡ STM32 DMA RingBuffer 空闲中断 串口
在STM32的高效串口通信实现中,DMA、环形缓冲区(
Ring Buffer)与串口空闲中断这三者的结合,构成了一个经典且高性能的解决方案。起初,将这些技术点关联起来似乎有些复杂,但在实际项目开发中,追求极致效率往往绕不开这套组合。本文将解析其协同工作的原理。实现这一高效通信机制前,首先需构建一个环形缓冲区作为应用层的核心数据枢纽。该缓冲区开辟固定大小的内存空间,用于临时存储数据,从而实现上层应用与底层DMA硬件之间的解耦。应用程序只需面向此缓冲区进行读写,无需直接操作DMA或串口外设的寄存器。

串口数据接收流程如下:
- 配置 DMA 为连续接收模式,将串口接收到的数据自动搬运至 DMA 接收缓冲区。
- 使能串口的空闲中断(
Idle Interrupt)。当 UART 总线在一段时间内未检测到新数据时,即判定一次传输结束,并触发此中断。
- 在空闲中断服务函数中,系统将DMA缓冲区中累积的此次数据包,整块转移至接收环形缓冲区中。
- 上层应用从此环形缓冲区中按需读取数据,整个过程非阻塞且高效。
串口数据发送流程则对称相反:
- 上层应用将待发送的数据写入发送环形缓冲区。
- 串口驱动负责从该缓冲区取出数据,并启动 DMA 传输,将数据自动发送至串口外设。
- 通过 DMA 传输完成中断,可及时通知驱动层继续发送下一段数据,从而维持发送流程的连贯性。
此架构将 CPU 从繁重的字节搬运工作中解放出来,极大地提升了系统实时性与吞吐量。
🍾 ADC 注入采集与同步采集
在 ADC 应用中,规则采集是最常见的模式—— ADC 按照预设的周期稳定地对指定通道进行采样。然而,当面对 PWM波形测量、突发电压捕获等需要精确时机的场景时,这种常规模式就显得力不从心。此时, ADC 注入采集与同步采集便成为了解决问题的关键。
注入采集:捕捉瞬态信号的“快照”模式
想象一下,您需要测量一个 PWM 波形的电压,但PWM的上升沿和下降沿时刻并不固定。若使用规则采集,可能会错过关键的电平变化点。注入采集就如同一个随时待命的“快门”,能在外部事件触发瞬间立刻启动采样,精准捕捉瞬态信号。
在项目中,我们将 ADC 的触发源绑定至产生 PWM 的定时器特定事件(如定时器的更新、捕获/比较事件)。一旦该事件发生,ADC 便会立即中断当前常规采集序列,优先执行一次(或一组)注入通道的采样,随后自动返回原序列。这确保了采样点与 PWM 边沿的严格同步。
同步采集:多ADC的同步魔法
当项目需要同时捕获多个相关信号(如三相电流、电机驱动器的多路反馈)时,同步采集便大显身手。该特性允许将多个ADC模块(如STM32中的ADC1、ADC2、ADC3)组合起来,在同一触发信号下同时启动转换,实现纳秒级的时间对齐。

工作模式
- 并联同步:多个ADC同时采样同一时刻的不同通道,确保多路信号间无相位差。适用于需要严格时间关联的测量(如功率计算)。
- 交叉同步:主ADC接收触发后,自动触发从ADC的采样序列,形成流水线式采集,可提高整体采样率。

🤗 总结归纳
学海无涯,感谢互联网的分享者与 AI 的鼎力相助。
- 作者:FrankyGuo
- 链接:https://www.frankysnotionblog.top/article/%E5%BC%80%E5%8F%91%E5%B0%8F%E8%AE%B0
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章

