STM32是怎樣進(jìn)入執(zhí)行中斷函數(shù)xxx_IRQHandler(void)的
在STM32單片機(jī)的編程當(dāng)中,中斷函數(shù)的名稱都是xxx_IRQHandler格式的。那當(dāng)編譯程序的時候是怎么知道這是一個中斷函數(shù)的呢?
每個中斷都是有入口地址的。程序在執(zhí)行過程中遇到中斷的時候,會先判斷這個中斷的類型,根據(jù)類型再到中斷向量表中查找,找到之后,根據(jù)表中指明的地址,程序就跳到該地址開始執(zhí)行代碼。
ST提供的固件庫當(dāng)中,有提供一個stm32f10x_it.c文件,打開之后會發(fā)現(xiàn)里面放的都是些空函數(shù),但是名字都是“xxx_Handler()”格式,需要使用某個中斷的時候,在代碼中使能該中斷,并到這個文件中將中斷服務(wù)函數(shù)添加上,就可以了。
而這些名字就是一個個的中斷函數(shù)入口地址。在啟動代碼中便有這些定義。如下圖所示:
可以看到,里面定義了一個個名稱,這些名稱就是中斷函數(shù)入口的地址,用這些名稱來代替了具體的地址值。
其中DCD是一條數(shù)據(jù)定義偽指令,用于分配一片連續(xù)的字存儲單元并用指定的數(shù)據(jù)初始化。當(dāng)配置好相應(yīng)外設(shè)的控制寄存器中斷使能時,當(dāng)發(fā)生中斷(異常)時,該異常被Cortex-M3內(nèi)核接受,對應(yīng)的異常Handler就會執(zhí)行。而這個響應(yīng)過程都是硬件來完成的,當(dāng)然為了決定Handler的入口地址,Cortex-M3使用了“向量表查表機(jī)制”。startup_stm32f10x_hd.s啟動文件已經(jīng)為相應(yīng)外設(shè)的中斷服務(wù)函數(shù)賦予了相應(yīng)的地址。所以在異常發(fā)生后,CPU進(jìn)入異常模式,同時程序計數(shù)器PC自動指向異常入口地址,進(jìn)而執(zhí)行中斷服務(wù)函數(shù)中的應(yīng)用。