STM32H743跑RTOS一开DMA串口就死机,快被搞疯了

STM32 · 马超 · 9 浏览
板子是自己画的,STM32H743VIT6,RTOS用的FreeRTOS,串口DMA空闲中断收数据。现象是:只要DMA一开,跑几分钟必死,HardFault。死了大概七八次了,每次位置还不完全一样,有时候在中断里,有时候在任务切换那。已经排查过的:栈加大到0x2000了,中断优先级全按手册调过(DMA和USART的抢占优先级都设成5,没敢跟configMAX_SYSCALL_INTERRUPT_PRIORITY冲突),Cache也关了D-Cache。MPU还没动。示波器看波形没问题,电源也稳。 现在产线小批量试产卡在这,50块板子全这毛病,老板天天问。有没有老哥遇到过H7的DMA+RTOS这种玄学死机?是不是MPU配置那块没配对导致DMA访问了不可缓存区?还是我漏了哪个__DSB或者内存屏障?直接看手册我翻了好几遍了,头大。求个方向,救救孩子。

回答(1)

兄弟先别急,H7跑DMA+RTOS死机太常见了。你Cache关了但MPU没动,H7的默认MPU配置把DMA缓冲区所在区域设成Normal non-shareable,DMA写进去CPU可能读到旧数据,数据一乱指针就跑飞了。建议把DMA缓冲区放到DTCM(0x20000000),或者在MPU里把这块配成Device/Strongly ordered内存。第二个排查点:确认DMA传输完成中断里别调用带阻塞的FreeRTOS API,FromISR版本才行;还有H7的DMA和USART要用同一个DMAMUX请求通道,别配串了。第三个点:HardFault时抓LR和PC寄存器,用调试器看CFSR寄存器,是IMPRECISERR还是PRECISERR,能直接定位到非法访问的地址。新手先跑通再优化,先把缓冲区挪到DTCM试一版,大概率就好了。
田甜 · 2026-11-07