为什么我的中断被调用,但不会进入处理程序?
Why does my interrupt get called, but won't enter the handler?
我正在尝试以中断模式接收来自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();
}
相关文章:
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 为什么我的 IExtractIcon 处理程序没有被调用?
- 在遍历处理程序的向量时注册和注销处理程序
- 有可能在信号处理程序中设置promise吗
- 在信号处理程序中捕获C++未处理的异常并恢复应用程序
- 通过安装信号处理程序关闭多线程应用程序
- QDateTime::toString() 在退出处理程序中使用时失败
- 如何在 WindowProc 处理程序中区分箭头键和数字键盘?
- async_write完成处理程序最早何时完成?
- C++事件系统 - 多态事件和事件处理程序
- 具有shared_ptr的处理程序中的分段错误
- 为什么我的信号处理程序只执行一次?
- GTK C++:找不到信号处理程序 您是否使用 -rdynamic 进行了编译?
- 如何使用从处理程序调度的最终回调将响应异步返回给调用方on_read?
- C++ 在信号处理程序后继续执行
- wxWidgets 拖放文件事件处理程序初始化问题(无效static_cast)
- 某些 boost::asio 异步函数是否将处理程序连接到操作,以便处理程序被触发一次?
- 没有信号处理程序的POSIX定时器的目的是什么?
- 处理程序的模块列表中有一个错误的模块"WebSocketModule"