老版本HK32F103系列芯片的串口通訊時(shí),偶爾出現(xiàn)數(shù)據(jù)錯(cuò)誤的原因具體有以下幾點(diǎn):
1.串口通訊時(shí)因?yàn)榭赡艽嬖诶塾?jì)誤差偶爾造成數(shù)據(jù)錯(cuò)誤。
2.用戶在配置串口波特率參數(shù)時(shí)因?yàn)镠K有細(xì)微地方與ST不同。
下面就以上原因,用戶根據(jù)如下修改,可以使串口通訊正常工作。
對于波特率累計(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ù)時(shí),都不要背靠背發(fā)送。
關(guān)于上述第二種波特率參數(shù)配置,主要是用戶需要較高的波特率時(shí),導(dǎo)致波特率配置寄存器的整數(shù)部分為1,還存在小數(shù)部分的情況。這時(shí)HK芯片對小數(shù)部分會被忽略掉,導(dǎo)致USART輸出的bit寬度不對。出現(xiàn)這種應(yīng)用時(shí),用戶需要調(diào)整USART工作頻率和波特率的關(guān)系,避免波特率配置寄存器的整數(shù)部分為1,還存在小數(shù)部分。
應(yīng)用串口(USART)還應(yīng)注意以下2點(diǎn)
1.串口USART RX IDLE中斷問題
用戶串口通訊打開了RX IDLE中斷后出現(xiàn)反復(fù)進(jìn)入的原因是因?yàn)镮DLE中斷標(biāo)志不能清除。
◆解決方法:
Step1.關(guān)閉IDLE中斷.
Step2.在RXNE事件后:
A.清除IDLE標(biāo)志.
B.然后使能IDLE中斷.
Step3.在IDLE中斷觸發(fā)后: 除能IDLE中斷.
2.串口USART使用DMA傳輸時(shí), DMA通道關(guān)閉后DMA_CNDTRn值Reload的問題。
◆解決方法:
這個(gè)與我們HK的DMA設(shè)置與ST略有不同,HK的DMA通道在關(guān)閉后,對應(yīng)的DMA_CNDTRn的值會被重新加載為本次發(fā)送開始前用戶配置的值(即已經(jīng)發(fā)送的數(shù)據(jù)個(gè)數(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)錯(cuò)誤的數(shù)據(jù)拼接。
處理數(shù)據(jù)拼接的解決方案
如果是單次數(shù)據(jù)發(fā)送模式,用戶在DMA數(shù)據(jù)發(fā)送完成后不用關(guān)閉DMA通道,在追加新的數(shù)據(jù)發(fā)送時(shí),先在未關(guān)閉DMA通道的情況下調(diào)用庫函數(shù)讀出DMA_CNDTRn寄存器的值,再關(guān)閉DMA通道,然后追加新的數(shù)據(jù)到緩存buffer(可能是用戶在RAM中定義的一個(gè)數(shù)組),再啟用DMA發(fā)送,這樣來完成數(shù)據(jù)的拼接發(fā)送。