新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > stm32 串口發(fā)送數(shù)據(jù)第一字節(jié)丟失

stm32 串口發(fā)送數(shù)據(jù)第一字節(jié)丟失

作者: 時間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
使用stm32f10x調(diào)試串口通訊時,發(fā)現(xiàn)一個出錯的現(xiàn)象,硬件復(fù)位重啟之后,發(fā)送測試數(shù)據(jù)0x01 0x02 0x03 0x04..接收端收到的數(shù)據(jù)為:0x02 0x03 0x04,第一個數(shù)據(jù)丟失。
查閱stm32f10x參考手冊,找到這樣一句話:
TC:發(fā)送完成
當包含有數(shù)據(jù)的一幀發(fā)送完成后,由硬件將該位置位。如果USART_CR1中的TCIE為1,則產(chǎn)生中斷。由軟件序列清除該位(先讀USART_SR,然后寫入USART_DR)。TC位也可以通過寫入0來清除,只有在多緩存通訊中才推薦這種清除程序。
0:發(fā)送還未完成;
1:發(fā)送完成。
注意到這一句:由軟件序列清除該位(先讀USART_SR,然后寫入USART_DR)。 也就是說,要先read USART_SR,然后write USART_DR,才能完成TC狀態(tài)位的清除。而硬件復(fù)位后,串口發(fā)送的首個數(shù)據(jù)之前沒有read SR的操作,是直接write DR,也就是說,TC沒有被清除掉。


硬件復(fù)位后,串口發(fā)送首個數(shù)據(jù)之前,先讀取一下USART_SR,則能夠保證首個數(shù)據(jù)發(fā)送時,不出現(xiàn)覆蓋的情況。當然,也有別的方法,比如先清除TC狀態(tài)位,USART_ClearFlag(USART1, USART_FLAG_TC);或USART1->SR&=~(1<<7);


評論


技術(shù)專區(qū)

關(guān)閉