關於STM32串列埠接收中斷中只能接收乙個位元組

2021-10-06 13:36:45 字數 729 閱讀 1620

最近除錯stm32的串列埠接收時發現例程中只能接收乙個位元組

例程如下:

1 //初始化串列埠1

2 void uart_init(u32 bound)

43 void usart1_irqhandler(void) //串列埠1中斷服務程式

44

53 54 }

55 56

57

這是較為普遍的原始碼例程的寫法,用原子的版本改的。這本身沒問題,但是,一旦執行,就會發現,只能接收乙個位元組,後面的都會丟失,調了1天沒找到原因,一搜尋發現很多類似的情況。

後來正準備改用dma時偶然找到問題所在,就是這句:

24     nvic_initstructure.nvic_irqchannelpreemptionpriority=3 ;//搶占優先順序3

25 nvic_initstructure.nvic_irqchannelsubpriority = 3; //子優先順序3

改為

24     nvic_initstructure.nvic_irqchannelpreemptionpriority=1 ;

25 nvic_initstructure.nvic_irqchannelsubpriority = 0;

後問題解決。

注意,不要在中斷中執行傳送接收過程,存在中斷巢狀的問題,會造成只執行一次的現象。

STM32串列埠接收中斷BUG

除錯串列埠時,發現串列埠會出現頻繁跳中斷,導致無法執行主迴圈的問題!除錯發現是串列埠中斷硬體bug 1.usart itconfig usart 1,usart it rxne,enable 使能了接收中斷,那麼ore中斷也同時被開啟了。2.ore中斷只能使用usart getflagstatus ...

STM32串列埠通訊中斷接收

串列埠的時序和工作原理就不寫了,主要寫如何應用 串列埠的設定除了gpio外,需要設定的引數有波特率 資料位 停止位,校驗方式 gpio輸出配置af pp復用推挽輸出 gpio出入配置in flaoting浮空輸入 usart的配置為115200的波特率,8位資料長度,1位停止位,無校驗,無硬體流控制...

STM32串列埠接收策略

如果我們需要接收乙個序列協議,怎麼做呢?先放到緩衝區然後再檢查標誌位是一種思路。道理簡單,關鍵要看怎麼設計。這裡介紹的方法是巧妙利用定時器,與串列埠中斷進行耦合,得到一種魯棒的接收方法。具體 開啟定時器與串列埠中斷 首先用示波器檢視完整幀所需要的時間,並且設定為timmax。定時器以適當的中斷頻率開...