0

我对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 对板子进行编程
4

1 回答 1

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);被调用

于 2021-03-08T09:36:20.477 回答