|
關(guān)注+星標(biāo)公眾號(hào),不錯(cuò)過(guò)精彩內(nèi)容作者 | strongerHuang微信公眾號(hào) | 嵌入式專欄
單片機(jī)串口是我們常用的一種接口,這里分享一些關(guān)于STM32串口中斷及DMA接收常見(jiàn)的幾個(gè)問(wèn)題。
UART串口中斷接收
使能UART串口中斷之后,有接收到UART數(shù)據(jù),進(jìn)入中斷,此時(shí)要清除RXNE接收標(biāo)志位:1.通過(guò)軟件向該RXNE標(biāo)志位寫(xiě)入零來(lái)清零;2.通過(guò)對(duì) USART_DR 寄存器執(zhí)行讀入操作將該位清零。
這里可以查看對(duì)應(yīng)《參考手冊(cè)》,一般我們選擇第2種,通過(guò)讀取UART串口數(shù)據(jù)來(lái)清零。
1.中斷接收數(shù)據(jù)丟失在UART串口中斷函數(shù)中,或者更高優(yōu)先級(jí)中斷函數(shù)中長(zhǎng)時(shí)間執(zhí)行,導(dǎo)致接收丟失,所以,請(qǐng)勿在中斷函數(shù)中長(zhǎng)時(shí)間執(zhí)行。
特別有些人,還在中斷函數(shù)添加延時(shí)函數(shù)。實(shí)際應(yīng)用中,只要不是特殊情況,比如測(cè)試某個(gè)功能可以添加延時(shí)函數(shù),都不建議在中斷函數(shù)添加延時(shí)函數(shù)。
2.ORE上溢錯(cuò)誤ORE上溢錯(cuò)誤是什么意思呢? 可能很多人不了解,簡(jiǎn)單說(shuō)就是:UART接收到有數(shù)據(jù),沒(méi)有去取,但又來(lái)了數(shù)據(jù),此時(shí)就會(huì)產(chǎn)生ORE上溢錯(cuò)誤。(請(qǐng)看“參考手冊(cè)”)
其實(shí),上面這種長(zhǎng)時(shí)間在占用中斷,就會(huì)導(dǎo)致UART接收數(shù)據(jù)上溢。
很多人沒(méi)有在意這個(gè),如果是使能了中斷接收,標(biāo)志位沒(méi)有清除,又有ORE上溢錯(cuò)誤的話,程序就會(huì)不停地進(jìn)入U(xiǎn)ART中斷。(大家不妨試一下,看一下是不是你代碼一直在UART中斷里面不停運(yùn)行)。
3.使能接收中斷前,先清除接收標(biāo)志位有時(shí)候,在程序初始化的時(shí)候,就會(huì)接收到數(shù)據(jù),這個(gè)時(shí)候建議大家先清除接收標(biāo)志位再使能接收中斷。類似如下:
q5bagnygrw06405722350.jpg (230.13 KB, 下載次數(shù): 1)
下載附件
保存到相冊(cè)
q5bagnygrw06405722350.jpg
2024-9-7 19:24 上傳
DMA接收串口數(shù)據(jù)
使用DMA接收串口數(shù)據(jù),相信很多朋友都知道。這個(gè)可以理解為使用隊(duì)列,或者FIFO的形式,防止因高優(yōu)先級(jí)中斷而打斷,導(dǎo)致接收數(shù)據(jù)丟失。
但很多人都遇到過(guò),接收不到數(shù)據(jù),或者數(shù)據(jù)異常的情況。所以,這里同樣有需要注意的地方。
1.使能UART之前,先使能DMA相關(guān)配置這個(gè)和清除標(biāo)志位一樣的道理,使能UART之前,先使能DMA相關(guān)配置,防止在配置過(guò)程中有接收數(shù)據(jù)。
cnukad4cll46405722450.jpg (111.01 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
cnukad4cll46405722450.jpg
2024-9-7 19:24 上傳
2.ORE上溢錯(cuò)誤導(dǎo)致不能使用DMA接收數(shù)據(jù)導(dǎo)致不能DMA接收不到數(shù)據(jù)的根源,有一種可能就是有ORE上溢錯(cuò)誤。
若在串口初始化并使能后到 DMA 使能之前有數(shù)據(jù)來(lái),MCU是不能接收的。如果此時(shí)數(shù)據(jù)寄存器 USART_DR 存在一個(gè)數(shù)據(jù),再來(lái)一個(gè)數(shù)據(jù),就會(huì)導(dǎo)致ORE上溢錯(cuò)誤。
一旦產(chǎn)生上溢錯(cuò)誤后,就無(wú)法再觸發(fā) DAM 請(qǐng)求,即使之后再啟動(dòng) DMA 也不行,無(wú)法觸發(fā) DMA 請(qǐng)求就無(wú)法將數(shù)據(jù)寄存器內(nèi)的數(shù)據(jù)及時(shí)轉(zhuǎn)移走,如此陷入死鎖。這就是串口無(wú)法正常接收的原因。
所以,最后提醒大家,配置時(shí),請(qǐng)一定要注意這些細(xì)節(jié)。
------------ END ------------
2djiggfhmfi6405722550.gif (71.87 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
2djiggfhmfi6405722550.gif
2024-9-7 19:24 上傳
●專欄《嵌入式工具》●專欄《嵌入式開(kāi)發(fā)》●專欄《Keil教程》●嵌入式專欄精選教程
關(guān)注公眾號(hào)回復(fù)“加群”按規(guī)則加入技術(shù)交流群,回復(fù)“1024”查看更多內(nèi)容。
點(diǎn)擊“閱讀原文”查看更多分享。 |
|