[STM32L4] Nucleo开发板与STM32L4R5的向量表不一致

[复制链接]
 楼主| Hitomi22 发表于 2025-7-21 23:20 | 显示全部楼层 |阅读模式
用于Nucleo STM32L4R5开发板。我遇到了向量表不正确的问题,具体原因尚不明确。以下是详细说明:
该项目启用了若干外设和FreeRTOS。我使用了默认生成的main.c,并在默认任务函数中添加了一些调用。除了在默认任务函数中添加一些功能外,我完全没有修改生成的代码(如HAL等)。当添加“过多”代码时,通过STMCubeIDE编程设备(即调试/运行)时,设备会在HAL_Init()中卡住,此时HAL滴答定时器中断触发。我发现向量表中填充了指向系统内存(0x1fffxxxx)的指针,导致MCU在那里陷入无限循环。需要注意的是,二进制/映射编译输出中的向量表绝对正确,IRQ函数指针并未指向系统内存,而是指向了IRQ函数条目。
如果我注释掉默认任务函数中的部分代码,它突然又能正常工作。向量表会填充IRQ函数指针,MCU也不会在HAL_Init()中卡住。这一点通过使用板载ST-link调试器读取地址0x0处的向量表得到了确认。
此外,如果我使用一个会导致卡住的二进制文件,断开并重新连接ST-link USB线并进行硬复位后,MCU不会卡住。
最后我注意到,与我拥有的其他Nucleo开发板不同,如果给STM32L4R5 Nucleo开发板上电,MCU不会执行程序,直到按下复位按钮。
我不确定为什么会发生这些现象。无法使用调试器,因此我想找到解决向量表错误问题的原因,以便重新调试。如何解决呢?
输出二进制/映射文件一切正常。断开连接并硬复位后,不再卡住。

评论

上电程序不执行还需要手动复位也挺奇怪的  发表于 2025-7-22 22:42
公羊子丹 发表于 2025-7-22 07:28 | 显示全部楼层
你这描述很详细,怀疑是不是启动文件里向量表偏移被改过了?
周半梅 发表于 2025-7-22 07:29 | 显示全部楼层
我之前也遇到类似情况,试试把 SCB->VTOR 手动设置成你期望的向量表起始地址?
帛灿灿 发表于 2025-7-22 07:30 | 显示全部楼层
听起来像是 BOOT 配置问题,有没有看过 BOOT0 和 BOOT1 管脚状态?
童雨竹 发表于 2025-7-22 07:31 | 显示全部楼层
你这个现象像是调试器刚烧完程序还没复位导致走了系统 BootLoader。
万图 发表于 2025-7-22 07:32 | 显示全部楼层
我建议你检查下 Option Bytes,把 BOOT 配置改成从 Flash 启动再试试。
Wordsworth 发表于 2025-7-22 07:33 | 显示全部楼层
CubeIDE 有时候链接器文件会有两个向量表定义,看看有没有冲突?
Bblythe 发表于 2025-7-22 07:34 | 显示全部楼层
卡在 HAL_Init 通常跟 Systick 中断没对齐有关系,外设初始化太多了也可能溢出栈空间。
Pulitzer 发表于 2025-7-22 07:35 | 显示全部楼层
你说的“注释掉代码就好了”是不是因为堆栈大小不够?试着把 FreeRTOS 的最小堆栈调大点?
Uriah 发表于 2025-7-22 07:36 | 显示全部楼层
建议你用 ST-Link Utility 或 STM32CubeProgrammer 连上看下 Flash 里实际烧进去的向量表是不是和 Map 一致。
Clyde011 发表于 2025-7-22 07:37 | 显示全部楼层
我有块 L4R5 板子也是上电不跑,要按复位,换个电源或短接 BOOT0 再试试?
jiekou001 发表于 2025-7-22 09:13 | 显示全部楼层
编译后查看.map文件,确认g_pfnVectors地址为0x08000000。

通过STM32CubeProgrammer读取Flash前128字节,检查向量表内容是否与二进制文件一致。

若问题仍存在,尝试另一块开发板排除硬件故障。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

46

帖子

0

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

44

主题

46

帖子

0

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