今天再給大家分享一些關(guān)于STM32串口中斷及DMA接收常見的幾個(gè)問題。
UART串口中斷接收
使能UART串口中斷之后,有接收到UART數(shù)據(jù),進(jìn)入中斷,此時(shí)要清除RXNE接收標(biāo)志位:
1)通過軟件向該RXNE標(biāo)志位寫入零來清零;
2)通過對 USART_DR 寄存器執(zhí)行讀入操作將該位清零。
這里可以查看對應(yīng)《參考手冊》,一般我們選擇第2種,通過讀取UART串口數(shù)據(jù)來清零。
1、中斷接收數(shù)據(jù)丟失
在UART串口中斷函數(shù)中,或者更高優(yōu)先級中斷函數(shù)中長時(shí)間執(zhí)行,導(dǎo)致接收丟失,所以,請勿在中斷函數(shù)中長時(shí)間執(zhí)行。
特別有些人,還在中斷函數(shù)添加延時(shí)函數(shù)。實(shí)際應(yīng)用中,只要不是特殊情況,比如測試某個(gè)功能可以添加延時(shí)函數(shù),都不建議在中斷函數(shù)添加延時(shí)函數(shù)。
2、ORE上溢錯(cuò)誤
ORE上溢錯(cuò)誤是什么意思呢? 可能很多人不了解,簡單說就是:UART接收到有數(shù)據(jù),沒有去取,但又來了數(shù)據(jù),此時(shí)就會(huì)產(chǎn)生ORE上溢錯(cuò)誤。(請看“參考手冊”)
其實(shí),上面這種長時(shí)間在占用中斷,就會(huì)導(dǎo)致UART接收數(shù)據(jù)上溢。
很多人沒有在意這個(gè),如果是使能了中斷接收,標(biāo)志位沒有清除,又有ORE上溢錯(cuò)誤的話,程序就會(huì)不停地進(jìn)入U(xiǎn)ART中斷。(大家不妨試一下,看一下是不是你代碼一直在UART中斷里面不停運(yùn)行)。
3、使能接收中斷前,先清除接收標(biāo)志位
有時(shí)候,在程序初始化的時(shí)候,就會(huì)接收到數(shù)據(jù),這個(gè)時(shí)候建議大家先清除接收標(biāo)志位再使能接收中斷。類似如下:

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

2、ORE上溢錯(cuò)誤導(dǎo)致不能使用DMA接收數(shù)據(jù)
導(dǎo)致不能DMA接收不到數(shù)據(jù)的根源,有一種可能就是有ORE上溢錯(cuò)誤。
若在串口初始化并使能后到 DMA 使能之前有數(shù)據(jù)來,MCU是不能接收的。如果此時(shí)數(shù)據(jù)寄存器 USART_DR 存在一個(gè)數(shù)據(jù),再來一個(gè)數(shù)據(jù),就會(huì)導(dǎo)致ORE上溢錯(cuò)誤。
一旦產(chǎn)生上溢錯(cuò)誤后,就無法再觸發(fā) DAM 請求,即使之后再啟動(dòng) DMA 也不行,無法觸發(fā) DMA 請求就無法將數(shù)據(jù)寄存器內(nèi)的數(shù)據(jù)及時(shí)轉(zhuǎn)移走,如此陷入死鎖。這就是串口無法正常接收的原因。
所以,最后提醒大家,配置時(shí),請一定要注意這些細(xì)節(jié)。
來源:嵌入式專欄(作者 | strongerHuang)
免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,請聯(lián)系小編進(jìn)行處理
審核編輯 黃宇
-
寄存器
+關(guān)注
關(guān)注
31文章
5587瀏覽量
128993 -
STM32
+關(guān)注
關(guān)注
2305文章
11118瀏覽量
370956 -
串口
+關(guān)注
關(guān)注
15文章
1605瀏覽量
81873 -
dma
+關(guān)注
關(guān)注
3文章
577瀏覽量
105291
發(fā)布評論請先 登錄
E203串口中斷使用總結(jié)
串口DMA接收方式打開,為什么在開啟IDLE中斷的情況下還需要開啟DMA中斷呢?
串口DMA接收數(shù)據(jù)包丟失怎么解決?
關(guān)于stm32f4zgt6和mspm0g3507串口通信問題
CYT2B7串口接收會(huì)漏接數(shù)據(jù)怎么解決?
求助,關(guān)于stm32H7多DMA數(shù)據(jù)流問題求解
STM32407使用串口閑時(shí)中斷+DMA方式接收最大接收字節(jié)是多少?
使用串口dma環(huán)形接收+空閑中斷,觸發(fā)空閑中斷后進(jìn)入任務(wù)中拷貝數(shù)據(jù)發(fā)現(xiàn)拷貝的數(shù)據(jù)全為0,怎么處理?
STM32F427串口接收和發(fā)送中斷同時(shí)使能,為什么會(huì)出現(xiàn)接收中斷丟數(shù)的情況?
串口中斷是內(nèi)部中斷還是外部中斷,串口中斷是怎么觸發(fā)的
串口中斷需要清除標(biāo)志位嗎,串口中斷標(biāo)志位會(huì)自動(dòng)清除嗎
串口中斷有什么用,串口中斷的觸發(fā)條件是什么
STM32串口接受中斷使用C++STL中的queue導(dǎo)致所有中斷失效
AN-354: 應(yīng)用工程師問答——1幾個(gè)問題

STM32串口中斷及DMA接收常見的幾個(gè)問題
評論