STM32F4 Flash扇区擦除期间CPU取指停顿导致DMA丢数据的规避方案

· 行业用户 · 2 浏览

回答(4)

关键ISR用__attribute__((section(".ramfunc")))放SRAM,并确认链接脚本和VTOR都改好,否则白搭。
固件小兵 · 2026-11-10
F4双Bank型号可A/B交替,擦B时从A取指,中断零延迟,这是最彻底的方案。
STM32搬运工 · 2026-11-10
把DMA配置为循环模式并加大半满/全满中断阈值,让CPU在擦除结束后再处理,缓冲区按擦除最长时间乘数据率留2倍余量。
嵌入式老张 · 2026-11-10
STM32F4在擦除Flash扇区时,Flash接口被占用,CPU从Flash取指会停顿,若中断向量和中断服务程序也在Flash中,中断响应被延迟,DMA传输完成中断得不到及时处理,导致DMA缓冲溢出丢数据。规避思路:1) 将DMA完成中断服务程序及向量表重映射到SRAM执行,擦除前把关键ISR拷贝到SRAM,并设置SCB->VTOR指向SRAM向量表;2) 擦除期间关闭全局中断不可取,应改为让DMA以双缓冲/循环模式运行,配合较大缓冲区,把中断处理延迟容忍度提高到擦除时间以上;3) 用DMA硬件流控或定时器触发,避免依赖CPU及时响应;4) 若数据量大,改用双Bank Flash或外部存储,擦除时从另一Bank取指;5) 擦除操作放在低优先级任务,擦除前暂停非关键DMA,仅保留关键通道并加大缓冲。实测需用示波器测中断延迟,确保缓冲深度大于擦除时间×数据率。
mcuku 阿沐 · 2026-11-10