學習別人解決問題的方法!
問題描述:
在使用usart做
串列埠通訊
時,我只把接收中斷開啟,並
設定搶占優先順序為最低乙個級別,而接收中斷上乙個優先順序處理事情比較多,可能占用了2ms
時間。當我使用9600波特率往下位機傳送
資料,速度非常快,就是一直按回車發!問題就出來,不到1分鐘時間,通訊沒有反應了。usart配置
**如下:
void uart_config(void)分析問題:1.為什麼沒有通訊了?
通過**器**,發現程式一直進入接收中斷中,由於我沒有使用中斷傳送,於是程式就死在了接收中斷,也就沒有資料傳送到電腦上來。接收中斷**如下:
void uart_receive(void)2.為什麼會一直跑到接收中斷?斷點之後發現(usart_getitstatus(usart1, usart_it_rxne)==reset的,也就是說沒有資料接收到也進了中斷,而且在usart配置中我也只開啟了接收中斷!沒有資料送過來應該是不可能進入中斷的!3.響應了什麼中斷?我想通過函式(usart_getitstatus()把所有中斷狀態都讀出來,但失敗了,usart_it_***所有中斷狀態都是reset!也就是說沒有中斷也進入到這個中斷服務程式來了!?4.找if(usart_getitstatus(usart1, usart_it_rxne) != reset)
else
moudbu***pir = 20;
/* read one byte from the receive data register */
ucrs485buff[ucrceptr++] = usart_receivedata(usart1);
/* clear the usart1 receive interrupt */
usart_clearitpendingbit(usart1, usart_it_rxne);
}}
資料
也就是說只要接收中斷開啟,即rxneie設定為1,那麼ore中斷也自動開啟了。
可是usart_getitstatus(usart1, usart_it_ore )== reset!!!!找到usart_getitstatus(usart1, usart_it_rxne)函式,發現只有當usart_it_err中斷使能時,才能讀到ore中斷。在這裡要指出這個bug:產生ore中斷了,但使用usart_getitstatus()函式卻無法讀到這個中斷被set起來!5.把ore中斷標誌位清除既然找到了是什麼中斷,那麼把相應的中斷標誌位清除,就應該可以了吧?usart_clearitpendingbit(usart1, usart_it_ore);但是,結果是沒有任何效果!清除之後,馬上讀ore中斷狀態,usart_getitstatus(usart1, usart_it_ore)==reset.程式仍然跑死在接收中斷。再使用另乙個函式usart_getflagstatus(usart1, usart_flag_ore) = set,原來ore標誌位還沒有清除。6.問題解決為什麼清除不掉?頭疼了,再找找資料,有發現,在p523頁如下圖:
void uart_receive(void)總結:注意問題:1.usart_itconfig(usart1, usart_it_rxne, enable);使能了接收中斷,那麼ore中斷也同時被開啟了。2.ore中斷只能使用usart_getflagstatus(usart1, usart_flag_ore) 讀到(沒有使能usart_it_err中斷時)//正在處理上一條通訊,接收到資料不處理
if(brecieveok)
if(usart_getitstatus(usart1, usart_it_rxne) != reset)
else
moudbu***pir = 20;
/* read one byte from the receive data register */
ucrs485buff[ucrceptr++] = usart_receivedata(usart1);
/* clear the usart1 receive interrupt */
usart_clearitpendingbit(usart1, usart_it_rxne);
}}
bug建議:1.在stm32庫中,能不能修改usart_getitstatus()函式對usart_it_ore中斷的處理?也就是我只要開啟了接收中斷,那麼有ore中斷時,我也能使用usart_getitstatus(usart1,usart_it_ore)讀到.
其它:在找資料的同時,發現stm32f10x微控制器參考手冊(2023年12月第10版)中文翻譯p538有錯誤,如下圖:
英文p696如下圖:
關於USART接收中斷的BUG和注意事項
今天在使用usart模組,遇到了一些問題並解決了,於是發貼共享。問題描述 在使用usart做串列埠通訊時,我只把接收中斷開啟,並設定搶占優先順序為最低乙個級別,而接收中斷上乙個優先順序處理事情比較多,可能占用了2ms時間。當我使用9600波特率往下位機傳送資料,速度非常快,就是一直按回車發!問題就出...
STM32串列埠接收中斷BUG
除錯串列埠時,發現串列埠會出現頻繁跳中斷,導致無法執行主迴圈的問題!除錯發現是串列埠中斷硬體bug 1.usart itconfig usart 1,usart it rxne,enable 使能了接收中斷,那麼ore中斷也同時被開啟了。2.ore中斷只能使用usart getflagstatus ...
串列埠的中斷和接收
前面介紹了串列埠的查詢方式,沒看過的童鞋可以檢視我之前的部落格。今天我們來介紹怎麼利用終端接收串列埠的資料。關於串列埠中斷沒有繁雜的初始化。只需新增幾句話就能實現串列埠中斷了。直接上 吧。uartinit 只需要這三句化,就開啟了中斷,和接收允許了。接下來我們寫寫串列埠的中斷函式。pragma ve...