关于ch32v203F8P6芯片IAP程序跳转地址的问题

例程中的跳转地址是0x00005000,在ld文件中,IAP的起始地址是0x08000000,APP的起始地址是0x08005000,实现跳转的函数在中断SW_Handler()中如下:

void SW_Handler(void) {

    __asm("li  a6, 0x5000");

    __asm("jr  a6");


    while(1);

}


这应该是个汇编语言,将0x5000写入一个寄存器,然后执行jr跳转指令。

例程能够正常运行,并跳转到0x8005000执行APP程序,现在因为工程需求,IAP程序的大小可能会比较大,0x5000也就是20k的空间可能不足,所以我想增加其空间大小,所以修改APP起始地址为0x08010000,对应的APP的ld文件我也进行了修改如下:

MEMORY

{

FLASH (rx) : ORIGIN = 0x00010000, LENGTH = 44K

RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K

}


IAP内的修改如下:

MEMORY

{  

/* CH32V20x_D6 - CH32V203F6-CH32V203G6-CH32V203K6-CH32V203C6 */

/*

FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 64K     //32k

RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 10K

*/ 


中断

void SW_Handler(void) {

    __asm("li  a6, 0x10000");

    __asm("jr  a6");


    while(1);

}


修改编译后,程序只能运行到IAP程序,无法实现跳转到APP程序所在的地址。目前不知道问题出在哪里,还请吧友们指教。

ps:ld文件内的LENGTH应该只是一个后续大小的值,我直接按64k写了,64k和例程的20k都试过,好像对跳转到0x08010000这个地址来说没啥区别。。

app程序占用的flash空间应该是:0x10000 (CH32V203F8P6最大的0等待容量)- 起始地址(在例程里面是0x5000);你想要更大的程序空间,那么起始地址应该更小才对,你的程序直接设置到0x10000, 已经超出了地址空间;



我理解您的意思了,那如果我想要做2个APP,在IAP内实现跳转,我这2个APP的地址该如何设置呢?还有在烧录的时候,ld文件对烧录的影响,文件的起始地址改变,LD文件也要跟着修改吗?

感谢!


假设分为iap、app1以及app2,iap大小为20KB,app1大小为20KB,app2大小为20KB,在MCU flash中的排列顺序为iap、app1和app2。那么ld文件中设置iap的flash起始地址为0x00000000, app1的flash起始地址为0x00005000; app2的flash起始地址就是0x0000A000。

用户程序的起始地址改变了,ld文件也要一起修改。ld文件里面的flash起始地址会影响编译好了之后的app程序的第一行地址在哪里,也就是前面会有多少flash区域是空白的。

具体到烧写就要按照我们的EVT里面的说明,有两种方式,第一种是先烧写IAP程序,然后通过IAP接口烧写app程序;第二种是用bin合并工具将iap跟app程序合并成一个bin文件然后通过我们的烧写软件一次烧写进去。


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