1、应用场景:程序从QspiFlash引导启动,作为Boot程序,提供更新程序的功能;将包含应用的完整程序下载到RAM中,重新加载启动。 2、软件源码:MIMXRT1170-EVK中示例代码 3、设计思路: 1)Boot程序的Code使用Flash,Data使用一片OCRAM 2)App程序存放在另一片IOCRAM上,堆栈使用跟Boot相同的OCRAM空间(也可更改) 3)如果Boot程序中开启了中断,在跳转之前要关中断,否则有可能跳转时出现程序运行异常问题 4)在App的程序中,要关闭BOARD_BootClockRUN的时钟初始化函数,因为PLL无法重新配置(还未查明原因) 4、关键代码段: uint32_t CORE1_RAM_ADDRESS = 0x20242000,CORE1_FLASH_START = 0x30200000; uint32_t* pBuf = (uint32_t*)CORE1_RAM_ADDRESS;
/* Copy application from FLASH to RAM */
(void)memcpy((void *)(char *)CORE1_RAM_ADDRESS, (void *)CORE1_FLASH_START, core1_image_size);
/*Disable All Interrupt*/
__disable_irq();
/* Set the VTOR to the application vector table address*/
SCB->VTOR = (uint32_t)CORE1_RAM_ADDRESS;
/*Set stack pointers to the application stack pointer.*/
__set_MSP(pBuf[0]);//将把用户代码的栈顶地址设为栈顶指针
/*跳转指令,arm格式的bin文件,4-7字节为PC指针*/
((void (*)())pBuf[1])();
个人愚见,如有问题,敬请指正!
|