最近除錯stm32的串列埠接收時發現例程中只能接收乙個位元組
例程如下:
1//初始化串列埠1
2void
uart_init(u32 bound)
43void usart1_irqhandler(void) //
串列埠1中斷服務程式44
5354
} 55
5657
這是較為普遍的原始碼例程的寫法,用原子的版本改的。這本身沒問題,但是,一旦執行,就會發現,只能接收乙個位元組,後面的都會丟失,調了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。定時器以適當的中斷頻率開...