用過GD32 MCU的小伙伴們都知道,程序是順序執行的,但當有中斷來的時候程序會跳轉到中斷函數,執行完中斷函數后程序又繼續回到原來的位置繼續執行,那么你們知道MCU是如何找到中斷函數入口的嗎?
今天我們就以GD32F303系列的EXTI0中斷來描述下MCU是如何進入中斷的。
首先來看一個簡單的代碼(以Keil為開發環境):

這段程序初始化了兩個LED燈,并將一個按鍵設置為中斷模式,這里用的是PA0,所以中斷號也為0,即EXTI0。
再來看一下中斷函數:

中斷函數也很簡單,當有中斷發生的時候,去翻轉一個LED燈狀態。
好,我們通過map文件看下這個中斷函數的地址在哪里(不會的小伙伴可以看看前面的視頻——《如果查看GD32 Keil和IAR工程的map文件》哦):

沒錯,中斷函數就保存在0x08000193開始的flash地址中,且該函數占用了24個byte的空間。
正常情況下,程序是不會跳轉到這個地址去執行的,那為什么中斷信號一來,程序就直接跳轉過去了呢?
下面重點來了,小伙伴們要仔細聽哦。
我們來看下GD32F30x系列的啟動文件:

其中用匯編寫了一段代碼:使用DCD指令(DCD指令是為特定的數據分配地址)將棧頂指針__initial_sp和中斷函數分配到flash最開始的地址中去,我們看下flash中的數據:

用紅框標注的數據就是程序的棧頂指針,再看下第23個地址也就是0x08000058保存的數據,就是0x08000193,剛好就是中斷函數EXTI0_IRQHandler的入口。

實際上,flash最開始保存的這一段數據有個專有名詞——中斷向量表,可以通過GD32F30x的用戶手冊查到:

注意:因為向量編號是從0開始的(0號即為棧頂指針),所以EXTI0的中斷編號為22,也就存在flash第23個地址(按字對齊)中。
當有EXTI0中斷發生,MCU會知道是22號中斷來了,內部總線就會去查flash最開始地址中的中斷向量表,找到第23個地址(0x08000058),并取得里面的數據也就是中斷函數的入口,然后就跳轉到中斷函數中執行程序了。
本期視頻內容會有點繞,小伙伴們可以多看幾遍哦,了解MCU是如何進入中斷函數對于平時的開發是非常有用的,如果有不懂的小伙伴,歡迎評論區留言討論哦。
-
單片機
+關注
關注
6063文章
44930瀏覽量
647233 -
mcu
+關注
關注
146文章
17854瀏覽量
360762 -
嵌入式
+關注
關注
5141文章
19545瀏覽量
315219 -
GD32
+關注
關注
7文章
419瀏覽量
25177
發布評論請先 登錄
GD32 MCU 入門教程】GD32 MCU 常見外設介紹(12)FMC 模塊介紹


GD32的外部中斷介紹
《GD32 MCU原理及固件庫開發指南》+讀后感
GD32系列外部中斷

兆易創新GD32 MCU選型手冊,適用于GD32全系列MCU
【GD32 MCU 入門教程】GD32 MCU 常見外設介紹(14)RTC 模塊介紹

【GD32 MCU入門教程】GD32 MCU GPIO 結構與使用注意事項

評論