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 处理程序未触发的原因吗?未使能USART1或GPIOA时钟? 调用GPIO_Init()将PA10配置为浮空输入或上拉输入。 USART_IT_RXNE中断未使能? 检查PA10引脚连接是否正确,信号电平是否匹配。 启用USART1接收中断。 STM32的中断向量表要求每个中断处理程序的地址按4字节对齐(ARM Cortex-M3规范)。
如果USART1_IRQHandler的地址是0x80007F8,但向量表中存储的地址是0x80007F9,说明地址未正确对齐。
编译器可能未强制对齐函数地址,或链接脚本(.ld文件)未正确配置。
在STM32CubeIDE中,检查链接脚本(通常为STM32F103ZGTx_FLASH.ld),确保中断向量表按4字节对齐
建议保证USART1_IRQHandler函数的定义无额外修饰(如__attribute__((aligned(4))))。
如果USART1_IRQHandler被错误地修饰(如使用__attribute__((weak))或未正确声明为中断处理程序),可能导致地址偏移。
向量表偏移寄存器(VTOR):如果启用了向量表重映射(通过SCB->VTOR),需确保VTOR指向正确的起始地址。
检查反汇编代码:在STM32CubeIDE中,右键点击USART1_IRQHandler函数 > Open Call Hierarchy > Disassembly,确认其实际地址是否为0x80007F8。如果地址显示为0x80007F9,可能是编译器优化或对齐问题。
在startup_stm32f103xg.s文件中,检查USART1_IRQHandler的条目是否与函数地址一致
一定要确认已启用USART1全局中断,确认UART1的TX/RX引脚(PA9/PA10)无短路或断路,外部设备已正确发送数据。
页:
[1]