[SOS] ch573 IAP设计相关内容?

我将一个led闪烁的程序的ld脚本的flash起始地址从0改成了8K,然后这个工程生成了bin文件led.bin;

我在另外一个工程中将这个led.bin文件通过汇编incbin放到了.data段,然后这个工程在启动的时候会把放进.data段的led.bin加载到内部flash的8K的位置,加载成功以后(我通过打印和hexdump led.bin进行了对比,加载没有出错),我通过jump_app跳转到8K这个位置去执行,结果单片机并没有按照预期执行led闪烁,而是导致了复位,一直不断地进行加载-复位-加载-复位,请问这是为啥?

请问我应该怎么解决这个问题?还需要其他什么操作,才能让加载以后跳转到led.bin的程序?


您好,“通过打印和hexdump led.bin进行了对比,加载没有出错”能确保拷贝后的flash没问题就,还要注意一下8K起始的工程中,.s文件注意下图关于权限的修改。

注意实际量产的话,ISP工具烧录时最少擦除前8K。建议参考BLE文件夹下的OTA方案,将APP层代码往前放,从4K开始放代码,这样在烧录时必定被擦除一部分,提高安全性。

image.png


感谢您的回复,我已经将led程序(位于8K以上地址),的mstatus设置为了0x1888,但是依旧一直复位->加载->复位。


我在jump_app()(跳到8K地址去执行)后面插入了一些打印代码,它们不会被执行,应该是跳到8K去以后,出现了异常导致了复位。


两个比较关键的点:LD文件中,起始地址改成8K;.s文件做如上所述权限相关的改动。

再有其他可能的话,可能是中断相关问题。

如果jump_app前没有调用中断,那不存在该问题。如果jump_app前用到了各种中断,那么在跳转前需要先关闭所有中断使能,包括独立的中断和总中断,原因是中断向量表会在运行APP层代码前,由.s文件重写,但是中断使能相关的寄存器是各个工程共用的。

如果是为了验证IAP功能是否正常,可以将备用flash代码放到指定flash中,而非.data段的ram中,这样测试是否为ram中的信息被篡改导致固件异常而复位。


谢谢


已解决


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