APROM与APROM区别。
M451系列单片机的FLASH分为APROM和LDROM,APROM较大,存放应用程序,LDROM较小,一般只有4K,存放bootoader。
APROM开始地址0x00000000,LDROM开始地址0x00100000。
IAP升级时,可以将应用程序下载到APROM。复位后,跳转到LDROM,LDROM的bootloader复制程序到0x00000000地址,再复位,跳转到APROM启动。
先确定启动的配置寄存器是否修改成可跳转的模式。可以通过ICP工具修改,也可以通过代码修改。含IAP的,是可以通过代码跳转的。
#define DATA_FLASH_BASE 0x11000 // 72K flash, last 4K used to be eeprom.
#define DATA_FLASH_END (DATA_FLASH_TEST_BASE + 800)
#define DEFAULT_FLASH_CFG0 0xfffeffbe
#define DEFAULT_FLASH_CFG1 0x00011000
#define BOOT_FROM_AP 0xfffeffff
#define BOOT_FROM_AP_WITH_IAP 0xfffeffbf
#define BOOT_FROM_LD 0xfffeff7f
#define BOOT_FROM_LD_WITH_IAP 0xfffeff3f
int FLASH_Init(void)
{
uint32_t config[2];
SYS_UnlockReg();
FMC_Open();
// if(FMC_ReadDataFlashBaseAddr( )!= DATA_FLASH_TEST_BASE)
// {
// if (SetDataFlashBase(DATA_FLASH_TEST_BASE) < 0)
// {
// logE("Failed to set Data Flash base address!\n");
// goto lexit;
// }
// }
FMC_ReadConfig(config, 2);
if((config[0] != DEFAULT_FLASH_CFG0) || (config[1] != DEFAULT_FLASH_CFG1))
{
logW("Write FLASH CONFIG");
config[0] = DEFAULT_FLASH_CFG0;
config[1] = DEFAULT_FLASH_CFG1;
FMC_EnableConfigUpdate();
FMC_WriteConfig(config, 2);
}
// lexit:
/* Disable FMC ISP function */
FMC_Close();
/* Lock protected registers */
SYS_LockReg();
return 0;
}
跳转代码
从APROM跳转到LDROM
void OTA_BootFromLDROM(void)
{
SYS_UnlockReg();
FMC_Open();
__set_PRIMASK(1);
FMC_SetVectorPageAddr(FMC_LDROM_BASE);
log_raw("System reset now.\r\n");
NVIC_SystemReset();
}
从LDROM跳转到APROM
void OTA_BootFromAPROM(void)
{
SYS_UnlockReg();
FMC_Open();
__set_PRIMASK(1);
FMC_SetVectorPageAddr(FMC_APROM_BASE);
log_raw("System reset now.\r\n");
NVIC_SystemReset();
}
MDK要注意地址设置
APROM
LDROM