STM32F10x系列 中斷

2021-10-19 02:46:26 字數 2675 閱讀 7703

《概念問題:中斷與事件有什麼聯絡與區別?》

《***stm32之中斷與事件—中斷與事件的區別》

簡單概括下。

中斷:cpu單執行緒情況下只能處理單一任務,在有零時任務需要處理時,可以暫時放下當前任務,優先處理零時任務,再回過來處理之前的任務。多個中斷可以進行巢狀,比如產生了多個零時任務,那麼就可以按照優先順序處理這多個零時任務,再回過來處理當前任務。

事件:字面意思,就是發生的事情,發生的事件會產生相應的訊號給不同的服務,訊號給中斷服務就產生中斷,給dma就使用dma通道,就是說事件可以去觸發不同的任務。靈活的使用事件可以提高效率。

nvic全程nested vectoredinterrupt controller,用於控制中斷的優先順序。具體如下,

優先順序分組是用於分配搶占優先順序和子優先順序的個數,根據自己的需要選擇合適的優先順序分組。

中斷的優先順序規則是:先比搶占優先順序,搶占優先順序相同再比子優先順序,如果搶占優先順序和子優先順序都相同。搶占優先順序顧名思義,可以搶占優先執行,它可以打斷低優先順序的中斷,優先執行自己,所以可以巢狀。而響應優先順序不能巢狀,他不能打斷已經執行的中斷,只能在多個搶占優先順序相同情況下,排出順序,等待當前中斷函式執行結束後才能執行。

使用中斷的三步驟:

1.配置中斷向量(配置中斷優先順序)

2.配置中斷

3.編寫中斷函式

//建議所有中斷的優先順序配置只寫成乙個函式,因為這能更好地理清不同中斷之間的優先關係

void

nvic_config()

void

timer3_init()

void

tim3_irqhandler

(void

)}

外部中斷有很多種形式,這裡介紹最簡單的一種情況——按鍵。

void

nvic_config()

void

exit_config()

void

exti4_irqhandler()

exti_clearitpendingbit

(exti_line4)

;}

中斷實驗:

手中有一塊顯示屏,一顆板載led。

需要實現的功能如下:

1.串列埠接收到數字1時進入中斷,在中斷中點亮led兩秒鐘

2.延時由乙個定時器終端完成。

3.每300毫秒重新整理一次顯示屏,顯示屏顯示當前已經進入的中斷型別,它的優先順序最高。

在這裡我需要用到三個中斷,兩個定時器中斷。乙個用於延時,乙個用於定時300ms執行任務。

乙個串列埠接收中斷。按照描述我可以有以下nvic配置

中斷源搶占優先順序

響應優先順序

timer300

timer210

usart1_rx20

實現**:

(部分自定義函式不給出)

void

nvic_config()

//配置中斷向量

void

timer2_init()

//配置定時器2,用於延時

void

timer3_init()

//配置定時器3,用於定時任務

unsigned

char flag=0;

void

tim2_irqhandler

(void)}

unsigned

int u1_rx=0;

void

tim3_irqhandler

(void)}

void

usart1_irqhandler()

}usart_clearitpendingbit

(usart1,usart_it_rxne)

;//事實上在讀取dr的時候這個中斷標誌會自動清掉

usart_clearflag

(usart1,usart_flag_ore)

;//防止出錯

u1_rx=usart1->dr;

//防止出錯

u1_rx=0;

}int

main()

在上面的**中需要注意這幾個點:

1.在這裡的接收中斷中,會在中斷中延時兩秒,如果在這兩秒中收到了多個資料(也不能說全是這兩秒的鍋),會產生溢位錯誤,觸發overrun error detect,此時只要是優先順序較低的中斷和程式的主函式均會停止執行(卡住),對串列埠中斷發生錯誤時可以檢查usart_it_ore標誌位是否置1,可是這裡的溢位錯誤不能觸發ore置1,ore置1需要滿足兩個條件。解決這個卡住的問題,可以通過清掉***a_flag,然後再讀一邊dr暫存器。具體參考這篇文章:《stm32串列埠中斷卡死主迴圈問題分析》

2.關於usart_it_rxne這個標誌位,資料手冊有如下解釋

usart_receivedata();裡包含了對usart_dr的讀操作,任何對usart_dr的讀操作都可以使整個標誌位清零,在中斷中我們使用清除標誌位的函式對其進行二次操作,是為了防止不正常情況下進入中斷時,標誌位也能夠被清除。

STM32F10x系列UART中斷異常除錯經歷

硬體環境 stm32f105rct6 軟體環境 freertosv8 問題描述 採用中斷方式接收資料,然後將收到的一幀資料放入訊息佇列,然後有專門的乙個任務用來從訊息佇列中取資料並處理。jlink除錯以及燒錄執行都是可以的,但是當隨著通訊頻率的增加以及執行時間的加長,系統會出現 宕機 即,不停的進入...

stm32f10x 中斷程式設計框架

1,初始化nvic,用於處理中斷 2,初始化要連線到exti的gpio 3,初始化exti用於產生中斷 事件 4,編寫中斷服務函式 5,main函式 1 設定優先順序分組 misc.h中void nvic prioritygroupconfig uint32 t nvic prioritygroup...

STM32F10X入門 流水燈

2019 3 16 2019 3 19 core cm32.c stdin.h中定義了字元型 stm32f10x.h stm32f10x conf.h中定義了引用的外設標頭檔案 庫檔案之間的依賴呼叫關係 pngstm32f10x.h檢視位址對映 比如define gpioa base apb2per...