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

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

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

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

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

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

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

注意:因為向量編號是從0開始的(0號即為棧頂指針),所以EXTI0的中斷編號為22,也就存在flash第23個地址(按字對齊)中。
當(dāng)有EXTI0中斷發(fā)生,MCU會知道是22號中斷來了,內(nèi)部總線就會去查flash最開始地址中的中斷向量表,找到第23個地址(0x08000058),并取得里面的數(shù)據(jù)也就是中斷函數(shù)的入口,然后就跳轉(zhuǎn)到中斷函數(shù)中執(zhí)行程序了。
本期視頻內(nèi)容會有點繞,小伙伴們可以多看幾遍哦,了解MCU是如何進(jìn)入中斷函數(shù)對于平時的開發(fā)是非常有用的,如果有不懂的小伙伴,歡迎評論區(qū)留言討論哦。
-
單片機(jī)
+關(guān)注
關(guān)注
6076文章
45492瀏覽量
670182 -
mcu
+關(guān)注
關(guān)注
147文章
18917瀏覽量
397913 -
嵌入式
+關(guān)注
關(guān)注
5198文章
20435瀏覽量
333938 -
GD32
+關(guān)注
關(guān)注
7文章
432瀏覽量
27327
發(fā)布評論請先 登錄
GD32 MCU 入門教程】GD32 MCU 常見外設(shè)介紹(12)FMC 模塊介紹
GD32的外部中斷介紹
《GD32 MCU原理及固件庫開發(fā)指南》+讀后感
GD32系列外部中斷
兆易創(chuàng)新GD32 MCU選型手冊,適用于GD32全系列MCU
GD32 MCU啟動后如何運行到main函數(shù)
不同型號的GD32 MCU如何區(qū)分?
【GD32 MCU 入門教程】GD32 MCU 常見外設(shè)介紹(14)RTC 模塊介紹
【GD32 MCU入門教程】GD32 MCU GPIO 結(jié)構(gòu)與使用注意事項
GD32 MCU是如何進(jìn)入中斷函數(shù)的
評論