🤣
在最近的项目开发过程中,我遇到了不少之前没见过的问题,而这些问题仿佛都有一些精妙的解决方案,好记性不如烂笔头,所以也就有了这篇小记

⚡ STM32 DMA RingBuffer 空闲中断 串口

在STM32的高效串口通信实现中,DMA、环形缓冲区(Ring Buffer)与串口空闲中断这三者的结合,构成了一个经典且高性能的解决方案。起初,将这些技术点关联起来似乎有些复杂,但在实际项目开发中,追求极致效率往往绕不开这套组合。本文将解析其协同工作的原理。
实现这一高效通信机制前,首先需构建一个环形缓冲区作为应用层的核心数据枢纽。该缓冲区开辟固定大小的内存空间,用于临时存储数据,从而实现上层应用与底层DMA硬件之间的解耦。应用程序只需面向此缓冲区进行读写,无需直接操作DMA或串口外设的寄存器。
 
notion image
串口数据接收流程如下:
  1. 配置 DMA 为连续接收模式,将串口接收到的数据自动搬运至 DMA 接收缓冲区
  1. 使能串口的空闲中断(Idle Interrupt。当 UART 总线在一段时间内未检测到新数据时,即判定一次传输结束,并触发此中断。
  1. 在空闲中断服务函数中,系统将DMA缓冲区中累积的此次数据包,整块转移接收环形缓冲区中。
  1. 上层应用从此环形缓冲区中按需读取数据,整个过程非阻塞且高效。
 
串口数据发送流程则对称相反:
  1. 上层应用将待发送的数据写入发送环形缓冲区
  1. 串口驱动负责从该缓冲区取出数据,并启动 DMA 传输,将数据自动发送至串口外设。
  1. 通过 DMA 传输完成中断,可及时通知驱动层继续发送下一段数据,从而维持发送流程的连贯性。
此架构将 CPU 从繁重的字节搬运工作中解放出来,极大地提升了系统实时性与吞吐量。

🍾 ADC 注入采集与同步采集

在 ADC 应用中,规则采集是最常见的模式—— ADC 按照预设的周期稳定地对指定通道进行采样。然而,当面对 PWM波形测量、突发电压捕获等需要精确时机的场景时,这种常规模式就显得力不从心。此时, ADC 注入采集同步采集便成为了解决问题的关键。

注入采集:捕捉瞬态信号的“快照”模式

想象一下,您需要测量一个 PWM 波形的电压,但PWM的上升沿和下降沿时刻并不固定。若使用规则采集,可能会错过关键的电平变化点。注入采集就如同一个随时待命的“快门”,能在外部事件触发瞬间立刻启动采样,精准捕捉瞬态信号。
在项目中,我们将 ADC 的触发源绑定至产生 PWM 的定时器特定事件(如定时器的更新、捕获/比较事件)。一旦该事件发生,ADC 便会立即中断当前常规采集序列,优先执行一次(或一组)注入通道的采样,随后自动返回原序列。这确保了采样点与 PWM 边沿的严格同步。
⚠️

配置要点

  • 触发事件选择:并非所有定时器通道都支持所有事件类型。需查阅参考手册,确认定时器可输出的触发源(如TRGO、OCxREF等)与ADC触发输入(如EXTI线、定时器TRGO)的对应关系。
  • 采样时间窗口:注入采集的采样时间(单位为ADC时钟周期Cycles)必须覆盖被测电压的稳定持续时间。对于PWM测量,应确保采样窗口位于电平平台区内,避开边沿过渡区。
  • 采样次数可调:注入序列可配置多个通道并按序转换,亦可对同一通道连续采样多次(过采样),以提高信噪比或捕获波形细节。

同步采集:多ADC的同步魔法

当项目需要同时捕获多个相关信号(如三相电流、电机驱动器的多路反馈)时,同步采集便大显身手。该特性允许将多个ADC模块(如STM32中的ADC1、ADC2、ADC3)组合起来,在同一触发信号下同时启动转换,实现纳秒级的时间对齐。
notion image

工作模式

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

配置注意事项

  • 时钟同步:参与同步的ADC须使用相同的时钟源,且最好位于同一时钟域,以最小化触发延迟偏差。
  • 触发源共享:确保触发信号(如定时器事件)能同时(或按预设偏移)送达所有ADC的触发输入。
  • 数据对齐:同步采集的数据在读取时需注意各ADC数据寄存器的对齐方式,通常可通过DMA配合双缓冲模式实现高效搬运。
notion image

🤗 总结归纳

学海无涯,感谢互联网的分享者与 AI 的鼎力相助。
无法在其他模块调用 PyQt 的组件问题定位与解决而立,未立
Loading...