一、背景有個需求,io口檢測上公升沿,然後做相應的動作。在此記錄stm32f103的外部中斷結構及配置方法,
以備下次快速上手使用。
有許多不太明白,又是老司機(:-d)幫忙,真的是站在別人的肩膀上會讓你看的更遠,走的更快,
感謝老司機。
二、正文
stm32f103有68個可遮蔽中斷。(但是,真正能用的其實遠沒有這麼多,原因下面會詳述。)
有16個可程式設計的優先等級,優先等級的概念可詳見我的另外一篇部落格《stm32 之 nvic(中斷向量、
"",接著看中斷向量表,
如下圖:
該中斷向量表從高到低按照預設的中斷優先順序排序將所有可用的中斷以表的形式列出來。仔細來看每一列代表的意義:
"優先順序
":無需多言,預設的中斷優先順序次序。
"優先順序型別
":即表明,這個對應的預設優先順序是否可被配置更改,以使其優先順序公升高或者降低。
"名稱":外部中斷名稱簡寫
"說明":通過這個我們就可以清楚知道前一列的"名稱"代表的是哪個具體的外設中斷。
"位址" 位址,編譯器一般會在該位址內儲存對應的中斷處理函式指標,進而可進入到相應的中斷
處理函式做相應的處理。
然後說說外部中斷事件(exti),外部中斷事件由20個(互聯型)/19個產生事件/中斷的邊沿檢測器組
成,白話說,即gpio口可檢測到對應io口的上公升沿/下降沿/雙邊沿事件,進而產生相應中斷。
接著看外部中斷/時間框圖,如下圖:
從最右來看,輸入線連線至gpio口,檢測外部引腳的電平訊號,上公升沿/下降沿觸發器與軟體中斷事件觸發器,經過"或
"器件傳入下一級,意味著,這兩類訊號可獨立引起中斷/事件。經過"或"
後,信 號出現了分支,訊號一路進入請求掛起暫存器,若是中斷遮蔽暫存器設定為允許該訊號,則一起"與
"使能對應的中斷。另一路則是同事件遮蔽暫存器訊號相"與
",通過則產生對應的事件。
說到這,中斷和事件又有什麼不同呢?
中斷既是正常理解的中斷,中斷訊號通過後,會讓mcu的pc值跳轉到相應的中斷入口,找到對應的
中斷處理函式,然後進行中斷處理。
事件則用來向其他外設模組傳送脈衝事件,通知外設去做相應的事情,就以adc接收到脈衝事件後自動
開始adc轉換為例進行說明。
在adc中,初始化adc的結構體如下:
typedef
struct
adc_inittypedef;
選項"adc_externaltrigconv
",即是設定adc的觸發啟動方式,可配置為軟體觸發啟動,當該值配置為
"adc_externaltrigconv_ext_it11_tim8_trgo
"的時候,則adc會在ext產生脈衝事件的同時,開始自動
觸發adc轉換,與軟體觸發啟動不同的是,這種方式是硬體自動完成,不需要軟體參與。當然,不限定
只能為ext,還可以是定時器等等。
最後說說上文提及的,為什麼明明有68個可遮蔽中斷,可實際卻遠沒有這麼多。
上圖提及,gpio口通過連線到外部中斷/事件線上來完成相應的中斷請求,然後看看外部中斷通用
i/o口映像,如下圖:
外部中斷/事件線只有16個,io口卻有a~g(7)組,每組有16個引腳,從上圖可看出,實際上一次性
可用的外部中斷/事件也只能有16個,並不是io口有多少,就能有多少個外部中斷/事件。
譬如說若是第一組pa0用了第乙個中斷/事件線,那麼p(x)0就不能再被用作外部中斷輸入口了。(x
為b~g)。
外部中斷結構大致就介紹到此。接下來說說,結合庫函式,如何讓外部中斷配置成功並工作。一
一般步驟為:
-->初始化對應io口為輸入;
--> 使能對應io口時鐘,並設定io口與外部中斷/事件線的聯絡;
注意:由於此處用了外部中斷,所以對應的復用時鐘要開啟!
void
gpio_extilineconfig(uint8_t gpio_portsource, uint8_t gpio_pinsource);
"gpio_portsource
":選擇對應的gpio口。
"gpio_pinsource
" :選擇對應的外部中斷/事件線。
--> 初始化外部中斷/事件線,並配置觸發模式(上邊沿/下邊沿/雙邊沿);
void exti_init(exti_inittypedef*exti_initstruct)
結構體"exti_initstruct
"如下:
typedef
struct
exti_inittypedef;
-->設定nvic,並使能中斷;
詳見nvic部落格,不再詳述
-->寫中斷處理函式。
stm32f103外部中斷函式共有6個:
exti0_irqhandler
exti1_irqhandler
exti2_irqhandler
exti3_irqhandler
exti4_irqhandler
exti9_5_irqhandler
exti15_10_irqhandler
外部中斷"0
"->"4"
有獨立的中斷處理函式;
外部中斷"5
"->"
9"共用中斷函式"
exti9_5_irqhandler";
外部中斷"10
"->"
15"共用中斷函式"
exti15_10_irqhandler";
中斷函式示例如下:
void exti9_5_irqhandler(void
)
} 三、參考鏈結
stm32 外部中斷學習筆記
至此,記錄完畢。
2016-12-2
記錄地點:深圳wz
stm32f103外部中斷
void extix init void 外部中斷0服務程式 void exti9 5 irqhandler void 這是簡單的外部中斷的配置,pc7作為中斷輸入 上面補充io口的初始化 gpio initstructure.gpio mode gpio mode ipu pc6配置為快充指示 1...
基於STM32F103外部IO中斷的按鍵控制程式設計
在系統中sw1按鍵與stm32f103的pb3引腳相連線,sw2按鍵與stm32f103的pa15引腳相連線。void key gpio config void void exti config void unsigned char bz 0 pb3的中斷服務程式 void exti3 irqhan...
STM32F103 中斷綜述
一 中斷核心 stm32的中斷很強大,每個外設都可以產生中斷,f103在核心水平上搭載了異常響應系統,系統異常有8個 算上reset和hardfault也就10個 外部中斷有60個,但是根據nvic 巢狀向量中斷控制器,控制整個晶元中斷相關的功能 ip 中斷優先順序暫存器 陣列中預留了240個位置 ...