關於USART接收中斷的BUG和注意事項

2021-07-02 13:23:50 字數 2379 閱讀 8108

今天在使用usart模組,遇到了一些問題並解決了,於是發貼共享。

問題描述:

在使用usart做串列埠通訊時,我只把接收中斷開啟,並設定搶占優先順序為最低乙個級別,而接收中斷上乙個優先順序處理事情比較多,可能占用了2ms時間。當我使用9600波特率往下位機傳送資料,速度非常快,就是一直按回車發!問題就出來,不到1分鐘時間,通訊沒有反應了。usart配置**如下:

void uart_config(void)

分析問題:

1.為什麼沒有通訊了?

通過**器**,發現程式一直進入接收中斷中,由於我沒有使用中斷傳送,於是程式就死在了接收中斷,也就沒有資料傳送到電腦上來。接收中斷**如下:

void uart_receive(void)

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);}}

2.為什麼會一直跑到接收中斷?

斷點之後發現(usart_getitstatus(usart1, usart_it_rxne)==reset的,也就是說沒有資料接收到也進了中斷,而且在usart配置中我也只開啟了接收中斷!沒有資料送過來應該是不可能進入中斷的!

3.響應了什麼中斷?

我想通過函式(usart_getitstatus()把所有中斷狀態都讀出來,但失敗了,usart_it_***所有中斷狀態都是reset!也就是說沒有中斷也進入到這個中斷服務程式來了!?

4.找資料

stm32f10x微控制器參考手冊(2023年12月第10版)p541發現如下說明:

也就是說只要接收中斷開啟,即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)

//正在處理上一條通訊,接收到資料不處理

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);}}

總結:注意問題:

1.usart_itconfig(usart1, usart_it_rxne, enable);使能了接收中斷,那麼ore中斷也同時被開啟了。

2.ore中斷只能使用usart_getflagstatus(usart1, usart_flag_ore) 讀到(沒有使能usart_it_err中斷時)

bug建議:

1.在stm32庫中,能不能修改usart_getitstatus()函式對usart_it_ore中斷的處理?

也就是我只要開啟了接收中斷,那麼有ore中斷時,我也能使用usart_getitstatus(usart1,usart_it_ore)讀到.

關於USART接收中斷的BUG和注意事項

學習別人解決問題的方法!問題描述 在使用usart做 串列埠通訊 時,我只把接收中斷開啟,並 設定搶占優先順序為最低乙個級別,而接收中斷上乙個優先順序處理事情比較多,可能占用了2ms 時間。當我使用9600波特率往下位機傳送 資料,速度非常快,就是一直按回車發!問題就出來,不到1分鐘時間,通訊沒有反...

STM32串列埠接收中斷BUG

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

串列埠的中斷和接收

前面介紹了串列埠的查詢方式,沒看過的童鞋可以檢視我之前的部落格。今天我們來介紹怎麼利用終端接收串列埠的資料。關於串列埠中斷沒有繁雜的初始化。只需新增幾句話就能實現串列埠中斷了。直接上 吧。uartinit 只需要這三句化,就開啟了中斷,和接收允許了。接下來我們寫寫串列埠的中斷函式。pragma ve...