項(xiàng)目做到一半,碰到個(gè)尷尬問(wèn)題:PWM使用的DMA通道與串口接收的DMA通道撞車了,咋辦?
考慮一下,決定放棄idle中斷+dma的串口不定長(zhǎng)數(shù)據(jù)接收方案,回到中斷接收去。
中斷接收函數(shù)HAL_UART_RECEIVE_IT函數(shù)是個(gè)定長(zhǎng)接收函數(shù),除非把接收長(zhǎng)度設(shè)為1。由于我使用freertos系統(tǒng),打斷系統(tǒng)的時(shí)間應(yīng)盡可能少,頻率盡可能低。每個(gè)字節(jié)都進(jìn)一次hal庫(kù)的接收處理函數(shù),進(jìn)行各種判斷實(shí)在是不友好,因此考慮跳過(guò)hal的串口處理部分,直接判斷uart_flag_rxne標(biāo)志位與uart_flag_idle標(biāo)志位,存入接收緩沖。觸發(fā)idle中斷后認(rèn)為不定長(zhǎng)數(shù)據(jù)接收完畢,進(jìn)行處理。
代碼:
中斷使能與初始化,不啟用hal_uart_receive_it。

中斷處理部分,跳過(guò)hal中斷處理函數(shù)

注意:__hal_uart_clear_flag函數(shù)不能清除idle標(biāo)志位,需要用古老的讀取方法清空。否則會(huì)卡死在中斷處理結(jié)束之后。
優(yōu)點(diǎn):中斷處理內(nèi)容盡可能簡(jiǎn)化,降低對(duì)系統(tǒng)內(nèi)核的打斷;
缺點(diǎn):只適用于8位數(shù)據(jù)位,無(wú)校驗(yàn)位等最常規(guī)通信方式,對(duì)于更復(fù)雜參數(shù)的串口通信有待測(cè)試,省掉的hal庫(kù)會(huì)不會(huì)造成運(yùn)行不穩(wěn)定有待于繼續(xù)測(cè)試。
版權(quán)聲明:本文轉(zhuǎn)自CSDN,博主fox0815
遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。
原文鏈接:https://blog.csdn.net/fox0815/article/details/106461788
審核編輯:何安
-
PWM
+關(guān)注
關(guān)注
116文章
5867瀏覽量
225564 -
串口
+關(guān)注
關(guān)注
15文章
1618瀏覽量
82791 -
dma
+關(guān)注
關(guān)注
3文章
581瀏覽量
105913
發(fā)布評(píng)論請(qǐng)先 登錄
DMA彈性映射功能
CW32L052 DMA直接內(nèi)存訪問(wèn)介紹
哪些場(chǎng)景適合使用DMA?
RVMCU課堂「18」: 手把手教你玩轉(zhuǎn)RVSTAR—DMA數(shù)據(jù)傳輸篇
rt-thread 在使用串口DMA模式的時(shí)候,接收數(shù)據(jù)接收不到00,為什么?
串口DMA接收方式打開(kāi),為什么在開(kāi)啟IDLE中斷的情況下還需要開(kāi)啟DMA中斷呢?
串口DMA接收數(shù)據(jù)包丟失怎么解決?
配置了串口DMA,現(xiàn)在是接收可以,發(fā)送不行,是什么地方?jīng)]有設(shè)置對(duì)嗎?
完全按照rt-thread 里的串口DMA接收寫的,接收內(nèi)存無(wú)論怎么擴(kuò)大還是報(bào)錯(cuò),為什么?
STM32F405RGT6 ADC2+TIM4觸發(fā)+DMA(DMA2_Stream2_CH1)+DMA中斷會(huì)死機(jī),怎么解決?
求助,關(guān)于stm32H7多DMA數(shù)據(jù)流問(wèn)題求解
STM32407使用串口閑時(shí)中斷+DMA方式接收最大接收字節(jié)是多少?
第十五章 DMA
如何解決PWM使用的DMA通道與串口接收的DMA通道撞車問(wèn)題
評(píng)論