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