我目前正在将一个可运行的 Bootloader 项目从 S32K312 移植到 S32K311。我正在使用 S32 Design Studio、NXP RTD 4.9.0 和 GCC 编译器。我遇到了两个与矢量表和复位处理程序相关的严重问题,这些问题似乎是 S32K311 / RTD 4.9 环境特有的。
问题 1:立即使用调试器 RESET 故障 启动 PEMicro 调试器时,内核在 RESET 脚本执行期间立即崩溃,甚至在到达 main() 之前就崩溃了。
重置脚本(……)已完成。
UsageFault:执行指令时使用了无效的 EPSR.T 或 EPSR.IT 字段。
硬故障:故障已升级为硬故障。
我们检查了 startup_cm7.s和 Vector_Table.s。我们注意到 Reset_Handler 缺少 .type。Reset_Handler 的 %function 指令导致 ELF 入口点为偶数地址(例如,0x00402420 而不是 0x00402421),这自然会导致 Cortex-M7 上出现 ARM 模式 UsageFault。
即使在修复了 .type 指令并确保向量表已为 Thumb 模式设置了 LSB 之后,PEMicro 调试器仍然偶尔会在复位后立即抛出此 UsageFault。
问题 2:中断跳转到 0x0(未初始化的 RAM 向量表)当我们成功绕过复位问题并到达 main() 时,一旦硬件中断(如 FlexCAN 或 SWT)触发,系统就会崩溃。PC跳转到0x00000000。
在检查内存时,我们发现 __interrupts_ram_start (0x20000000) 处的 RAM 向量表完全未初始化(填充为零)。我们发现:
startup_cm7.s在初始化结束时将 VTOR 设置为 __RAM_INTERRUPT_START,但从未从 ROM 复制该表。
IntCtrl_Ip_Init(&IntCtrlConfig_0)(由平台元器件生成)在启用 INT_CTRL_IP_ENABLE_VTOR_CONFIG 时设置 VTOR,但它也不会将默认向量表从闪存复制到 RAM。
为了解决这个问题,我们不得不在 main.c 中编写一个手动 for 循环,将向量表从 __interrupts_init_start 物理复制到 __interrupts_ram_start,并在调用 IntCtrl_Ip_InstallHandler() 之前更新 S32_SCB->VTOR。
基础代码来自统一引导加载程序演示
有人知道哪里有移植并发布了适用于带 CAN 总线的 S32K311 的引导加载程序吗?
你好@ujwal12
对于 Cortex-M7,向量表中的复位处理程序条目必须通过使用 LSB 已设置的地址来指示 Thumb 模式。如果 Reset_Handler 符号没有正确生成为函数符号,链接器可能会在向量表中放置偶数地址,这可能会导致启动期间出现 UsageFault。因此,我们通常不建议修改 startup_cm7.s 文件。或 Vector_Table.s。
S32K3 RTD 采用基于 RAM 的可重定位中断向量表设计。启动时,向量表从闪存复制到 RAM,并且 VTOR 更新为指向基于 RAM 的表。
关于 S32K311 引导加载程序示例的可用性,目前还没有专门针对 S32K311 的官方引导加载程序示例。最接近的参考资料是Example S32K312 Bootloader to Application Jump DS3.5 RTD300和您已经在使用的 Unified Bootloader Demo。
另外请注意,统一引导加载程序是 NXP 的非官方演示程序,仅发布在社区论坛上,因此 NXP 技术支持不提供任何支持。
BR,VaneB