地瓜patch 发表于 2025-4-30 22:57

STM32F103ZGT6 的 UART1 接收数据时不能触发中断

用STM32F103ZGT6 的 UART1 接收数据时触发中断处理程序。将 STM32CubeIDE 生成的代码,稍微修修改,在状态寄存器 USART1.SR 中设置“Byte Received”标志 RXNE (设置为 1),中断通过控制USART1 位 RXNEIE 启用,在 NVIC 中启用了中断。第 5 位ISER1对应于 USART1 全局中断的中断 37。但是中断处理程序 USART1_IRQHandler() 没能出发中断。仿真中 USART1_IRQHandler() 处理程序的地址是 0x80007f8。但是中断矢量表中(矢量位于 0x0000_00D4)中的数据是 0x80007f9而不是 0x80007f8,地址相差 1。在 STM32CubeIDE 中使用 API 调用 HAL_UART_Receive_IT()接收字符。差 1 是什么问题?可能是 int 处理程序未触发的原因吗?

stormwind123 发表于 2025-5-7 12:34

未使能USART1或GPIOA时钟?

flycamelaaa 发表于 2025-5-7 14:09

调用GPIO_Init()将PA10配置为浮空输入或上拉输入。

powerantone 发表于 2025-5-7 15:06

USART_IT_RXNE中断未使能?

stormwind123 发表于 2025-5-7 19:00

检查PA10引脚连接是否正确,信号电平是否匹配。

probedog 发表于 2025-5-7 22:00

启用USART1接收中断。

暖了夏天蓝了海 发表于 2025-5-12 13:00

STM32的中断向量表要求每个中断处理程序的地址按4字节对齐(ARM Cortex-M3规范)。

淡漠安然 发表于 2025-5-12 13:30

如果USART1_IRQHandler的地址是0x80007F8,但向量表中存储的地址是0x80007F9,说明地址未正确对齐。

一秒落纱 发表于 2025-5-12 15:00

编译器可能未强制对齐函数地址,或链接脚本(.ld文件)未正确配置。

光辉梦境 发表于 2025-5-12 16:03

在STM32CubeIDE中,检查链接脚本(通常为STM32F103ZGTx_FLASH.ld),确保中断向量表按4字节对齐

夜阑风雨 发表于 2025-5-12 16:32

建议保证USART1_IRQHandler函数的定义无额外修饰(如__attribute__((aligned(4))))。

冰春彩落下 发表于 2025-5-12 17:00

如果USART1_IRQHandler被错误地修饰(如使用__attribute__((weak))或未正确声明为中断处理程序),可能导致地址偏移。

江河千里 发表于 2025-5-12 17:59

向量表偏移寄存器(VTOR):如果启用了向量表重映射(通过SCB->VTOR),需确保VTOR指向正确的起始地址。

远山寻你 发表于 2025-5-12 18:25

检查反汇编代码:在STM32CubeIDE中,右键点击USART1_IRQHandler函数 > Open Call Hierarchy > Disassembly,确认其实际地址是否为0x80007F8。如果地址显示为0x80007F9,可能是编译器优化或对齐问题。

三生万物 发表于 2025-5-12 18:53

在startup_stm32f103xg.s文件中,检查USART1_IRQHandler的条目是否与函数地址一致

别乱了阵脚 发表于 2025-5-12 19:13

一定要确认已启用USART1全局中断,确认UART1的TX/RX引脚(PA9/PA10)无短路或断路,外部设备已正确发送数据。
页: [1]
查看完整版本: STM32F103ZGT6 的 UART1 接收数据时不能触发中断