[单片机芯片]

关于CH579在IAP时APP程序中的中断无法运行的问题

[复制链接]
7385|26
手机看帖
扫描二维码
随时随地手机跟帖
xxz138|  楼主 | 2020-4-10 11:07 | 显示全部楼层 |阅读模式
最近在做利用以太网对CH579的程序升级功能,一开始的做法是通过IAP程序把要升级的bin文件写进0x8000,然后做中断向量偏移(0x8004),程序可以执行,但是串口中断没有反应,而且还会把程序卡死。找了一波资料想把中断向量表放到RAM的起始位置,但是没有找到过于改变程序启动位置相关的寄存器。最后在数据手册中看到了一个ROM_CODE_OFS寄存器可以直接跳过flash的前32K空间从0x8000开始执行,试了一下也是没有成功(写寄存器之前关闭了写保护),不知道是什么原因,还请官方技术做个指导。谢谢!

使用特权

评论回复
xxz138|  楼主 | 2020-4-10 11:12 | 显示全部楼层
看过BLE的OTA例程,那个程序是直接对中断向量表进行了搬移,就是把要升级的程序放在code flash最开始的位置,但是这样的话板子重启以后原来的IAP程序是不是就无法再次执行了呢?不知道我理解的有没有问题

使用特权

评论回复
WCHTech2| | 2020-4-11 09:14 | 显示全部楼层
xxz138 发表于 2020-4-10 11:12
看过BLE的OTA例程,那个程序是直接对中断向量表进行了搬移,就是把要升级的程序放在code flash最开始的位置 ...

可以参考OTA升级说明:
CH579 BLE OTA例程说明.docx (71.6 KB)

使用特权

评论回复
again_gyf| | 2020-4-12 07:53 | 显示全部楼层
之前问过了没有直接映射只能和当年开发ARM7那样自己在RAM再做个表,0地址开始的查这个表二次跳转

使用特权

评论回复
again_gyf| | 2020-4-12 07:55 | 显示全部楼层
APP改启动代码复制向量表到RAM

使用特权

评论回复
again_gyf| | 2020-4-12 07:57 | 显示全部楼层
BLE OTA这种方式是极不可靠的被挂的几率很大做产品还是不可取的

使用特权

评论回复
jiangyimfs| | 2020-4-26 11:04 | 显示全部楼层
again_gyf 发表于 2020-4-12 07:57
BLE OTA这种方式是极不可靠的被挂的几率很大做产品还是不可取的

最近在用CH579的片子做项目,请问一下,它的IAP,是必须要通过蓝牙去升级程序吗,我们要用到4G模块,想通过4G模块去远程升级程序,这个片子的IAP主要可行吗?

使用特权

评论回复
WCHTech2| | 2020-4-26 13:11 | 显示全部楼层
jiangyimfs 发表于 2020-4-26 11:04
最近在用CH579的片子做项目,请问一下,它的IAP,是必须要通过蓝牙去升级程序吗,我们要用到4G模块,想通 ...

可以用4G模块,可以参考BLE OTA 的升级例程,把通过BLE接收的升级程序bin文件改为通过4G模块接收即可。

使用特权

评论回复
jiangyimfs| | 2020-6-23 09:28 | 显示全部楼层
WCHTech2 发表于 2020-4-26 13:11
可以用4G模块,可以参考BLE OTA 的升级例程,把通过BLE接收的升级程序bin文件改为通过4G模块接收即可。 ...

请问一下,我现在用4G模块想远程升级程序,现在我的imageA-imageB是正常的能可以实现,但是imageB-imageA无法实现,看一下程序是死在最后一步        /* 跳入ImageA运行   这里可能需要搬运B的中断向量到A*/
                                        GotoResetVector(IMAGE_A_ENTRY_ADD);
3.关闭所有中断,将ImageA的第一块进行擦除写入,注意该过程不能掉电;  这步不是很理解,ImageA的第一块进行擦除写入,写入的是什么东西了,我接收到的ImageA.BIN文件的,中断向量那一块?
1.对ImageA区域的除了第一块(即0x0-0x200处)进行擦除编程,第一块的内容暂先保存到RAM里;
这一步,为什么要把原来的第一块保存,我直接把接收到的ImageA.BIN,写进去不可以吗?

使用特权

评论回复
WCHTech2| | 2020-6-28 10:11 | 显示全部楼层
jiangyimfs 发表于 2020-6-23 09:28
请问一下,我现在用4G模块想远程升级程序,现在我的imageA-imageB是正常的能可以实现,但是imageB-imageA ...

当imageB升级imageA时,为了降低升级失败的风险,对imageA进行擦除了,先将更新程序的第一块512字节的数据保存起来,从0x200处可以擦除编程,等所有的更新程序擦除完成后,再将保存的第一块数据写进0x0~0x200中,因为这块保存的中断向量表之类的数据,如果先把0x0~0x200的数据擦除,万一期间升级失败,重新上电后,也无法运行imageB的程序。

使用特权

评论回复
zeshoufx| | 2020-6-28 20:38 | 显示全部楼层
解决了吗?

使用特权

评论回复
again_gyf| | 2020-7-1 22:20 | 显示全部楼层
还是在将中断挂载到RAM里二次跳转安全

使用特权

评论回复
vtte| | 2020-7-15 08:41 | 显示全部楼层
本帖最后由 vtte 于 2020-7-15 08:47 编辑

我已经实现了用以太网IAP,正是用到了楼主位提到的的ROM_CODE_OFS寄存器,不是用官方例程的ImageA+ImageB,用A+B这种方式相当于Flash要减半使用了,不太好。
但是用ROM_CODE_OFS寄存器也有一个弊端,就是在启用了ROM_CODE_OFS后,相当于把Flash的地址空间后移了,没法再读写前面的0x8000的Flash,也就没办法在App里更新Bootloader了。而且,只有0x8000(32K)大小,放了以太网库之后就只剩不到10K了,空间有点紧张,如果Bootloader比较大的话要想其它办法了。

使用特权

评论回复
zeshoufx| | 2020-7-17 09:34 | 显示全部楼层
解决了吗

使用特权

评论回复
FantaSy_| | 2020-9-29 12:23 | 显示全部楼层
最近也想搞IAP,使用串口更新的,也遇到中断向量偏移的问题,请问楼主解决了吗?

使用特权

评论回复
again_gyf| | 2020-10-4 21:23 | 显示全部楼层
过段时间抽空把我那个以太网IAP开源了,就是利用前32K做为IAP,OFSEET这个配置其实理解为内存映射更合理

使用特权

评论回复
Taoyukai| | 2020-10-5 22:33 | 显示全部楼层
again_gyf 发表于 2020-10-4 21:23
过段时间抽空把我那个以太网IAP开源了,就是利用前32K做为IAP,OFSEET这个配置其实理解为内存映射更合理 ...

期待分享,学习学习

使用特权

评论回复
可爱的烧饼| | 2020-10-12 21:48 | 显示全部楼层
,程序可以执行,但是串口中断没有反应,

使用特权

评论回复
bwnxqg| | 2021-1-27 13:52 | 显示全部楼层
Taoyukai 发表于 2020-10-5 22:33
期待分享,学习学习

在?CH579  RB_ROM_CODE_OFS 怎么操作才能IAP?
    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;
我这样跳转不过去

使用特权

评论回复
bwnxqg| | 2021-1-27 14:38 | 显示全部楼层
Taoyukai 发表于 2020-10-5 22:33
期待分享,学习学习

在?CH579  RB_ROM_CODE_OFS 怎么操作才能IAP?
    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;
我这样跳转不过去

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

17

帖子

0

粉丝