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 


弄出来了,如果要用FLASH的实际地址,app的链接文件里面的FLASH也需要使用实际地址链接才行。


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


好的,明白了。谢谢


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