STM32HAL库中断服务函数调用过程

STM32HAL库中断服务函数调用过程

如何找到中断源,如何找到中断源对应的中断服务函数?
中断源在stm32f429xx.h文件中,与中断服务函数一一对应,中断服务函数位于启动文件startup_stm32f429xx.s之中,里面有中断向量表,存储着中断服务函数的地址。启动文件中的中断服务函数都是弱定义的【weak】,可以重新定义一个同名的函数来取代它。

如何找到中断服务函数实际调用的HAL库函数,怎么确认这种调用的存在?
有两个地方可以实现中断服务函数的内容

  1. 可以直接在中断源对应的中断服务函数中编写我们想要的功能

例如:

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;
	}

}
  1. 也可以间接调用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库的头文件中已经声明了,在链接的时候由于原来的回调函数是弱定义的,会被我们定义的回调函数所替换。

你可能感兴趣的:(stm32)