關(guān)于老版本HK32F103串口USART偶爾出現(xiàn)數(shù)據(jù)錯(cuò)誤的應(yīng)用記錄
有部分客戶在使用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ù)如下修改,可以使串口通訊正常工作。
對(duì)于波特率累計(jì)誤差,用戶可以采用三種方式來(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ù)配置,主要是用戶需要較高的波特率時(shí),導(dǎo)致波特率配置寄存器的整數(shù)部分為1,還存在小數(shù)部分的情況。這時(shí)HK芯片對(duì)小數(shù)部分會(huì)被忽略掉,導(dǎo)致USART輸出的bit寬度不對(duì)。出現(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中斷問(wèn)題
用戶串口通訊打開(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)始前用戶配置的值(即已經(jīng)發(fā)送的數(shù)據(jù)個(gè)數(shù)).如果客戶在dma發(fā)送完成后關(guān)閉了對(duì)應(yīng)的通道,然后讀取其DMA_CNDTRn的值就會(huì)出現(xiàn)非零值.如果用戶想要使用拼接方式發(fā)送數(shù)據(jù)(在一次數(shù)據(jù)未發(fā)完前追加新的數(shù)據(jù)發(fā)送)且前一次數(shù)據(jù)已發(fā)送完成的情況下就會(huì)出現(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)用庫(kù)函數(shù)讀出DMA_CNDTRn寄存器的值,再關(guān)閉DMA通道,然后追加新的數(shù)據(jù)到緩存buffer(可能是用戶在RAM中定義的一個(gè)數(shù)組),再啟用DMA發(fā)送,這樣來(lái)完成數(shù)據(jù)的拼接發(fā)送。
如需要了解更多航順MCU產(chǎn)品,請(qǐng)聯(lián)系航順核心代理商,穎特新科技,或者掃碼聯(lián)系我們!
在之前的介紹中,我們也為大家介紹了《國(guó)外品牌采用航順HK32F030R8T6代替出現(xiàn)串口不兼容解決方法》
編輯:zzy 最后修改時(shí)間:2022-05-11