stm32爲什麼用printf重定向到串口第一個字符打印不出

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.條件允許情況下,也可以委屈自己一下,在輸出字符前面加一沒用字符,也可以解決;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章