CH579 IAP时中断向量表如何重定向?使用自己的BOOT+APP方式

在论坛里看到 RB_ROM_CODE_OFS置一使用32K作为BOOT,执行时跳转直接卡死

    R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;

    R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;

    R8_RESET_STATUS |= RB_ROM_CODE_OFS;

    R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG0;


如下代码可以跳转到0x8000,但是中断向量表未重定向

     pFunction Jump_To_Application;

     u32 JumpAddress;

     DisableAllIRQ();

     JumpAddress = *(u32 *)entry_add;

     Jump_To_Application = (pFunction)(JumpAddress);

     Jump_To_Application();


看了蓝牙的OTA例程,是拷贝APP FLASH的第一块拷到0x00000000地址中,这会对自己的BOOT造成影响?BOOT有以太网进行OTA的程序


有官方人员?RB_ROM_CODE_OFS 这怎么用?能告诉一下?项目着急呀


有人来解答一下?


CH579不支持中断向量重映射,

可以在程序中直接跳到boot去升级,见EnterCodeUpgrade()函数;

RTX截图未命名.png


也可以使用软件的方式中转一下中断向量跳转,具体可参考附件的代码,

icon_rar.gifIAP.zip


解决了:

BOOT区 ,APP区


在BOOT区定义一个标志位在RAM中

__IO uint32_t CODE_FLAG __attribute__((at(0x20000000)));

CODE_FLAG  = 1;


将所用的APP所用到的中断函数定义好,

中断函数中判断标识跳转到APP中断函数的地址入口


跳转后到APP区将,标志位改变

CODE_FLAG  = 2;// *(uint32_t *)(0x20000000);









上面可以直接使用芯片的复位保持寄存器做标志位


跳转到BOOT后,然后通过USB或者串口用贵司的ISP软件进行新APP的下载吗?


如果是我们出厂自带的引导程序boot,是可以通过我们的ISP工具完成下载的。如果是自制的boot,用ISP是下不了的,自制的boot可以自定义接口以及下载协议。


明白您的意思。

但是芯片内置的BOOT是不公开给客户修改的吧?

没有搞懂CH579的IAP该怎么实现,ST-M3中断向量可以重新定位,ST-M0可以将中断向量指向RAM,而贵司的逻辑是???

如果跳转到贵司内置的BOOT来实现IAP,那其它人拿到我的hex是不是就可以直接复制产品了?


@沁恒支持

最近看IAP升级的时候也看到了RB_ROM_CODE_OFS这个寄存器,了解到CH579无法实现中断地址迁移,也无法实现内存启动。所以做IAP的时候我就像Snail一样尝试设置R8_RESET_STATUS |= RB_ROM_CODE_OFS(前提我已经把用户程序拷贝到0x8000起始的flash里)以期望程序实现正常跳转,支持中断。但是我测试发现和Snail一样会卡住,我比较好奇我们有这么个寄存器,初衷是用来做IAP吗?要如何实现呢?


利用RB_ROM_CODE_OFS 做IAP我在一年多前已经实现了,大致思路如下:

RB_ROM_CODE_OFS 跳转到后面32k执行是能用的,只不过需要变通一下。 因为给这个寄存器写入后会直接卡死,但实际上已经生效了,而且是复位有效。所以只要我们先开看门狗,让看门狗复位后就自然从32K之后开始执行了。


RB_ROM_CODE_OFS 有个特性,一般的复位并不会使它失效,需要用LowPower_Shutdown()下电,用RTC定时器唤醒后就会重新从0x0开始执行,利用这个特性和上面的看门狗复位,可以自由的在自定义的Bootloader和APP之间跳转。



谢谢,有时间我测试下


@vtte ,沁恒支持,我测试了看门狗复位的方案,发现无法实现跳转,以下是代码,帮忙看一下,利用jumptoapp可以跳转,用户程序烧录在0x8000处


CH57xNET_SocketClose(SocketId,1);

DelayMs(100);

//NVIC_DisableIRQ(0xFFFFFFFF);//关闭所有中断

//SET_APPJUMP_FLAG(1);

//Jump_To_APP();

WWDG_ResetCfg( ENABLE );

    R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;


    R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;


    R8_RESET_STATUS |= RB_ROM_CODE_OFS;


    R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG0;



有沁恒的支持人员帮忙看一下吗?


这个帖子来结一下,按照vtte的思路,确实是没有问题的,但是有一个细节的地方需要修改,就是keil工程的flash起始地址。需要改成0x0000开始。这样就可以正常跳转。但是要注意一个问题,如果这样实现跳转到话,后期在应用程序里触发boot程序就比较困难了,按照规格书来说需要用GRWSM 复位来做;当然,如果系统可以做掉电复位也是没有问题的。

捕获.PNG


image.png
CH579应用程序跳BOOT,可以调用这个函数,就可以实现


只有登录才能回复,可以选择微信账号登录