板子是自己画的,STM32F103C8T6走USART2跟ESP32模组透传,115200,DMA空闲中断收,FreeRTOS里一个任务解析AT+透传数据。现象是跑一两天必挂,串口不再进空闲中断,任务还活着但收不到数,看寄存器USART2->SR的IDLE位再也不置1,DMA的CNDTR卡在某个值不动。复位ESP32没用,得复位STM32才行。已经试过:空闲中断里清SR再读DR,DMA重新使能,加了串口错误回调打印ORE/NE/FE,都没抓到。怀疑是ORE溢出把IDLE锁死了,但手册说清ORE要读SR再读DR,我顺序应该没错。现在产线小批量50台在老化,挂了两台,客户催得急。有没有兄弟遇到过F1系列DMA+IDLE这种坑?直接看手册最快但我翻了几遍RM0008没找到明确说法,求指点,在线等。
兄弟别慌,这个现象我教学时也遇到过。IDLE位不再置1、CNDTR卡死,大概率是DMA通道被意外关闭或流控卡住,不一定是ORE。建议重点查三点:一是在空闲中断里先关DMA再处理,重新配置CNDTR和CR前确保EN位确实清了,别只写使能位;二是透传任务里别有阻塞式发送,ESP32侧RTS/CTS若接了要确认流控没误触发;三是加个软件看门狗式检测:定时比对CNDTR,超过500ms不变就软复位USART2+DMA通道,产线先扛住。先跑通再优化,把这两台的死机现场用调试器挂上去看DMA_CCR的EN位,一抓就明白了。