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導致的問題,那麼我們在使用printf函數前把TC置0也可以解決問題,
寫多一句USART1->SR&=~(1<<6);
3.條件允許情況下,也可以委屈自己一下,在輸出字符前面加一沒用字符,也可以解決;