新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32的串口函數_庫函數

        STM32的串口函數_庫函數

        作者: 時間:2016-11-28 來源:網絡 收藏

        轉載正文2

        stm32 串口發送數據第一字節丟失

        使用stm32f10x調試串口通訊時,發現一個出錯的現象,硬件復位重啟之后,發送測試數據0x01 0x02 0x03 0x04..接收端收到的數據為:0x02 0x03 0x04,第一個數據丟失。

        查閱stm32f10x參考手冊,找到這樣一句話:
        TC:發送完成
        當包含有數據的一幀發送完成后,由硬件將該位置位。如果USART_CR1中的TCIE為1,則產生中斷。由軟件序列清除該位(先讀USART_SR,然后寫入USART_DR)。TC位也可以通過寫入0來清除,只有在多緩存通訊中才推薦這種清除程序。
        0:發送還未完成;
        1:發送完成。
        注意到這一句:由軟件序列清除該位(先讀USART_SR,然后寫入USART_DR)。 也就是說,要先read USART_SR,然后write USART_DR,才能完成TC狀態位的清除。而硬件復位后,串口發送的首個數據之前沒有read SR的操作,是直接write DR,也就是說,TC沒有被清除掉。

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

        轉載正文3

        stm32串口第一字節丟失問題分析

        STM32串口發送必須先檢測狀態,否則第一個字節無法發出,發送完畢,必須檢測發送狀態是否完成,否則,發送不成功,

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

        故障排除過程:

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

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

        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)。也就是說,要先readUSART_SR,然后writeUSART_DR,才能完成TC狀態位的清除。而硬件復位后,串口發送的首個數據之前沒有readSR的操作,是直接writeDR,也就是說,TC沒有被清除掉。說明第4步的猜測是對的。

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

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



        上一頁 1 2 3 下一頁

        關鍵詞: STM32串口函數庫函

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 佛学| 延安市| 若羌县| 巴林右旗| 威远县| 高台县| 梅河口市| 阜康市| 手游| 安龙县| 长宁县| 兴和县| 余姚市| 秭归县| 星子县| 瑞昌市| 图们市| 武汉市| 浠水县| 海安县| 无极县| 玛曲县| 惠来县| 八宿县| 海丰县| 公主岭市| 昌吉市| 清新县| 呼图壁县| 隆昌县| 襄汾县| 大理市| 湘潭县| 仲巴县| 宁德市| 蒙阴县| 云龙县| 临沧市| 岚皋县| 苗栗市| 江华|