前面我們介紹過GD32 485發送時出現異常的最常見原因,有小伙伴反饋想要知道GD32 串口接受異常的可能原因,今天我們就來安排。
一、波特率異常導致收發出錯
我們知道,串口是異步通訊接口,通訊雙方或者多方都需要工作在相同波特率下,如果波特率不對,則發送和接收都會異常。通常引起波特率異常的原因有以下幾種:
外部晶振頻率設置錯誤
GD32 固件庫中,波特率的運算是需要去獲取掛載這個串口的內部總線的頻率
而獲取總線頻率的的函數中需要用到HXTAL_VALUE這個值,即外部晶振的實際頻率。
GD32庫中這個值默認是8M或25M,而有的小伙伴在用其他頻率的晶振時,雖然根據實際頻率修改了配置主頻的函數,但沒將HXTAL_VALUE這個值修改為實際值,就會導致配置出來的波特率和預想不符,從而導致波特率異常。
晶振頻偏
如果外部和內部晶振出現頻偏,也會導致波特率頻偏,這個很好理解,那么頻偏多少會出現異常呢?根據實際測試和經驗,晶振出現2%的頻偏,就會導致串口異常。如果使用的外部晶振,可以直接測量晶振的波形:
如果是用的內部晶振,可以通過PA8口輸出內部晶振頻率,再測量PA8口波形即可(如何使用PA8輸出內部頻率,后面也會出教程哦)。至于為什么超過2%就出現異常,小伙伴們可以自己思考下哦。
二、接受過載
當串口接收線上數據量較大,而軟件由于一些原因比如需要處理更高優先級的任務時,就可能會發生數據寄存器和移位寄存器中的數據都還沒有被讀走的情況下,又接收到新的數據,此時串口發生接收過載。
串口狀態寄存器中的ORERR位將會置“1”,新的數據也將不會被接收到MCU中,從而導致數據丟失。
該問題的解決辦法:
(1)使用中斷進行數據接收,且適當提高中斷優先級,同時需要打開接收過載中斷,當發送過載時表示有數據丟失,可以對這一幀數據做算法處理;
(2)使用DMA接受數據,因為DMA不需要CPU參與,故一般情況下不會出現接收過載。
三、接收的數據起始位不標準
我們知道,串口每個byte的數據都有一個起始位,占一個bit時間,如果由于一些原因導致對方發過來的數據起始位過短的話,MCU就無法識別到這個起始位,從而這個byte的數據就不會被接收。小編就見過因為加了隔離芯片導致起始位變短,而傳輸的第一個數據bit位變長,雖然這個byte的數據時間是符合波特率的,但由于起始位不標準,也將導致接收異常。
實際上這個問題只會在GD部分芯片上出現,比如GD32F405/407/450,這是因為這幾顆芯片串口起始位的檢測比較嚴苛,而GD32有的型號做了起始位檢測優化,比如GD32F30x、F425/427/470系列,就不會出現這樣的問題。
四、干擾
串口的發送和接收,實際上就是一串波形,當波形收到干擾時,也會出現通信異常。這種情況下,小伙伴們就要去通過硬件的方式去過濾到干擾源就可以解決問題了。
以上,就是小編總結的幾點串口接收異常的可能原因,小伙伴們有知道其他原因的,歡迎在評論區交流哦。
-
單片機
+關注
關注
6043文章
44621瀏覽量
638564 -
串口
+關注
關注
14文章
1557瀏覽量
77043 -
GD32
+關注
關注
7文章
413瀏覽量
24470
發布評論請先 登錄
相關推薦
評論