stm32之外部中斷該如何使用

2022-05-14 12:09:56 字數 3928 閱讀 7212

中斷對於開發嵌入式系統來講的地位絕對是毋庸置疑的,在c51微控制器時代,一共只有5個中斷,其中2個外部中斷,2個定時/計數器中斷和乙個串列埠中斷,但是在stm32中,中斷數量大大增加,而且中斷的設定也更加複雜。今天就將來**一下關於stm32中的中斷系統。

1 基本概念

arm coetex-m3核心共支援256個中斷,其中16個內部中斷,240個外部中斷和可程式設計的256級中斷優先順序的設定。stm32目前支援的中斷共84個(16個內部+68個外部),還有16級可程式設計的中斷優先順序的設定,僅使用中斷優先順序設定8bit中的高4位。

stm32可支援68個中斷通道,已經固定分配給相應的外部裝置,每個中斷通道都具備自己的中斷優先順序控制位元組pri_n(8位,但是stm32中只使用4位,高4位有效),每4個通道的8位中斷優先順序控制字構成乙個32位的優先順序暫存器。68個通道的優先順序控制字至少構成17個32位的優先順序暫存器。

4bit的中斷優先順序可以分成2組,從高位看,前面定義的是搶占式優先順序,後面是響應優先順序。按照這種分組,4bit一共可以分成5組

第0組:所有4bit用於指定響應優先順序;

第1組:最高1位用於指定搶占式優先順序,後面3位用於指定響應優先順序;

第2組:最高2位用於指定搶占式優先順序,後面2位用於指定響應優先順序;

第3組:最高3位用於指定搶占式優先順序,後面1位用於指定響應優先順序;

第4組:所有4位用於指定搶占式優先順序。

所謂搶占式優先順序和響應優先順序,他們之間的關係是:具有高搶占式優先順序的中斷可以在具有低搶占式優先順序的中斷處理過程中被響應,即中斷巢狀。

當兩個中斷源的搶占式優先順序相同時,這兩個中斷將沒有巢狀關係,當乙個中斷到來後,如果正在處理另乙個中斷,這個後到來的中斷就要等到前乙個中斷處理完之後才能被處理。如果這兩個中斷同時到達,則中斷控制器根據他們的響應優先順序高低來決定先處理哪乙個;如果他們的搶占式優先順序和響應優先順序都相等,則根據他們在中斷表中的排位順序決定先處理哪乙個。每乙個中斷源都必須定義2個優先順序。

有幾點需要注意的是:

1)如果指定的搶占式優先級別或響應優先級別超出了選定的優先順序分組所限定的範圍,將可能得到意想不到的結果;

2)搶占式優先級別相同的中斷源之間沒有巢狀關係;

3)如果某個中斷源被指定為某個搶占式優先級別,又沒有其它中斷源處於同乙個搶占式優先級別,則可以為這個中斷源指定任意有效的響應優先級別。

2 gpio外部中斷

stm32中,每乙個gpio都可以觸發乙個外部中斷,但是,gpio的中斷是以組位乙個單位的,同組間的外部中斷同一時間只能使用乙個。比如說,pa0,pb0,pc0,pd0,pe0,pf0,pg0這些為1組,如果我們使用pa0作為外部中斷源,那麼別的就不能夠再使用了,在此情況下,我們只能使用類似於pb1,pc2這種末端序號不同的外部中斷源。每一組使用乙個中斷標誌extix。exti0 – exti4這5個外部中斷有著自己的單獨的中斷響應函式,exti5-9共用乙個中斷響應函式,exti10-15共用乙個中斷響應函式。

對於中斷的控制,stm32有乙個專用的管理機構:nvic。對於nvic的詳細解釋,可以參考《arm cortex-m3權威指南》,joseph yiu著,宋岩譯,北京航空航天大學出版社出版,第8章nvic與中斷控制。中斷的使能,掛起,優先順序,活動等等部都是nvic在管理的。因為我學習stm32重點在於如何開發程式,所以內部的一些東西,在此我就不詳細說明了,有感興趣的可以參看上面提到的那本數。

3 程式開發

其實上面那些基本概念和知識只是對stm32的中斷系統有乙個大概的認識,用程式說話將會更能夠加深如何使用中斷。使用外部中斷的基本步驟如下:

1. 設定好相應的時鐘;

2. 設定相應的中斷;

3. io口初始化;

4. 把相應的io口設定為中斷線路(要在設定外部中斷之前)並初始化;

5. 在選擇的中斷通道的響應函式中中斷函式。

由於我用的奮鬥開發板沒有引出相應的晶元引腳,所以只能用按鍵來觸發相應的中斷。根據原理圖,k1/k2/k3連線的是pc5/pc2/pc3,因此我將用exti5/exti2/exti3三個外部中斷。pb5/pd6/pd3分別連線了三個led燈。中斷的效果是按下按鍵,相應的led燈將會被點亮。

1. 設定相應的時鐘

首先需要開啟gpiob、gpioc和gpioe(因為按鍵另外一端連線的是pe口)。然後由於是要用於觸發中斷,所以還需要開啟gpio復用的時鐘。相應的函式在gpio的學習筆記中有了詳細了解釋。詳細**如下:

void

rcc_cfg()

設定相應的時鐘所需要的rcc函式在stm32f10x_rcc.c中,所以要在工程中新增此檔案。

2. 設定好相應的中斷

設定相應的中斷實際上就是設定nvic,在stm32的韌體庫中有乙個結構體nvic_inittypedef,裡面有相應的標誌位設定,然後再用nvic_init()函式進行初始化。詳細**如下:

void

nvic_cfg()

由於有3個中斷,因此根據前文所述,需要有3個bit來指定搶占優先順序,所以選擇第2組。又由於exti5-9共用乙個中斷響應函式,所以exti5選擇的中斷通道是exti9_5_irqchannel,詳細資訊可以在標頭檔案中查詢得到。用到的nvic相關的庫函式在stm32f10x_nivc.c中,需要將此檔案複製並新增到工程中。具體位置可以檢視關於gpio的筆記。這段**編譯起來沒有任何問題,但是在鏈結的時候就會報錯,需要把stm32f10xr.lib加入工程中,具體位置在…\keil\arm\rv31\lib\st\stm32f10xr.lib。

3. io口初始化

void

io_cfg()

其中連線外部中斷的引腳需要設定為輸入狀態,而連線led的引腳需要設定為輸出狀態,初始化pe.2是為了使得按鍵的另外一端輸出低電平。gpio中的函式在stm32f10x_gpio.c中。

4. 把相應的io口設定為中斷線路

由於gpio並不是專用的中斷引腳,因此在用gpio來觸發外部中斷的時候需要設定將gpio相應的引腳和中斷線連線起來,具體**如下:

void

exti_cfg()

exti_cfg中需要呼叫到的函式都在stm32f10x_exti.c。

5. 寫中斷響應函式

stm32不像c51微控制器那樣,可以用過interrupt關鍵字來定義中斷響應函式,stm32的中斷響應函式介面存在中斷向量表中,是由啟動**給出的。預設的中斷響應函式在stm32f10x_it.c中。因此我們需要把這個檔案加入到工程中來。

在這個檔案中,我們發現,很多函式都是只有乙個函式名,並沒有函式體。我們找到exti2_irqhandler()這個函式,這就是exti2中斷響應的函式。我的目標是將led燈點亮,所以函式體其實很簡單:

voidexti2_irqhandler(void)  

voidexti3_irqhandler(

void)  

voidexti9_5_irqhandler(

void

)

由於exti5-9是共用乙個中斷響應函式,因此所有的exti5 – exti9的響應函式都寫在這個裡面。

6. 寫主函式

#include"

stm32f10x_lib.h

"void

rcc_cfg();

void

io_cfg();

void

exti_cfg();

void

nvic_cfg();

intmain()

main函式前是函式宣告,main函式函式體中都是呼叫初始化配置函式,然後進入死迴圈,等待中斷響應。

由於文中牽涉到很多庫函式,我們可以通過查詢庫函式說明文件來了解相應的函式有些什麼作用,在《arm®-based32-bit mcu stm32f101xx and stm32f103xx firmware library》中。網上也有中文版的說明文件可供參考。

中斷資料

(stm32中斷系統)

STM32之外部中斷

首先配置外部中斷的輸入引腳和中斷源 void lcr config void 選了gpio8作為中斷輸入,中斷源為exti line8 中斷服務函式由於啟動函式定義 export exti9 5 irqhandler weak 故在檔案stm32f10x it.c m3為例 中定義了各類中斷服務函式...

stm32之外部中斷

外部中斷 事件控制器包含多達 19 個用於產生事件 中斷請求的邊沿檢測器。每根輸入線都可單獨進行配置,以選擇型別 中斷或事件 和相應的觸發事件 上公升沿觸發 下降沿觸 發或邊沿觸發 每根輸入線還可單獨遮蔽。掛起暫存器用於保持中斷請求的狀態線。其中有16條是對應於gpio的 核心中會有乙個nvic 巢...

STM32學習之外部中斷

外部中斷 事件控制器由19 個產生事件 中斷要求的邊沿檢測器組成。每個輸入線可以獨 地配置輸入型別 脈衝或掛起 和對應的觸發事件 上公升沿或下 沿或者雙邊沿都觸發 每個輸入線都可以被獨 的遮蔽。掛起暫存器保持著狀態線的中斷要求。nvic驅動有多種用途 例如使能或者失能irq中斷,使能或者失能單獨的i...