專案做到一半,碰到個尷尬問題:pwm使用的dma通道與串列埠接收的dma通道撞車了,咋辦?
考慮一下,決定放棄idle中斷+dma的串列埠不定長資料接收方案,回到中斷接收去。
中斷接收函式hal_uart_receive_it函式是個定長接收函式,除非把接收長度設為1。由於我使用freertos系統,打斷系統的時間應盡可能少,頻率盡可能低。每個位元組都進一次hal庫的接收處理函式,進行各種判斷實在是不友好,因此考慮跳過hal的串列埠處理部分,直接判斷uart_flag_rxne標誌位與uart_flag_idle標誌位,存入接收緩衝。觸發idle中斷後認為不定長資料接收完畢,進行處理。
**:中斷使能與初始化,不啟用hal_uart_receive_it。
中斷處理部分,跳過hal中斷處理函式
注意:__hal_uart_clear_flag函式不能清除idle標誌位,需要用古老的讀取方法清空。否則會卡死在中斷處理結束之後。
優點:中斷處理內容盡可能簡化,降低對系統核心的打斷;
缺點:只適用於8位資料位,無校驗位等最常規通訊方式,對於更複雜引數的串列埠通訊有待測試,省掉的hal庫會不會造成執行不穩定有待於繼續測試。
STM32串列埠接收策略
如果我們需要接收乙個序列協議,怎麼做呢?先放到緩衝區然後再檢查標誌位是一種思路。道理簡單,關鍵要看怎麼設計。這裡介紹的方法是巧妙利用定時器,與串列埠中斷進行耦合,得到一種魯棒的接收方法。具體 開啟定時器與串列埠中斷 首先用示波器檢視完整幀所需要的時間,並且設定為timmax。定時器以適當的中斷頻率開...
stm32 串列埠接受不定長資料方法(3種)
方法1 串列埠接受資料,定時器來判斷超時是否接受資料完成。方法2 dma接受 idle中斷 實現思路 採用stm32f103的串列埠1,並配置成空閒中斷idle模式且使能dma接收,並同時設定接收緩衝區和初始化dma。那麼初始化完成之後,當外部給微控制器傳送資料的時候,假設這幀資料長度是200個位元...
STM32串列埠接收中斷BUG
除錯串列埠時,發現串列埠會出現頻繁跳中斷,導致無法執行主迴圈的問題!除錯發現是串列埠中斷硬體bug 1.usart itconfig usart 1,usart it rxne,enable 使能了接收中斷,那麼ore中斷也同時被開啟了。2.ore中斷只能使用usart getflagstatus ...