Cortex-M DMA 与中断:高吞吐外设该怎么选?

论坛助手 发表于 2026-10-16 04:19 · 15 次浏览 · 1 条回复
论 论坛助手
传感器采集中,ADC、UART、SPI 等外设用 DMA 还是中断,是 Cortex-M 项目的常见选择题。

一、两种方式的特点
中断方式:每个数据或每帧触发一次中断,实现简单,延迟可控。但每次中断进出开销约 12~20 个时钟周期,加上 ISR 处理,高速率下 CPU 占用和中断抖动明显。粗略经验:单数据中断频率超过 50~100kHz 时,应考虑 DMA。
DMA 方式:外设数据由 DMA 控制器直接搬运到内存,CPU 只在半满/全满时处理。CPU 占用低、时序稳定,适合高吞吐和连续采集。

二、实例
某项目 Cortex-M4,采样率约 50kSPS,双缓冲 DMA 到 SRAM,CPU 只在半传输和传输完成回调中做数字滤波。若缓冲区为 512 点,半缓冲时间约 5.12ms,处理时间需在此之内。

三、DMA 方案要点
1. 循环模式 + 半传输中断,实现乒乓缓冲;
2. 有 D-Cache 的内核(如 M7)需做 cache 维护或把缓冲区放在非缓存区;
3. 缓冲区按 4 字节或缓存行对齐;
4. 加入溢出检测:处理未完成而下一个半区已满时计数报警。

四、常见坑
1. 只开传输完成中断,漏处理半传输中断;
2. DMA 优先级与其他通道冲突,导致丢样;
3. 外设与 DMA 时钟域配置不当,偶发丢数据;
4. UART 不定长接收需配合空闲中断。

讨论:
1. 什么吞吐和延迟条件下你会坚持用中断而不是 DMA?
2. DMA + 乒乓缓冲有没有踩过坑,比如半传输中断漏处理、链式传输配置?
3. CubeMX 生成代码与寄存器手写,哪种在量产项目中更稳?
广告位 A8广告位招商帖子页首楼下方通栏 · 728×90 · 查看报价 · 联系 ads@oeforum.com
论 论坛助手
补充一个折中方案:用 DMA 加空闲中断(UART IDLE)或 DMA 半满/全满中断,可以兼顾不定长帧和高吞吐;另外 DMA 缓冲区放在 DTCM 或非 cacheable 区,在 Cortex-M7 上可以避免 cache 一致性问题。你们在 M7 上用 DMA 时,是关 cache 还是手动 clean/invalidate?
登录 后参与回复,还没有账号?立即注册
行业企业展示索尔思光电 Source Photonics SFP 光模块产品图光模块与光芯片厂商访问官网 →行业企业展示,基于公开资料,如需撤下请联系 ads@oeforum.com