老版本HK32F103系列芯片的串口通訊時,偶爾出現(xiàn)數(shù)據(jù)錯誤的原因具體有以下幾點:
1.串口通訊時因為可能存在累計誤差偶爾造成數(shù)據(jù)錯誤。
2.用戶在配置串口波特率參數(shù)時因為HK有細(xì)微地方與ST不同。
下面就以上原因,用戶根據(jù)如下修改,可以使串口通訊正常工作。
對于波特率累計誤差,用戶可以采用三種方式來解決
1. 修改STOP bit位數(shù),把stop bit設(shè)成0.5,但是我們芯片的發(fā)送stop bit寬度也會變成0.5。這種方法要注意的是:對方芯片有可能無法接受0.5 stop bit。
2.把波特率設(shè)置稍微提高1%左右。比如對方發(fā)出115200bps,HK的芯片波特率需要設(shè)置為115200*1.01=116352bps(偏差小于1%)。
3.建議HK芯片和對方發(fā)送數(shù)據(jù)時,都不要背靠背發(fā)送。
關(guān)于上述第二種波特率參數(shù)配置,主要是用戶需要較高的波特率時,導(dǎo)致波特率配置寄存器的整數(shù)部分為1,還存在小數(shù)部分的情況。這時HK芯片對小數(shù)部分會被忽略掉,導(dǎo)致USART輸出的bit寬度不對。出現(xiàn)這種應(yīng)用時,用戶需要調(diào)整USART工作頻率和波特率的關(guān)系,避免波特率配置寄存器的整數(shù)部分為1,還存在小數(shù)部分。
應(yīng)用串口(USART)還應(yīng)注意以下2點
1.串口USART RX IDLE中斷問題
用戶串口通訊打開了RX IDLE中斷后出現(xiàn)反復(fù)進(jìn)入的原因是因為IDLE中斷標(biāo)志不能清除。
◆解決方法:
Step1.關(guān)閉IDLE中斷.
Step2.在RXNE事件后:
A.清除IDLE標(biāo)志.
B.然后使能IDLE中斷.
Step3.在IDLE中斷觸發(fā)后: 除能IDLE中斷.
2.串口USART使用DMA傳輸時, DMA通道關(guān)閉后DMA_CNDTRn值Reload的問題。
◆解決方法:
這個與我們HK的DMA設(shè)置與ST略有不同,HK的DMA通道在關(guān)閉后,對應(yīng)的DMA_CNDTRn的值會被重新加載為本次發(fā)送開始前用戶配置的值(即已經(jīng)發(fā)送的數(shù)據(jù)個數(shù)).如果客戶在dma發(fā)送完成后關(guān)閉了對應(yīng)的通道,然后讀取其DMA_CNDTRn的值就會出現(xiàn)非零值.如果用戶想要使用拼接方式發(fā)送數(shù)據(jù)(在一次數(shù)據(jù)未發(fā)完前追加新的數(shù)據(jù)發(fā)送)且前一次數(shù)據(jù)已發(fā)送完成的情況下就會出現(xiàn)錯誤的數(shù)據(jù)拼接。
處理數(shù)據(jù)拼接的解決方案
如果是單次數(shù)據(jù)發(fā)送模式,用戶在DMA數(shù)據(jù)發(fā)送完成后不用關(guān)閉DMA通道,在追加新的數(shù)據(jù)發(fā)送時,先在未關(guān)閉DMA通道的情況下調(diào)用庫函數(shù)讀出DMA_CNDTRn寄存器的值,再關(guān)閉DMA通道,然后追加新的數(shù)據(jù)到緩存buffer(可能是用戶在RAM中定義的一個數(shù)組),再啟用DMA發(fā)送,這樣來完成數(shù)據(jù)的拼接發(fā)送。