Nucleo开发板与STM32L4R5的向量表不一致
用于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不会执行程序,直到按下复位按钮。我不确定为什么会发生这些现象。无法使用调试器,因此我想找到解决向量表错误问题的原因,以便重新调试。如何解决呢?输出二进制/映射文件一切正常。断开连接并硬复位后,不再卡住。你这描述很详细,怀疑是不是启动文件里向量表偏移被改过了? 我之前也遇到类似情况,试试把 SCB->VTOR 手动设置成你期望的向量表起始地址? 听起来像是 BOOT 配置问题,有没有看过 BOOT0 和 BOOT1 管脚状态? 你这个现象像是调试器刚烧完程序还没复位导致走了系统 BootLoader。 我建议你检查下 Option Bytes,把 BOOT 配置改成从 Flash 启动再试试。 CubeIDE 有时候链接器文件会有两个向量表定义,看看有没有冲突? 卡在 HAL_Init 通常跟 Systick 中断没对齐有关系,外设初始化太多了也可能溢出栈空间。 你说的“注释掉代码就好了”是不是因为堆栈大小不够?试着把 FreeRTOS 的最小堆栈调大点? 建议你用 ST-Link Utility 或 STM32CubeProgrammer 连上看下 Flash 里实际烧进去的向量表是不是和 Map 一致。 我有块 L4R5 板子也是上电不跑,要按复位,换个电源或短接 BOOT0 再试试? 编译后查看.map文件,确认g_pfnVectors地址为0x08000000。
通过STM32CubeProgrammer读取Flash前128字节,检查向量表内容是否与二进制文件一致。
若问题仍存在,尝试另一块开发板排除硬件故障。
页:
[1]