STM32HAL库中断服务函数调用过程
STM32HAL库中断服务函数调用过程
如何找到中断源,如何找到中断源对应的中断服务函数?
中断源在stm32f429xx.h文件中,与中断服务函数一一对应,中断服务函数位于启动文件startup_stm32f429xx.s之中,里面有中断向量表,存储着中断服务函数的地址。启动文件中的中断服务函数都是弱定义的【weak】,可以重新定义一个同名的函数来取代它。
如何找到中断服务函数实际调用的HAL库函数,怎么确认这种调用的存在?
有两个地方可以实现中断服务函数的内容
- 可以直接在中断源对应的中断服务函数中编写我们想要的功能
例如:
void EXTI9_5_IRQHandler(void)
{
if(__HAL_GPIO_EXTI_GET_IT( GPIO_PIN_5)!=RESET)
{
__HAL_GPIO_EXTI_CLEAR_IT( GPIO_PIN_5);
/*按下按键1的函数*/
LED_RED;
PRESS_Key1=SET;
}
else if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_6)!=RESET)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_6);
/*按下按键2的函数*/
LED_BLUE;
PRESS_Key2=SET;
}
else
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_8);
/*按下按键3的函数*/
LED_GREEN;
PRESS_Key3=SET;
}
}
- 也可以间接调用HAL库的中断回调函数来实现我们想要的功能
例如外部中断线中断调用的HAL库的公用函数为void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin),这个函数会调用回调函数HAL_GPIO_EXTI_Callback(GPIO_Pin)来处理中断,可以在这个公用函数中实现功能,也可以重新实现一下这个回调函数,在回调函数中实现功能,但是前提是先把原来的中断服务函数重定向到HAL库的中断公用函数中去。
/*外部中断线中断公用函数*/
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
/* EXTI line interrupt detected */
if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);//清除中断标志位
HAL_GPIO_EXTI_Callback(GPIO_Pin); //中断回调函数
}
}
/*中断回调函数 __weak 表示弱定义 */
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* Prevent unused argument(s) compilation warning */
__IO uint32_t tmpreg = 0x00;
UNUSED(tmpreg);
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file
*/
}
借助HAL库重新实现
//重定向中断服务函数
void EXTI9_5_IRQHandler(void)
{
HAL_GPIO_EXTI_Callback(GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_8);
}
//重新实现的中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(__HAL_GPIO_EXTI_GET_IT( GPIO_PIN_5)!=RESET)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin_5);
/*按下按键1的函数*/
LED_RED;
PRESS_Key1=SET;
}
else if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_6)!=RESET)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin_6);
/*按下按键2的函数*/
LED_BLUE;
PRESS_Key2=SET;
}
else
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin_8);
/*按下按键3的函数*/
LED_GREEN;
PRESS_Key3=SET;
}
}
把自己写的中断服务函数放在什么位置,需不需要声明?
直接放在对应的外设源文件中,重定向的函数需要在头文件中进行声明,回调函数不需要声明,因为在HAL库的头文件中已经声明了,在链接的时候由于原来的回调函数是弱定义的,会被我们定义的回调函数所替换。