關(guān)于ch32v203F8P6芯片IAP程序跳轉(zhuǎn)地址的問題

例程中的跳轉(zhuǎn)地址是0x00005000,在ld文件中,IAP的起始地址是0x08000000,APP的起始地址是0x08005000,實(shí)現(xiàn)跳轉(zhuǎn)的函數(shù)在中斷SW_Handler()中如下:

void SW_Handler(void) {

? ? __asm("li? a6, 0x5000");

? ? __asm("jr? a6");


? ? while(1);

}


這應(yīng)該是個(gè)匯編語言,將0x5000寫入一個(gè)寄存器,然后執(zhí)行jr跳轉(zhuǎn)指令。

例程能夠正常運(yùn)行,并跳轉(zhuǎn)到0x8005000執(zhí)行APP程序,現(xiàn)在因?yàn)楣こ绦枨?,IAP程序的大小可能會(huì)比較大,0x5000也就是20k的空間可能不足,所以我想增加其空間大小,所以修改APP起始地址為0x08010000,對(duì)應(yīng)的APP的ld文件我也進(jìn)行了修改如下:

MEMORY

{

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

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

}


IAP內(nèi)的修改如下:

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);

}


修改編譯后,程序只能運(yùn)行到IAP程序,無法實(shí)現(xiàn)跳轉(zhuǎn)到APP程序所在的地址。目前不知道問題出在哪里,還請(qǐng)吧友們指教。

ps:ld文件內(nèi)的LENGTH應(yīng)該只是一個(gè)后續(xù)大小的值,我直接按64k寫了,64k和例程的20k都試過,好像對(duì)跳轉(zhuǎn)到0x08010000這個(gè)地址來說沒啥區(qū)別。。

app程序占用的flash空間應(yīng)該是:0x10000 (CH32V203F8P6最大的0等待容量)- 起始地址(在例程里面是0x5000);你想要更大的程序空間,那么起始地址應(yīng)該更小才對(duì),你的程序直接設(shè)置到0x10000, 已經(jīng)超出了地址空間;



我理解您的意思了,那如果我想要做2個(gè)APP,在IAP內(nèi)實(shí)現(xiàn)跳轉(zhuǎn),我這2個(gè)APP的地址該如何設(shè)置呢?還有在燒錄的時(shí)候,ld文件對(duì)燒錄的影響,文件的起始地址改變,LD文件也要跟著修改嗎?

感謝!


假設(shè)分為iap、app1以及app2,iap大小為20KB,app1大小為20KB,app2大小為20KB,在MCU flash中的排列順序?yàn)閕ap、app1和app2。那么ld文件中設(shè)置iap的flash起始地址為0x00000000, app1的flash起始地址為0x00005000; app2的flash起始地址就是0x0000A000。

用戶程序的起始地址改變了,ld文件也要一起修改。ld文件里面的flash起始地址會(huì)影響編譯好了之后的app程序的第一行地址在哪里,也就是前面會(huì)有多少flash區(qū)域是空白的。

具體到燒寫就要按照我們的EVT里面的說明,有兩種方式,第一種是先燒寫IAP程序,然后通過IAP接口燒寫app程序;第二種是用bin合并工具將iap跟app程序合并成一個(gè)bin文件然后通過我們的燒寫軟件一次燒寫進(jìn)去。


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频