我正在尝试以中断模式接收来自USART的通信。调试器向我展示了在按键时调用了中断,但是执行陷入了向量表定义。
我用以下命令初始化我的art。
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();
}
Run Code Online (Sandbox Code Playgroud)
如果我以调试模式运行该应用程序,按下一个键,然后停止并逐步执行代码,我发现它在包含的startup_stm32f446xx.s内部的分支指令上循环。
USART2_IRQHandler
B USART2_IRQHandler
PUBWEAK USART3_IRQHandler
SECTION .text:CODE:REORDER:NOROOT(1)
Run Code Online (Sandbox Code Playgroud)
因此,我知道该中断正在生成,但似乎找不到我的处理程序。即使不在调试模式下,我的LED也不会闪烁,这是我已经单独测试的功能。我不确定此问题是否来自HAL库。我通读了他们的文档及其NVIC启用说明的变体,以得到相同的结果。usart在轮询中工作正常,但我需要中断其功能。
您的问题带有“ c ++”标记,因此我假设您使用C ++编译器编译项目。C ++编译器使用name-mangle函数名称,这阻止了分支指令查找其目标,因为它的真实名称不再是USART2_IRQHandler。
您需要在ISR前面加上“ C”作为前缀,以告诉C ++不要对其进行名称修改。
extern "C" void USART2_IRQHandler(void) {
blink_led();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
80 次 |
| 最近记录: |