【问题标题】:Does HAL_NVIC_SetPendingIRQ call the ISR to execute?HAL_NVIC_SetPendingIRQ 是否调用 ISR 执行?
【发布时间】:2021-06-06 02:55:30
【问题描述】:

我对 STM32 世界真的很陌生,所以我在阅读时遇到了这个:

void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn);

这将导致中断触发,因为它是由硬件生成的。一个显着的特点 Cortex-M 处理器,它可以在 ISR 内以编程方式触发中断 另一个中断的例程。

我从 Mastering STM32 (Carmine Noviello 第 208 页)一书中得到了这个。由此我了解到,如果我们甚至从主函数设置这个挂起位,那么就会产生中断。 所以为了试试这个,我写了这段代码:

while (1)
  {
      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
      for(int i = 0; i <10000000; i++);
      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
      for(int i = 0; i <10000000; i++);
      HAL_NVIC_SetPendingIRQ(EXTI0_IRQn);
  }
}

连同这个回调函数

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_PIN){
    HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_15);
}

我已将 GPIO_PIN_0 编程为中断源,当我按下连接到 PA0 的按钮时,中断工作完美,即执行 ISR。令我惊讶的是 HAL_NVIC_SetPendingIRQ 函数不会产生中断。我不明白为什么?

更多信息:

  • 我用的是STM32F411VET6 DISCO板
  • 我正在使用STM32CubeIDE对板子进行编程

【问题讨论】:

  • 我没有使用 HAL 的经验,但我怀疑还有一层额外的 HAL 会阻止执行到达 HAL_GPIO_EXTI_Callback。可能在该层,有一些代码可以检测导致中断的 GPIO 引脚,但由于人为产生中断,因此无法检测到该引脚。

标签: stm32 interrupt cortex-m stm32f4 stm32-hal


【解决方案1】:

谢谢@Tagli。我在 stm32f4xx_hal_gpio.c 文件中找到了函数 HAL_GPIO_EXTI_IRQHandler。默认定义是这样的:

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

我知道为什么没有切换 GPIO。这与您在上面评论的原因相同。 我已经修改以证明这一点。

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
  /* EXTI line interrupt detected */
    HAL_GPIO_EXTI_Callback(GPIO_Pin);
  if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
  {
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
    HAL_GPIO_EXTI_Callback(GPIO_Pin);
  }
}

现在当HAL_NVIC_SetPendingIRQ(EXTI0_IRQn);被调用时回调函数被调用

【讨论】:

    猜你喜欢
    • 2013-05-15
    • 2016-07-14
    • 2023-04-06
    • 2010-10-23
    • 2012-04-18
    • 2011-07-16
    • 2010-11-16
    • 1970-01-01
    • 2011-11-17
    相关资源
    最近更新 更多