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

[复制链接]
 楼主| 地瓜patch 发表于 2025-4-30 22:57 | 显示全部楼层 |阅读模式
用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)无短路或断路,外部设备已正确发送数据。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:出一块TI-PLABS-AMP-EVM

1803

主题

14836

帖子

29

粉丝
快速回复 在线客服 返回列表 返回顶部