久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

STM32 串口 首字節和尾字節少

作者:黃賓山   來源:本站原創   點擊數:  更新時間:2014年03月03日   【字體:

STM32 串口 發送 必須 先檢測 狀態,否則 第一個 字節 無法 發出,發送完畢,必須檢測發送狀態是否完成,否則,發送不成功,
使用stm32f10x調試串口通訊時,發現一個出錯的現象,硬件復位重啟之后,發送測試數據0x01 0x02 0x03 0x04..接收端收到的數據為:0x02 0x03 0x04,第一個數據丟失。換成發送別的數值的數據,如0x06 0x0ff,則接收到0x0ff,0x06丟失。錯誤依舊。
    故障排除過程:
    1、剛開始懷疑是接收端的錯誤,我是使用電腦串口,運行串口輔助調試工具接收,換成其他軟件后,發現故障依舊,而且電腦軟件一直是開啟狀態,不像和電腦軟件有關。
    2、使用單步調試,單步運行各個發送指令,都正常。能收到0x01 0x02 0x03 0x04的數據。間接的排除了不是電腦軟件的問題,而是其他的錯誤。
    3、單步調試運行雖然正常了,但連續運行時,錯誤依舊。現在有點摸不到頭緒了,單步運行正常,看起來編程沒有出錯,那故障在哪里呢?測試程序如下
   USART_SendData(USART2, 0x01);                                 //A
   while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);   //B
   USART_SendData(USART2, 0x02);                                 //C
   while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
   USART_SendData(USART2, 0x03);
   while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
   USART_SendData(USART2, 0x04);
   while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
    4、猜測,也許是因為某個特殊原因,使第二個數據覆蓋了首個數據,使得首個數據丟失。假設:在執行B指令時,USART的 TC 狀態位==SET,那么就會緊接著執行C指令,也就有可能發生數據的覆蓋。于是,在A指令前,加入如下指令:
   USART_ClearFlag(USART2,USART_FLAG_TC);
    5、加入上一條指令后,運行,錯誤消失了。說明上一個假設,應該是成立的。
    6、查閱stm32f10x參考手冊,找到這樣一句話:
TC:發送完成
當包含有數據的一幀發送完成后,由硬件將該位置位。如果USART_CR1中的TCIE為1,則產生中斷。由軟件序列清除該位(先讀USART_SR,然后寫入USART_DR)。TC位也可以通過寫入0來清除,只有在多緩存通訊中才推薦這種清除程序。
0:發送還未完成;
1:發送完成。
    7、注意到這一句:由軟件序列清除該位(先讀USART_SR,然后寫入USART_DR)。 也就是說,要先read USART_SR,然后write USART_DR,才能完成TC狀態位的清除。而硬件復位后,串口發送的首個數據之前沒有read SR的操作,是直接write DR,也就是說,TC沒有被清除掉。 說明第4步的猜測是對的。
    8、那么,應該把指令A前面加的USART_ClearFlag(USART2,USART_FLAG_TC); 改為USART_GetFlagStatus(USART2, USART_FLAG_TC);,應該也能消除錯誤。測試后證實,確實如此,在發送首個數據之前,先讀取一下USART_SR,那么就不會出現首個數據丟失的情況了。
    9、總結:硬件復位后,串口發送首個數據之前,先讀取一下USART_SR,則能夠保證首個數據發送時,不出現覆蓋的情況。當然,也有別的方法,比如先清除TC狀態位,或是,在write USART_DR之后,加入一個小延時,讓數據發送完畢,應該也能間接排除這個錯誤。
 

STM32的USART發送數據時如何使用TXE和TC標志

在USART的發送端有2個寄存器,一個是程序可以看到的USART_DR寄存器(下圖中陰影部分的TDR),另一個是程序看不到的移位寄存器(下圖中陰影部分Transmit Shift Register)。

對應USART數據發送有兩個標志,一個是TXE=發送數據寄存器空,另一個是TC=發送結束;對照下圖,當TDR中的數據傳送到移位寄存器后,TXE被設置,此時移位寄存器開始向TX信號線按位傳輸數據,但因為TDR已經變空,程序可以把下一個要發送的字節(操作USART_DR)寫入TDR中,而不必等到移位寄存器中所有位發送結束,所有位發送結束時(送出停止位后)硬件會設置TC標志。

另一方面,在剛剛初始化好USART還沒有發送任何數據時,也會有TXE標志,因為這時發送數據寄存器是空的。

TXEIE和TCIE的意義很簡單,TXEIE允許在TXE標志為'1'時產生中斷,而TCIE允許在TC標志為'1'時產生中斷。

至于什么時候使用哪個標志,需要根據你的需要自己決定。但我認為TXE允許程序有更充裕的時間填寫TDR寄存器,保證發送的數據流不間斷。TC可以讓程序知道發送結束的確切時間,有利于程序控制外部數據流的時序。

 

關閉窗口

相關文章

主站蜘蛛池模板: 国产一区二区三区色淫影院 | 日韩羞羞 | 亚洲精品无 | 最新高清无码专区 | 精品av | 精品免费观看 | 午夜影视大全 | 日韩在线播放一区 | 91在线观看免费视频 | 国产成人精品一区二区 | 欧美日韩视频在线 | 羞羞的视频免费在线观看 | 亚洲精品国产精品国自产在线 | 国产高清视频在线观看 | 天天操天天射综合网 | 国产精品国产三级国产aⅴ中文 | 亚洲欧美国产一区二区三区 | 精品无码久久久久国产 | 久久精品一二三影院 | 黄色片在线免费看 | 欧美一区中文字幕 | 久久久亚洲综合 | 在线播放第一页 | 日韩一区二区不卡 | 免费在线国产视频 | 在线日韩欧美 | 欧洲视频一区二区 | 五月激情六月婷婷 | 91精品国产综合久久久久久漫画 | 在线看片网站 | 久久国产亚洲 | h视频在线免费 | 精品国产一区二区在线 | 2018天天干天天操 | 视频一区二区三区中文字幕 | 日韩三区在线 | 国产日韩精品一区二区 | 久久久久久免费看 | 欧美视频免费在线观看 | 99re在线播放 | 欧美在线一二三 |