電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 37|回復: 0
收起左側(cè)

單片機串口中斷及DMA接收常見的幾個問題

[復制鏈接]

312

主題

312

帖子

2517

積分

三級會員

Rank: 3Rank: 3

積分
2517
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-9-4 11:45:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
關(guān)注+星標公眾,不錯過精彩內(nèi)容作者 | strongerHuang微信公眾號 | 嵌入式專欄
單片機串口是我們常用的一種接口,這里分享一些關(guān)于STM32串口中斷及DMA接收常見的幾個問題。
UART串口中斷接收
使能UART串口中斷之后,有接收到UART數(shù)據(jù),進入中斷,此時要清除RXNE接收標志位1.通過軟件向該RXNE標志位寫入零來清零;2.通過對 USART_DR 寄存器執(zhí)行讀入操作將該位清零。
這里可以查看對應(yīng)《參考手冊》,一般我們選擇第2種,通過讀取UART串口數(shù)據(jù)來清零。
1.中斷接收數(shù)據(jù)丟失在UART串口中斷函數(shù)中,或者更高優(yōu)先級中斷函數(shù)中長時間執(zhí)行,導致接收丟失,所以,請勿在中斷函數(shù)中長時間執(zhí)行。
特別有些人,還在中斷函數(shù)添加延時函數(shù)。實際應(yīng)用中,只要不是特殊情況,比如測試某個功能可以添加延時函數(shù),都不建議在中斷函數(shù)添加延時函數(shù)。
2.ORE上溢錯誤ORE上溢錯誤是什么意思呢? 可能很多人不了解,簡單說就是:UART接收到有數(shù)據(jù),沒有去取,但又來了數(shù)據(jù),此時就會產(chǎn)生ORE上溢錯誤。(請看“參考手冊”)
其實,上面這種長時間在占用中斷,就會導致UART接收數(shù)據(jù)上溢。
很多人沒有在意這個,如果是使能了中斷接收,標志位沒有清除,又有ORE上溢錯誤的話,程序就會不停地進入UART中斷。(大家不妨試一下,看一下是不是你代碼一直在UART中斷里面不停運行)。
3.使能接收中斷前,先清除接收標志位有時候,在程序初始化的時候,就會接收到數(shù)據(jù),這個時候建議大家先清除接收標志位再使能接收中斷。類似如下:

DMA接收串口數(shù)據(jù)
使用DMA接收串口數(shù)據(jù),相信很多朋友都知道。這個可以理解為使用隊列,或者FIFO的形式,防止因高優(yōu)先級中斷而打斷,導致接收數(shù)據(jù)丟失。
但很多人都遇到過,接收不到數(shù)據(jù),或者數(shù)據(jù)異常的情況。所以,這里同樣有需要注意的地方。
1.使能UART之前,先使能DMA相關(guān)配置這個和清除標志位一樣的道理,使能UART之前,先使能DMA相關(guān)配置,防止在配置過程中有接收數(shù)據(jù)。

2.ORE上溢錯誤導致不能使用DMA接收數(shù)據(jù)導致不能DMA接收不到數(shù)據(jù)的根源,有一種可能就是有ORE上溢錯誤。
若在串口初始化并使能后到 DMA 使能之前有數(shù)據(jù)來,MCU是不能接收的。如果此時數(shù)據(jù)寄存器 USART_DR 存在一個數(shù)據(jù),再來一個數(shù)據(jù),就會導致ORE上溢錯誤。
一旦產(chǎn)生上溢錯誤后,就無法再觸發(fā) DAM 請求,即使之后再啟動 DMA 也不行,無法觸發(fā) DMA 請求就無法將數(shù)據(jù)寄存器內(nèi)的數(shù)據(jù)及時轉(zhuǎn)移走,如此陷入死鎖。這就是串口無法正常接收的原因。
所以,最后提醒大家,配置時,請一定要注意這些細節(jié)。
------------ END ------------

●專欄《嵌入式工具●專欄《嵌入式開發(fā)》●專欄《Keil教程》●嵌入式專欄精選教程
關(guān)注公眾號回復“加群”按規(guī)則加入技術(shù)交流群,回復“1024”查看更多內(nèi)容。
點擊“閱讀原文”查看更多分享。
回復

使用道具 舉報

發(fā)表回復

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

關(guān)閉

站長推薦上一條 /1 下一條


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表