Skip to content

中断

实际的介绍看固件库笔记

使用

配置分组的模式AIRCR寄存器[10:8], 使用HAL_NVIC_SetPriorityGrouping()

这个函数在HAL_Init函数里面会有设置

设置中断的优先级IPRxbit[7:4], HAL_NVIC_SetPriority()

使能中断ISERx, HAL_NVIC_EnableIRQ()

GPIO中断

image-20231125195759940

  1. 使能GPIO时钟
  2. 设置GPIO的输入模式
  3. 使能AFIO/SYSCFG时钟
  4. 设置EXTI和IO的对应关系
  5. 设置EXTI屏蔽, 上下沿
  6. 设置NVIC
  7. 设置中断服务函数, 编写对应的函数, 清除标志位

使用HAL_GPIO_Init函数一步到位

  1. 使能GPIO时钟
  2. 使用HAL_GPIO_Init函数一步到位
  3. 设置中断分组HAL_NVIC_SetPriorityGrouping
  4. 使能中断HAL_NVIC_EnableIRQ
  5. 设计中断函数EXTIx_IRQHandler中断服务函数

stm32只有EXTI0-4, EXTI9_5, EXTI15_10七个中断函数

HAL库回调函数

image-20231125203940587

EXTI0-15的中断处理函数放在gpio.c文件里面

c
//中断函数
void EXTI4_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_Pin_4);
}


/**
  * @brief  This function handles EXTI interrupt request.
  * @param  GPIO_Pin: Specifies the pins connected EXTI line
  * @retval None
  */
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
  /* EXTI line interrupt detected */
  if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)
  {
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
    HAL_GPIO_EXTI_Callback(GPIO_Pin);
  }
}

/**
  * @brief  EXTI line detection callbacks.
  * @param  GPIO_Pin: Specifies the pins connected EXTI line
  * @retval None
  */
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(GPIO_Pin);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_GPIO_EXTI_Callback could be implemented in the user file
   */
}