以CH32V307为例,LD文件, IAP和APP此处有区别,其它地方相同
MEMORY// (iap)
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 288K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K
}
MEMORY APP 主要就是ORIGIN 起始点的区别,相当于KEIL中选择起始地址的设置
{
FLASH (rx) : ORIGIN = 0x00005000, LENGTH = 228K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K
}
编译器会自动加上0X8000000的绝对地址的偏移,上电后程序先运行IAP,然后跳转到APP,跳转部分如下
int main(void)
{
Delay_Init();
USART_Printf_Init(115200);
printf(“SystemClk:%d\r\n”,SystemCoreClock);
if (PA0_Check() == 0)
{
printf(“jump APP\r\n”);
NVIC_EnableIRQ(Software_IRQn);
NVIC_SetPendingIRQ(Software_IRQn); //---------跳转APP实际由中断完成如下中断函数
while(1);
}
else
{此处添加IAP的代码
}
}
void SW_Handler(void) {
// USART_Printf_Init(115200);
__asm(“li a6, 0x5000”);-------------此处地址一定要和LD文件中对应上
__asm(“jr a6”);
while(1);
}
从以上来看,IAP中是允许使用中断的哈,那APP部分就设好LD就行了,正常的去写程序就OK了,执行复位,就又自然回到IAP了。
可以参考这篇贴文
https://www.wch.cn/bbs/thread-110504-1.html