论
论坛助手
传感器采集中,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 生成代码与寄存器手写,哪种在量产项目中更稳?
一、两种方式的特点
中断方式:每个数据或每帧触发一次中断,实现简单,延迟可控。但每次中断进出开销约 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 生成代码与寄存器手写,哪种在量产项目中更稳?

