场景:
串口1串口3加入DMA后将重定向至串口1的printf重定向到串口3
问题描述
重定向是串口1时,程序正常,将打印重定向至串口3后,启动程序,单片机直接卡死,仿真调试时会卡死fputc中,USART->SR寄存器一直为0
int fputc(int ch, FILE *f)
{
while((USART3->SR & 0X40) == 0); //卡死在这
USART3->DR = (u8) ch;
return ch;
}
原因分析:
最开始分析是串口3的DMA没有配置好,查阅相关类似问题有串口的时钟树配置错误。
解决方案:
1.DMA配置检查,在不重定向打印时直接使用USART_SendData(USART3,0x03)
来查看串口信息打印,是正常的,DMA配置正确。
2.时钟树检查也是正确的。
3.最后的检查是在串口初始化之前执行了打印,导致程序卡死了。情况类似于原因里面的第二种,排查浪费了一些不必要的时间