我用bootloader接收完程序后,进入跳转APP始地址后,bootloader程序会复位,重新进入引导程序,这是为什么?这是我CMD文件编写有问题吗?始地址为0x3e8100; APP的begin 为0x3e8100
您好,
始地址为0x3e8100; APP的begin 为0x3e8100
是同一个地址吗?请重新说明一下。
关于程序无法运行,请检查BootLoader是否正确地进行擦除并烧写了,另一个是APP程序本身能否正常运行?
APP程序单独可以刷进去,BootLoader读取0x3e8100地址写进去了,程序和校验也过了。您看看我的两个CMD有什么问题吗?
BootLoaderode code MEMORY { PAGE 0 : BEGIN : origin = 0x3F7FF6, length = 0x000002 /* 普通应用或者BOOT应用 = 0x33FFF6。跳转型APP = _APP_HEAD */ SECT_POG : origin = 0x3F0000, length = 0x007F80 SECT_RFUN : origin = 0x008000, length = 0x000800 /* 0x010000 - SECT_RAM */ CSM_RSVD : origin = 0x3F7F80, length = 0x000076 CSM_PWL : origin = 0x3F7FF8, length = 0x000008 OTP : origin = 0x3D7800, length = 0x000400 RESET : origin = 0x3FFFC0, length = 0x000002 IQTABLES : origin = 0x3FE000, length = 0x000b50 IQTABLES2 : origin = 0x3FEB50, length = 0x00008c BOOTROM : origin = 0x3FF27C, length = 0x000D44 VECTORS : origin = 0x3FFFC2, length = 0x00003E PAGE 1 : BOOT_RSVD : origin = 0x000002, length = 0x00004E RAM_STACK : origin = 0x000050, length = 0x0007B0 /* 堆栈放在M0M1内存 */ SECT_RAM : origin = 0x008800, length = 0x00800 } SECTIONS { codestart : > BEGIN, PAGE = 0 .text : > SECT_POG, PAGE = 0 /* IQ暂时未使用 */ ramfuncs : LOAD = SECT_POG, RUN = SECT_RFUN, LOAD_START(_RamfuncsLoadStart), LOAD_END(_RamfuncsLoadEnd), RUN_START(_RamfuncsRunStart), PAGE = 0 Flash28_API: { -lFlash2803x_API_V100.lib(.econst) -lFlash2803x_API_V100.lib(.text) } LOAD = SECT_POG, RUN = SECT_RFUN, LOAD_START(_Flash28_API_LoadStart), LOAD_END(_Flash28_API_LoadEnd), RUN_START(_Flash28_API_RunStart), PAGE = 0 .cinit : > SECT_POG, PAGE = 0 /* cinit、econst段建议放在代码段尾部 */ .econst : > SECT_POG, PAGE = 0 .stack : > RAM_STACK,PAGE = 1 .esysmem : > SECT_RAM, PAGE = 1 .ebss : > SECT_RAM, PAGE = 1 /* DMA暂时未使用 */ /* DMARAML4 : > RAML4_7, PAGE = 1 DMARAML5 : > RAML4_7, PAGE = 1 DMARAML6 : > RAML4_7, PAGE = 1 DMARAML7 : > RAML4_7, PAGE = 1 */ IQmath : > IQTABLES, PAGE = 0 , TYPE = NOLOAD /* Math Code */ IQmathTables : > IQTABLES, PAGE = 0, TYPE = NOLOAD .reset : > RESET, PAGE = 0, TYPE = DSECT /* not used */ vectors : > VECTORS PAGE = 0, TYPE = DSECT csm_rsvd : > CSM_RSVD PAGE = 0, TYPE = DSECT csmpasswds : > CSM_PWL PAGE = 0, TYPE = DSECT }
APP CODE MEMORY { PAGE 0 : BEGIN : origin = 0x3E8100, length = 0x000002 /* 跳转型APP = _APP_HEAD */ /* BEGIN : origin = 0x33FFF6, length = 0x000002 /* 普通应用或者BOOT应用 */ SECT_POG : origin = 0x3E8102, length = 0x006EFE SECT_RFUN : origin = 0x009000, length = 0x000800 /* 0x010000 - SECT_RAM */ CSM_RSVD : origin = 0x3F7F80, length = 0x000076 CSM_PWL : origin = 0x3F7FF8, length = 0x000008 OTP : origin = 0x3D7800, length = 0x000400 RESET : origin = 0x3FFFC0, length = 0x000002 IQTABLES : origin = 0x3FE000, length = 0x000b50 BOOTROM : origin = 0x3FF27C, length = 0x000D44 VECTORS : origin = 0x3FFFC2, length = 0x00003E PAGE 1 : BOOT_RSVD : origin = 0x000002, length = 0x00004E RAM_STACK : origin = 0x000050, length = 0x0007B0 /* 堆栈放在M0M1内存 */ SECT_RAM : origin = 0x009800, length = 0x000800 } SECTIONS { codestart : > BEGIN, PAGE = 0 .text : > SECT_POG, PAGE = 0 ramfuncs : LOAD = SECT_POG, RUN = SECT_RFUN, LOAD_START(_RamfuncsLoadStart), LOAD_END(_RamfuncsLoadEnd), RUN_START(_RamfuncsRunStart), LOAD_SIZE(_RamfuncsLoadSize), PAGE = 0 .cinit : > SECT_POG, PAGE = 0 /* cinit、econst段建议放在代码段尾部 */ .econst : > SECT_POG, PAGE = 0 .stack : > RAM_STACK,PAGE = 1 .esysmem : > SECT_RAM, PAGE = 1 .ebss : > SECT_RAM, PAGE = 1 IQmath : > SECT_POG PAGE = 0 /* Math Code */ IQmathTables : > IQTABLES, PAGE = 0, TYPE = NOLOAD .reset : > RESET, PAGE = 0, TYPE = DSECT /* not used */ vectors : > VECTORS PAGE = 0, TYPE = DSECT csm_rsvd : > CSM_RSVD PAGE = 0, TYPE = DSECT csmpasswds : > CSM_PWL PAGE = 0, TYPE = DSECT }
我 bootloader Flash代码
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
MemCopy(&Flash28_API_LoadStart, &Flash28_API_LoadEnd, &Flash28_API_RunStart);
APP Flash 代码
memcpy((uint16_t *)&RamfuncsRunStart,(uint16_t *)&RamfuncsLoadStart, (unsigned long)&RamfuncsLoadSize);
InitFlash();