转载: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 ); //
}
}