CH32V103的IAP问题(跳转及中断向量表重定位)

现在在做CH32F103到CH32V103的移植,原先程序有做IAP。但是切换到RISC-V之后指令不知如何转换:

1、跳转:RISC-V没有__set_MSP指令,如何处理?跳转地址要+4吗?

    Jump_To_Application = (pFunction)(*(vu32*)(APP_BASE + 4));

    __set_MSP(*(vu32*)APP_BASE); 

    Jump_To_Application();


2、中断向量重新映射:RISC-V没有这条指令,如何处理呢?

     NVIC_SetVectorTable(。。。)


3、ld文件中ROM起始地址0x00000000,改成0x08000000是否也可以,我看规格书说两个程序的启动地址一样?


icon_rar.gif软复位进IAP_CH32V103.zip

你好,CH32V103 IAPdemo可见附件,LD文件中FLASH起始地址需设置成0,编译器会自动加0x08000000.


好的感谢。不过关于LD中起始地址设置为0问题,那么我在程序中要擦除FLASH地址20K后的删除。程序中的地址指针我是要设置成0x08005000还是x00005000?


另外CH32V的没有USBD,只有USBHD,但是我发现USB唤醒中断USBWakeUp_IRQHandler仍然保留,USBHD唤醒时也能响应此中断吗?


你好,如果在程序中要擦除FLASH地址20K后的数据,地址应该设置为0x08005000,关于USBWakeUp_IRQHandler函数,USBHD唤醒能响应该中断


我碰到到同样的问题:中断向量重新映射?

2、中断向量重新映射:RISC-V没有这条指令,如何处理呢?

     NVIC_SetVectorTable(。。。) //RISC-V没有这条指令

CH32V103 IAPdemo附件中,  USERCODE部分没有处理中断的实例代码, 如果加入中断,中断入口基地址如何设定??
不设定是不是跳到 BOOT的中断入口?


我实际使用的芯片是CH32V307VCT6 ,在数据手册中找一个异常入口基地址寄存器(MTVEC)

专用CSR 寄存器

但在CH32V307VCT6 EVT中找不到它的定义,也不知如何使用,提示需要系统在机器模式下才能访问。

手册中也没有解答,何为机器模式,如何进入,如何退出?

666.jpg

是不是 在LD文件中设定好 0x00005000开始地址后,编译器在初始化程序中自动设定好中断向量基地址,IAP不用管它?


您好,CH32V307的IAP升级基本和CH32V103类似,在LD文件里设置FLASH起始地址后中断向量会自动偏移,IAP不用管它,具体例程可参考2楼附件,关于所问机器模式,属于RISC-V架构定义的3种工作模式之一,为必选模式,其具体介绍可参考RISC-V特权架构文档,附件如下:

icon_pdf.gifriscv-privileged.pdf



说明中,最好讲一讲向量表的切换原理,不知原理用着不放心。

找了很久,最后在初始化代码startup_CH32v30x.s中找到,编译后自动设置中断向量偏移地址




 /* Enable floating point and interrupt */
   li t0, 0x6088           
   csrs mstatus, t0
 la t0, _vector_base
    ori t0, t0, 3

csrw mtvec, t0



我也正在解决这个中断重新定位的问题。不知怎么解决?



经电话沟通,地址设置错误,问题已经解决@苏海林


官方EVT里面自带的ld文件设置FLASH地址在0x00000000是不科学的,FLASH实际地址在0x08000000,ld文件也应该设置到0x08000000

虽然编译生成的bin文件没有地址,但是hex文件是有地址的,显然起始地址0x00000000和0x08000000完全不同。

正确做法是ld文件中设置FLASH起始地址为0x08000000,然后在startup文件中增加以下代码:

.section.init,"ax",@progbits

.global_start

.align1

_start:

lui  a0,0x8000       /* a0 = 0x8000<<12   if APP at 0x08005000 set 0x8005*/

jalr 8(a0)           /* jump to 0x08000008*/

jhandle_reset

.word 0x00000013

.word 0x00000013

虽然默认MCU会把0x08000000处的FLASH映射到0x00000000,用户所有的操作仍然应该按照0x08000000这个地址来,不能够用映射以后的0地址来操作,这也是STM32代表的ARM芯片的统一做法。


是的,绝对地址跟相对地址其实在使用上都能实现同样的效果,我们后面会将更多的因素考虑进来,给用户更直观更容易理解的界面显示。


目前使用CH32V307VC做IAP功能,参考这个软复位进IAP_CH32V103.zip 例程,然而程序无法跳转,app只需要修改Ld文件的地址吗?还有没有其它地方需要修改?boot loader程序已经参考历程加入跳转代码。


已解决问题,只需要修改应用程序的Ld文件的flash起始地址,我的问题是在写错跳转的中断函数,V103的跟V307的不一样;其它的按照楼上即可


请问一下307 具体怎么设置跳转呢,我按照上面的工程配置,发现跳转不成功。希望能解答一下谢谢


 您好,附件为CH32V307 IAP例程,可以参考一下。

icon_rar.gifCHV307 IAP.zip



@悠悠哥

今天看了下这个帖子,感谢对于RISCV芯片IAP中断跳转的研究,说一下我自己的理解

1 修改LD文件,是IAP必须操作,可以在菜单栏的LD图标修改,有点类似修改keil的下载程序IROM的意思

2 中断向量的搬移或者映射实际不需要做什么操作,在修改完LD文件后,在startup.s文件内,有一句加载中断向量的语句,就是悠悠哥截取的语句

/* enable all interrupt */

  li t0, 0x88

  csrs mstatus, t0

la t0, _vector_base

  ori t0, t0, 1

csrw mtvec, t0

从这个语句再深挖一下,这个语句只是加载vector_base到mtvec,并不涉及中断向量搬移,这样的话应该是riscv的架构支持一个mtvec的寄存器,这个寄存器是存着中断首地址,而不是像arm一样中断地址是固定的,所以可以只需要修改ld文件就可以实现IAP,相对来说更简单一些。

共享下思路,有问题请指正,记录下知识点,后续可以回溯~


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