微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

HAL_NVIC_SetPendingIRQ 是否调用 ISR 来执行?

如何解决HAL_NVIC_SetPendingIRQ 是否调用 ISR 来执行?

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

void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn);

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

我从掌握 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_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 对电路板进行编程

解决方法

谢谢@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); 时调用回调函数

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。