WCH沁恒单片机
直播中

李晨灵

7年用户 1383经验值
私信 关注
[问答]

CH32V307的IAP无法跳转怎么解决?


void SW_Handler(void)
{
typedef void (*jump_func_t)(void);
jump_func_t jmp = (jump_func_t)FLASH_AREA_BLD_SIZE;//FLASH_AREA_APP_SADDR
jmp();

}


论坛已经搜索过IAP相关帖子,也有搜索到相关例程。

上述代码,FLASH_AREA_BLD_SIZE是0x8000,FLASH_AREA_APP_SADDR是0x08000000+FLASH_AREA_BLD_SIZE。

如果用FLASH_AREA_BLD_SIZE是可以跳转成功的,但是FLASH_AREA_APP_SADDR就无法成功跳转。这是什么问题?在其他帖子上看到回复,使用绝对地址和映射地址上一样的。但是实际上就不行。这是什么问题?

如果用FLASH_AREA_APP_SADDR的时候,汇编是这样的:



0x2b6 : lui a6,0x8008
0x2ba : jr a6
0x2bc : j 0x2bc

回帖(2)

李丽波

2022-6-21 11:12:36
弄出来了,如果要用FLASH的实际地址,app的链接文件里面的FLASH也需要使用实际地址链接才行。
举报

李秀华

2022-6-21 11:12:47
您好,如果需要用8000000这种去跳转,app的ld也要用物理地址,如果用基于0的这种去偏移,app的ld就从0开始,因为程序中会有基于当前pc去计算偏移的操作,如果用了基地址0的ld编译的程序,采样基地址800xxxx的跳转执行,会导致机器当前pc是基于8000xxxx偏移,但是机器码确是基于0去偏移的,指令执行错误是正常的。此外,如果需要 ld 文件中为实际物理地址,需要修改 ld 文件 flash 起始地址为 0x08000000,然后需要在启动文件最前面增加两行代码,如下:
lui t0,0x08000
jr 8(t0)
举报

更多回帖

发帖
×
20
完善资料,
赚取积分