牛卧堂MCU技术交流

标题: M031LD2AE做IAP升级的时候跳转不成功 [打印本页]

作者: celink-c000559    时间: 2022-10-11 10:51
标题: M031LD2AE做IAP升级的时候跳转不成功
大家好,想请教一下大家关于M031系列芯片IAP功能开发的问题。先把新固件的.bin文件先存到外挂的flash(W25Q256),固件包的大小为2400bytes,需要升级时把.bin文件加载到片内的flash的APROM(起始地址为0x4000)。当需要更新时,把程序加载到片内flash没有报错,但是不能跳转到新固件运行的地方,软件复位后又运行当前固件。已经通过ICP工具把芯片配置成APROM with IAP,关键代码如下:        /*从外挂flash中读取Application2文件*/
        celink_user_SpiReadFlashBuffer(Uart1_NewFirmware,510104,2400);
        printf("System Unlockreg...\n");       
        SYS_UnlockReg();
       /* Enable FMC ISP function */
        printf("FMC Open...\n");               
       FMC_Open();
        FMC_ENABLE_AP_UPDATE();
        if(load_image_to_flash((uint32_t)&Uart1_NewFirmware,0, 0x4000, 2400) != 0)
        {
                printf("Load image to APROM failed!\n");
                return -1;
        }
        FMC_DISABLE_AP_UPDATE();                       
        printf("Disable all interrupt...\n");
        /*Disable all interrupts*/
       NVIC->ICER[0] = 0xFFFFFFFF;
       printf("Set Vector PageAddr...\n");       
       FMC_SetVectorPageAddr(0x4000);
        /* Reset System to reset to new vector page. */
       NVIC_SystemReset();



关键代码.PNG (24.15 KB, 下载次数: 678)

关键代码.PNG

关键代码.PNG (24.15 KB, 下载次数: 686)

关键代码.PNG

作者: admin    时间: 2022-10-11 16:11
请问0X4000地址的程序加载执行地址是不是被设置0地址了,此时需要将加载执行地址设置成0x4000,
作者: admin    时间: 2022-10-11 16:12
请参考下面例程
作者: admin    时间: 2022-10-11 16:13


作者: celink-c000559    时间: 2022-10-11 17:08
admin 发表于 2022-10-11 16:13

工程师您好,请问一下你的意思是要在当前程序的加载执行地址设置成0x4000吗?感谢您的不吝赐教
作者: celink-c000559    时间: 2022-10-11 17:27
admin 发表于 2022-10-11 16:13

工程师你好,我现在把APP1放到APROM地址为0的地方,把APP2放到APROM地址为0x4000的地方,然后APP2的加载执行地址也设置成了0x4000.如果我反复执行上述代码,会存在跳转失败并不断复位到代码1的情况而跳转不到代码2的地方,测了很久都没有找到原因。还有就是我已经将程序编译后转化成.bin文件了,这个.bin文件是不会有与keil相关设置的信息了吧?非常感谢您的回复与指导。
作者: admin    时间: 2022-10-12 15:24
celink-c000559 发表于 2022-10-11 09:27
工程师你好,我现在把APP1放到APROM地址为0的地方,把APP2放到APROM地址为0x4000的地方,然后APP2的加载 ...

请先去参考测试FMC_MultiBoot例程,FMC_MultiBoot是放在APROM 0地址的,FMC_Boot0是放在0x4000地址的。每个工程编译前先在keil里设置对应的加载执行地址(例程已经配置好),然后编译下载到APROM里。设置芯片启动位置为APROM带IAP,那么每次芯片上电都会从APROM的0地址开始执行。
APROM 0地址上的程序再通过0页映射和系统复位可以切换到其他程序上去。

作者: admin    时间: 2022-10-12 15:28
不断复位到APP1,可能0X4000上没代码,也可能0x4000地址上的程序执行地址指向了APP1. 可以看0x4004位置的数据是否指向0x4000以前的地址。
作者: admin    时间: 2022-10-12 15:30


作者: celink-c000559    时间: 2022-10-14 11:15
admin 发表于 2022-10-12 15:30

感谢您的回复,请问0x4000上有代码,但是0x4000地址上的程序执行地址指向了APP1的话,有什么解决的方法。非常感谢您的指导。
作者: admin    时间: 2022-10-14 15:51
celink-c000559 发表于 2022-10-14 03:15
感谢您的回复,请问0x4000上有代码,但是0x4000地址上的程序执行地址指向了APP1的话,有什么解决的方法。 ...

请先去参考测试FMC_MultiBoot例程,FMC_Boot0是放在0x4000地址的。每个工程编译前先在keil里设置对应的加载执行地址(例程已经配置好),然后编译下载到APROM里。
作者: admin    时间: 2022-10-14 15:51


作者: celink-c000559    时间: 2022-10-14 16:44
admin 发表于 2022-10-14 15:51
请先去参考测试FMC_MultiBoot例程,FMC_Boot0是放在0x4000地址的。每个工程编译前先在keil里设置对应的加 ...

好的,感谢您的指导。
作者: 匿名    时间: 2022-11-16 11:09
新唐一级代理,FAE支持,VX:13538292986




欢迎光临 牛卧堂MCU技术交流 (http://nuvoton-mcu.com/) Powered by Discuz! X3.2