在USER文件夹下有stm32f10x_it.c文件,结尾的it即为interrupt的缩写,这个文件存放中断服务程序,打开文件可以看到里面已经有了一些默认的空函数,当需要用到这些中断功能时,就可以在相应的函数中写入对应的中断处理程序。
在文件结尾,有:
/**
* @brief This function handles PPP interrupt request.
* @param None
* @retval None
*/
/*void PPP_IRQHandler(void)
{
}*/
这个被注释的函数PPP_IRQHandler(void)是提供给用户编写外设中断函数用的,比如我们接下来要写的外部中断函数,其中PPP并不能随意填写,这里的名称是和startup_stm32f10x_hd.s文件中设置好的异常向量标号一致的,了解汇编和单片机地址的朋友应该明白为什么,这里可以简要说明一下:
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
/**
* @brief This function handles Hard Fault exception.
* @param None
* @retval None
*/
void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
}
}
因此,在startup_stm32f10x_hd.s文件中找到EXTI0对应的标号EXTI0_IRQHandler,在stm32f10x_it.c文件中写入中断处理函数,函数名即为标号,和上一篇一样,将LED取反就可以:
/**
* @brief This function handles EXTI0(PA0) interrupt request.
* @param None
* @retval None
*/
void EXTI0_IRQHandler(void)
{
BitAction status;
if (EXTI_GetITStatus(EXTI_Line0) == SET)
{
status = (BitAction)(1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13));
GPIO_WriteBit(GPIOC, GPIO_Pin_13, status);
EXTI_ClearITPendingBit(EXTI_Line0);
}
}