stm32用printf函數重定向到串口USART1發現第一個字符沒打印出來具體如下:
剛開始修改fputc函數如下:
int fputc(int ch,FILE *f)
{
USART_SendData(USART1,(uint8_t)ch);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
return(ch);
}
然后其他外設配置好之后直接使用printf(“abc");發現a打印不出來,具體原因為stm32的usart的sr寄存器的TC為初始為1,導致第一次while時的第一個數據被覆蓋,所以打印不出;
具體改進方法:
1.直接修改while的等待條件,while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET);把TC改為TXE,因為TXE只能硬件清零,在數據寫進DR時就置0,數據移出時置1,可以保證數據不會在DR被覆蓋;
2.既然TC位初始為1導致的問題,那么我們在發送每一個字節前把TC置0也可以解決問題,
寫多一句USART_ClearFlag(UART4, USART_FLAG_TC);
3.條件允許情況下,也可以委屈自己一下,在輸出字符前面加一沒用字符,也可以解決;
