轉載:https://www.cnblogs.com/heny-hui/p/7130620.html
stm32的中斷號根據不同內核和型號,st公司給的官方庫中對相應的中斷號進行了設置,我們用到哪一個外設的且要用到相應的中斷功能時,在stm32fXXX.h中定義對應的型號的中斷號。若要調用相關的中斷功能,在NVIC中配置相關的中斷優先級和中斷號。STM32會內部會根據配置的中斷號在啟動文件中尋找相應的中斷函數的相應的入口函數例如在配置串口的中斷接收打贏函數時,在NVIC的配置中配置串口1的中斷函數中設置的中斷號為如下:
USART1_IRQn = 37, /*!< USART1 global Interrupt
#define DEBUG_USART_IRQ USART1_IRQn
/* 配置中斷源 */
NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
以上是配置的串口1對應的中斷號,那么他對應的中斷處理函數是怎樣的,是否可以隨便的寫?答案是不可以隨便的寫。ST公司在提供的啟動文件startup_stm32fXXX.s中都對相應的中斷號對應的中斷處理函數的入口都已經規定好了,即必須按照他提供的啟動文件的名字來在相關文件(可以不是stm32fxxx_it.c中寫驅動)寫中斷函數,但可以通過宏定義的方式來實現按照自己定義的方式來寫中斷函數。如下是中斷函數標識:
1、在startup_stm32fXXX.s定義的中斷函數名在中斷向量表中定義的__vectors __vectors end:
DCD SPI1_IRQHandler ; SPI1
DCD SPI2_IRQHandler ; SPI2
DCD USART1_IRQHandler ; USART1 //注釋:DCD是 個偽代碼,USART1_IRQHandler這個是對應上邊37號中斷的串口中斷函數
DCD USART2_IRQHandler ; USART2
DCD USART3_IRQHandler ; USART3
DCD EXTI15_10_IRQHandler ; External Line[15:10]s
在代碼中我們通過宏定義來給這個中斷處理函數起個別名來操作。
#define DEBUG_USART_IRQHandler USART1_IRQHandler //起的別名
void DEBUG_USART_IRQHandler(void)
{
uint8_t ch;
if(USART_GetITStatus(DEBUG_USART, USART_IT_RXNE) != RESET)
{
//ch = USART1->DR;
ch = USART_ReceiveData(DEBUG_USART);
printf( "%c", ch ); //
}
}