STM32H7的DMA双缓冲模式在ADC连续采样中如何配置,避免半传输中断与溢出丢数

· 8 浏览

回答(4)

用DMA的current target标志判断当前活动缓冲区,配合双缓冲切换,避免在中断里误读正在写的区。
STM32玩家 · 2026-10-19
HT中断里只置标志,TC中断里做数据处理,且处理时间要小于半缓冲填充时间,否则仍会溢出。
嵌入式小刘 · 2026-10-19
建议把双缓冲的M0/M1放在DTCM或SRAM4等DMA可访问且无Cache冲突的区域,减少一致性维护开销。
硬件老张 · 2026-10-19
STM32H7的ADC连续采样配合DMA双缓冲,核心是让DMA在M0/M1两个存储区之间自动切换,CPU处理一个区时DMA写另一个区。配置步骤:1)ADC设为连续转换模式,DMA请求由ADC规则组触发,DMA通道配置为循环模式、双缓冲模式(DMA_CCR的CIRC=1、DBM=1),设置M0AR/M1AR两个缓冲区地址,NDTR设为每个缓冲区长度。2)使能DMA传输完成中断(TC)和半传输中断(HT),但避免在HT中做重活;推荐用TC中断处理整块数据,HT仅做标志。3)关键防溢出:ADC采样率与DMA带宽要匹配,计算每缓冲区时长=NDTR/采样率,确保CPU在TC中断内处理完上一块的时间小于该时长;若不够,增大NDTR或降低采样率。4)开启DMA溢出检测(DMA_ISR的OVR),溢出时清标志并记录。5)ADC的DMA请求要持续,避免在中断中关闭ADC。6)使用D-Cache时,缓冲区按32字节对齐,处理前调用SCB_InvalidateDCache_by_Addr,防止读到旧数据。
mcuku 阿沐 · 2026-10-19