为什么我的中断被调用,但不会进入处理程序?

Why does my interrupt get called, but won't enter the handler?

本文关键字:处理 程序 中断 我的 调用 为什么      更新时间:2023-10-16

我正在尝试以中断模式接收来自USART的通信。调试器向我显示,在按键时调用了中断,但执行卡在向量表定义中。

我用以下内容初始化我的usart。

static void MX_USART2_UART_Init(void)
{
  huart2.Instance = USART2;
  huart2.Init.BaudRate = 19200;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE END USART2_Init 2 */
  LED_Initialize();
  USART2->CR1=USART_CR1_RE|USART_CR1_TE|USART_CR1_UE|USART_CR1_RXNEIE; // Enable interrupt
  NVIC_SetPriority(USART2_IRQn, 2); // set priority level
  NVIC_EnableIRQ(USART2_IRQn); // Enable in NVIC
}

void USART2_IRQHandler(void)
{
    blink_led();
}

如果我在调试模式下运行应用程序,点击一个键,停止并单步执行代码,我发现它正在循环这里的分支指令,在包含的 startup_stm32f446xx.s 内。

USART2_IRQHandler
        B USART2_IRQHandler
        PUBWEAK USART3_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)

所以我知道正在生成中断,但它似乎找不到我的处理程序。即使不在调试模式下,我的 LED 也不会闪烁,这是我单独测试过的功能。我不确定此问题是否来自 HAL 库。我已经通读了他们的文档和变体以及他们的 NVIC 启用说明以获得相同的结果。usart 在轮询中工作正常,但我的功能需要中断。

你的问题有"c ++"标签,所以我假设你用C++编译器编译你的项目。C++编译器名称-破坏函数名称,这会阻止分支指令找到其目标,因为它的真实名称不再USART2_IRQHandler。

您需要在 ISR 前面加上外部"C">,以告诉C++不要对其进行命名。

extern "C" void USART2_IRQHandler(void) {
    blink_led(); 
}