<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > STM32的串口函數(shù)_庫函數(shù)

          STM32的串口函數(shù)_庫函數(shù)

          作者: 時間:2016-11-28 來源:網(wǎng)絡(luò) 收藏

          轉(zhuǎn)載正文2

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

          使用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ā)送完成
          當(dāng)包含有數(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)覆蓋的情況。當(dāng)然,也有別的方法,比如先清除TC狀態(tài)位,USART_ClearFlag(USART1, USART_FLAG_TC);或USART1->SR&=~(1<<7);

          轉(zhuǎn)載正文3

          stm32串口第一字節(jié)丟失問題分析

          STM32串口發(fā)送必須先檢測狀態(tài),否則第一個字節(jié)無法發(fā)出,發(fā)送完畢,必須檢測發(fā)送狀態(tài)是否完成,否則,發(fā)送不成功,

          使用stm32f10x調(diào)試串口通訊時,發(fā)現(xiàn)一個出錯的現(xiàn)象,硬件復(fù)位重啟之后,發(fā)送測試數(shù)據(jù)0x010x020x030x04..接收端收到的數(shù)據(jù)為:0x020x030x04,第一個數(shù)據(jù)丟失。換成發(fā)送別的數(shù)值的數(shù)據(jù),如0x060x0ff,則接收到0x0ff,0x06丟失。錯誤依舊。

          故障排除過程:

          1、剛開始懷疑是接收端的錯誤,我是使用電腦串口,運行串口輔助調(diào)試工具接收,換成其他軟件后,發(fā)現(xiàn)故障依舊,而且電腦軟件一直是開啟狀態(tài),不像和電腦軟件有關(guān)。

          2、使用單步調(diào)試,單步運行各個發(fā)送指令,都正常。能收到0x010x020x030x04的數(shù)據(jù)。間接的排除了不是電腦軟件的問題,而是其他的錯誤。

          3、單步調(diào)試運行雖然正常了,但連續(xù)運行時,錯誤依舊?,F(xiàn)在有點摸不到頭緒了,單步運行正常,看起來編程沒有出錯,那故障在哪里呢?測試程序如下

          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、猜測,也許是因為某個特殊原因,使第二個數(shù)據(jù)覆蓋了首個數(shù)據(jù),使得首個數(shù)據(jù)丟失。假設(shè):在執(zhí)行B指令時,USART的TC狀態(tài)位==SET,那么就會緊接著執(zhí)行C指令,也就有可能發(fā)生數(shù)據(jù)的覆蓋。于是,在A指令前,加入如下指令:USART_ClearFlag(USART2,USART_FLAG_TC);

          5、加入上一條指令后,運行,錯誤消失了。說明上一個假設(shè),應(yīng)該是成立的。

          6、查閱stm32f10x參考手冊,找到這樣一句話:TC:發(fā)送完成

          當(dāng)包含有數(shù)據(jù)的一幀發(fā)送完成后,由硬件將該位置位。如果USART_CR1中的TCIE為1,則產(chǎn)生中斷。由軟件序列清除該位(先讀USART_SR,然后寫入USART_DR)。TC位也可以通過寫入0來清除,只有在多緩存通訊中才推薦這種清除程序。0:發(fā)送還未完成;1:發(fā)送完成。

          7、注意到這一句:由軟件序列清除該位(先讀USART_SR,然后寫入USART_DR)。也就是說,要先readUSART_SR,然后writeUSART_DR,才能完成TC狀態(tài)位的清除。而硬件復(fù)位后,串口發(fā)送的首個數(shù)據(jù)之前沒有readSR的操作,是直接writeDR,也就是說,TC沒有被清除掉。說明第4步的猜測是對的。

          8、那么,應(yīng)該把指令A(yù)前面加的USART_ClearFlag(USART2,USART_FLAG_TC);改為USART_GetFlagStatus(USART2,USART_FLAG_TC);,應(yīng)該也能消除錯誤。測試后證實,確實如此,在發(fā)送首個數(shù)據(jù)之前,先讀取一下USART_SR,那么就不會出現(xiàn)首個數(shù)據(jù)丟失的情況了。

          9、總結(jié):硬件復(fù)位后,串口發(fā)送首個數(shù)據(jù)之前,先讀取一下USART_SR,則能夠保證首個數(shù)據(jù)發(fā)送時,不出現(xiàn)覆蓋的情況。當(dāng)然,也有別的方法,比如先清除TC狀態(tài)位,或是,在writeUSART_DR之后,加入一個小延時,讓數(shù)據(jù)發(fā)送完畢,應(yīng)該也能間接排除這個錯誤。



          上一頁 1 2 3 下一頁

          關(guān)鍵詞: STM32串口函數(shù)庫函

          評論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();