用 Cortex-M 做实时数据采集:中断和 DMA 的配合技巧

光通信老兵 发表于 2026-10-13 06:22 · 12 次浏览 · 2 条回复
光
在 Cortex-M 上做实时数据采集,中断与 DMA 的合理配合决定了系统能否稳定无丢点。

一、基本架构
1. 外设(ADC、SPI、UART)触发 DMA,数据直接搬运到 RAM,CPU 不参与逐字节搬运;
2. 采用双缓冲(乒乓)或循环模式加半传输中断:前一半填满时处理前一半,后一半填满时处理后一半;
3. 处理时间必须小于半个缓冲区的填充时间。例如 100kSPS、缓冲区 1024 点,半缓冲时间为 5.12ms,处理需在此之内完成并留余量。

二、中断优先级
1. Cortex-M 的 NVIC 优先级数值越小优先级越高;
2. DMA 完成中断优先级应高于通信与界面任务;
3. 使用 RTOS 时,调用 RTOS API 的中断优先级不能高于 configMAX_SYSCALL_INTERRUPT_PRIORITY;
4. ISR 内只做置标志、发通知,复杂处理放到任务中。

三、Cache 一致性(Cortex-M7 等带 D-Cache 的内核)
1. DMA 写入内存后,CPU 读取前需执行 SCB_InvalidateDCache_by_Addr;
2. CPU 写入后交给 DMA 发送前需执行 SCB_CleanDCache_by_Addr;
3. 缓冲区按 32 字节缓存行对齐,大小为 32 的整数倍;
4. 也可通过 MPU 把 DMA 缓冲区配置为非缓存区域。
忘记处理 cache 时,CPU 读到的是旧数据,这是 M7 平台上最常见的问题之一。

四、常见坑
1. 缓冲区放在 DTCM,而某些 DMA 无法访问 DTCM;
2. 半传输中断未使能,只处理了全传输中断;
3. 处理时间偶尔超时,数据被覆盖而不自知,建议加溢出检测计数。

讨论:
1. 你们在 Cortex-M7 上更常用 cache 维护函数还是 MPU 非缓存区?
2. 采集任务的实时性你们如何量化测试?
广告位 A8广告位招商帖子页首楼下方通栏 · 728×90 · 查看报价 · 联系 ads@oeforum.com
F
DAS 误报率的问题,我们的经验是做好多维度联合判断——振动 + 位置 + 时间模式,单独看振动幅值必然误报多。但算法调参确实要长期积累。
嵌
DTS 的温度分辨率比定位精度更影响实用性。标称 1℃ 的系统和 0.1℃ 的系统,泄漏检出能力完全不同,选型时要问清楚。
登录 后参与回复,还没有账号?立即注册
行业企业展示索尔思光电 Source Photonics SFP 光模块产品图光模块与光芯片厂商访问官网 →行业企业展示,基于公开资料,如需撤下请联系 ads@oeforum.com