有部分客戶(hù)在使用HK32F103系列芯片的串口通訊時(shí),偶爾出現(xiàn)數(shù)據(jù)錯(cuò)誤的原因具體有以下幾點(diǎn):
1.串口通訊時(shí)因?yàn)榭赡艽嬖诶塾?jì)誤差偶爾造成數(shù)據(jù)錯(cuò)誤。
2.用戶(hù)在配置串口波特率參數(shù)時(shí)因?yàn)镠K有細(xì)微地方與ST不同。
下面就以上原因,用戶(hù)根據(jù)如下修改,可以使串口通訊正常工作。
對(duì)于波特率累計(jì)誤差,用戶(hù)可以采用三種方式來(lái)解決:
1. 修改STOP bit位數(shù),把stop bit設(shè)成0.5,但是我們芯片的發(fā)送stop bit寬度也會(huì)變成0.5。這種方法要注意的是:對(duì)方芯片有可能無(wú)法接受0.5 stop bit。
2.把波特率設(shè)置稍微提高1%左右。比如對(duì)方發(fā)出115200bps,HK的芯片波特率需要設(shè)置為115200*1.01=116352bps(偏差小于1%)。
3.建議HK芯片和對(duì)方發(fā)送數(shù)據(jù)時(shí),都不要背靠背發(fā)送。
關(guān)于上述第二種波特率參數(shù)配置,主要是用戶(hù)需要較高的波特率時(shí),導(dǎo)致波特率配置寄存器的整數(shù)部分為1,還存在小數(shù)部分的情況。這時(shí)HK芯片對(duì)小數(shù)部分會(huì)被忽略掉,導(dǎo)致USART輸出的bit寬度不對(duì)。出現(xiàn)這種應(yīng)用時(shí),用戶(hù)需要調(diào)整USART工作頻率和波特率的關(guān)系,避免波特率配置寄存器的整數(shù)部分為1,還存在小數(shù)部分。
另外應(yīng)用串口(USART)還應(yīng)注意以下2點(diǎn):
1.串口USART RX IDLE中斷問(wèn)題
用戶(hù)串口通訊打開(kāi)了RX IDLE中斷后出現(xiàn)反復(fù)進(jìn)入的原因是因?yàn)镮DLE中斷標(biāo)志不能清除。
解決方法:
Step 1. 關(guān)閉IDLE 中斷.
Step 2. 在RXNE 事件后:
A. 清除IDLE標(biāo)志.
B. 然后使能IDLE中斷.
Step 3. 在IDLE中斷觸發(fā)后: 除能IDLE中斷.
2.串口USART使用DMA傳輸時(shí), DMA通道關(guān)閉后DMA_CNDTRn值Reload的問(wèn)題。
這個(gè)與我們HK的DMA設(shè)置與ST略有不同,HK的DMA通道在關(guān)閉后,對(duì)應(yīng)的DMA_CNDTRn的值會(huì)被重新加載為本次發(fā)送開(kāi)始前用戶(hù)配置的值(即已經(jīng)發(fā)送的數(shù)據(jù)個(gè)數(shù))。如果客戶(hù)在dma發(fā)送完成后關(guān)閉了對(duì)應(yīng)的通道,然后讀取其DMA_CNDTRn的值就會(huì)出現(xiàn)非零值。如果用戶(hù)想要使用拼接方式發(fā)送數(shù)據(jù)(在一次數(shù)據(jù)未發(fā)完前追加新的數(shù)據(jù)發(fā)送)且前一次數(shù)據(jù)已發(fā)送完成的情況下就會(huì)出現(xiàn)錯(cuò)誤的數(shù)據(jù)拼接。
處理數(shù)據(jù)拼接的解決方案:
如果是單次數(shù)據(jù)發(fā)送模式,用戶(hù)在DMA數(shù)據(jù)發(fā)送完成后不用關(guān)閉DMA通道,在追加新的數(shù)據(jù)發(fā)送時(shí),先在未關(guān)閉DMA通道的情況下調(diào)用庫(kù)函數(shù)讀出DMA_CNDTRn寄存器的值,再關(guān)閉DMA通道,然后追加新的數(shù)據(jù)到緩存buffer(可能是用戶(hù)在RAM中定義的一個(gè)數(shù)組),再啟用DMA發(fā)送,這樣來(lái)完成數(shù)據(jù)的拼接發(fā)送。
來(lái)源:航順芯片
審核編輯:湯梓紅
-
寄存器
+關(guān)注
關(guān)注
31文章
5336瀏覽量
120230 -
串口
+關(guān)注
關(guān)注
14文章
1551瀏覽量
76428 -
USART
+關(guān)注
關(guān)注
1文章
195瀏覽量
30835
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論