找回密码
 立即注册

QQ登录

只需一步,快速开始

打印 上一主题 下一主题
开启左侧

[M051] 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, 下载次数: 498)

关键代码.PNG

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

关键代码.PNG
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 顶 踩
回复

使用道具 举报

沙发
admin 发表于 2022-10-11 16:11:40 | 只看该作者
请问0X4000地址的程序加载执行地址是不是被设置0地址了,此时需要将加载执行地址设置成0x4000,
牛卧堂
回复 支持 反对

使用道具 举报

板凳
admin 发表于 2022-10-11 16:12:56 | 只看该作者
请参考下面例程
牛卧堂
回复 支持 反对

使用道具 举报

地板
admin 发表于 2022-10-11 16:13:19 | 只看该作者

牛卧堂
回复 支持 反对

使用道具 举报

5#
 楼主| celink-c000559 发表于 2022-10-11 17:08:37 | 只看该作者

工程师您好,请问一下你的意思是要在当前程序的加载执行地址设置成0x4000吗?感谢您的不吝赐教
回复 支持 反对

使用道具 举报

6#
 楼主| celink-c000559 发表于 2022-10-11 17:27:18 | 只看该作者

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

使用道具 举报

7#
admin 发表于 2022-10-12 15:24:00 | 只看该作者
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页映射和系统复位可以切换到其他程序上去。
牛卧堂
回复 支持 反对

使用道具 举报

8#
admin 发表于 2022-10-12 15:28:15 | 只看该作者
不断复位到APP1,可能0X4000上没代码,也可能0x4000地址上的程序执行地址指向了APP1. 可以看0x4004位置的数据是否指向0x4000以前的地址。
牛卧堂
回复 支持 反对

使用道具 举报

9#
admin 发表于 2022-10-12 15:30:48 | 只看该作者

牛卧堂
回复 支持 反对

使用道具 举报

10#
 楼主| celink-c000559 发表于 2022-10-14 11:15:29 | 只看该作者

感谢您的回复,请问0x4000上有代码,但是0x4000地址上的程序执行地址指向了APP1的话,有什么解决的方法。非常感谢您的指导。
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

新唐MCU