今天在看stm32的中斷,一時間不理解stm32主函數是如何進入中斷函數的,按C編程的理解,會有個特定的入口之類的,但是看demo過程中沒有發現入口。
以串口中斷服務函數void USART1_IRQHandler(void) 為例,首先用到串口中斷,需要先設定串口中斷初始化以及串口初始化,另外void USART1_IRQHandler(void) 中斷服務函數也應該寫好。
發現在stm32的啟動文件startup_stm32f10x_md.s中寫到
DCD USART1_IRQHandler
其中DCD是一條數據定義偽指令,用於分配一片連續的字存儲單元並用指定的數據初始化。
庫里定義 #define USART1 ((USART_TypeDef *) USART1_BASE)
同時 #define USART1_BASE (APB2PERIPH_BASE + 0x3800)
當配置好USART1的控制寄存器中斷使能時,當發生中斷(異常)時,該異常被Cortex-M3內核接受,對應的異常Handler就會執行。而這個響應過程都是硬件來完成的,當然為了決定Handler的入口地址,Cortex-M3使用了“向量表查表機制”。startup_stm32f10x_md.s啟動文件已經為USART1_IRQHandler賦予了該地址。所以在異常發生后,CPU進入異常模式,同時程序計數器PC自動指向異常入口地址,也就是USART1_IRQHandler,進而執行中斷服務函數中的應用。執行完之后再回到主函數繼續執行。