我似乎是从这里和这里重申这个问题。当我在将固件刷入对面的闪存库后重新启动系统时,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 页上的表格,GPNVM 位应为“0b110”,因此 GPNVM[1] 为 1,GPNVM[2] 为 1——这意味着固件将从 Flash Bank 1 开始。这是一个正确的解释?