Atmel SAM3X8E 在硬复位后失去 VTOR

Atmel SAM3X8E Loses VTOR After Hard Reset

我好像在重复here and here的这个问题。当我将固件刷入对立的闪存组后重新启动系统时,VTOR 为 0(意味着它不从闪存启动)并且我无法 运行 新固件。

我使用 EFC 控制器将固件二进制文件编程到第二个闪存组中。 例如,活动固件位于 Flash0,位于 0x0008_0000。实施指南说 Flash1 位于 0x000C_0000。我可以看到要刷新的完整固件包含在 0x000C_0000,没有错误。加载并验证固件后,我切换 GPNVM 启动库:

efc_perform_command(EFC0, EFC_FCMD_SGPB, 1); //set GPNVM bit 1
efc_perform_command(EFC0, EFC_FCMD_SGPB, 2); //set GPNVM bit 2
/* Now check to make sure the bit has flipped) */
efc_perform_command(EFC0, EFC_FCMD_GGPB, 0);
status = efc_get_result(EFC0);
printf("GPNVM is now %d\n", status);

/* Now set the VTOR to the flash1 start address) */
__DSB();
__ISB();
SCB->VTOR = ((uint32_t)FLASH1_ADDRESS & SCB_VTOR_TBLOFF_Msk);
/* Checking the VTOR value here shows a result of 0x000C_0000 */
__DSB();
__ISB();

/* Now reset the device by pulling NRSTB pin low */
reset_pull_NRSTB_low();
while(1); 

执行此代码后,我再次检查 0xE000_ED08 处的 VTOR 寄存器,现在的值为 0x0000_0000。固件似乎没有加载,因为芯片寻找地址 0x0000_0000 来启动固件。

会不会是我GPNVM位设置不当,它在找ROM向量?如果是这种情况,要设置哪些正确的 GPNVM 位?根据引导加载程序文档第 33 页上的 table,GPNVM 位应为“0b110”,因此 GPNVM[1] 为 1 且 GPNVM[2] 为 1 - 这意味着固件将从 Flash Bank 1 开始. 这样解释正确吗?

好吧,我当然知道找到解决方案会让我觉得自己很愚蠢。但是给你... 我最终更改了Atmel提供的Device_Startup文件夹中的链接器脚本并编译了两次;每个都分别具有 FLASH0 和 FLASH1 地址,没有对固件进行其他更改。而且...固件二进制文件是相同的!但根据 Atmel 的说法,情况不应该如此。

我一直很困惑,因为它说内存是镜像的,这让我相信设置GPNVM只是指向相同地址的flash bank的开始,并根据GPNVM2重新映射后半部分。相反,它似乎实际上是从固件二进制文件的第二个字(SP 然后是 PC)加载向量 table。

所以确实需要告诉它在连续的闪存库中跳转到哪里。 我进入 ASF 解决方案属性以找到 ARM/GNU 链接器首选项,并在标记部分找到了真正的链接器文件。它不是我项目中引用的那个。我按照我上面说的指南改了,成功切换到运行对岸固件

看似晦涩难懂的硬件问题的简单解决方案。感谢您的帮助!