有遇到这种情况的没有:情况1: at32f413KBU7-4系列flash=128KB,远程升级flash规划,boot loader=3KB(实际使用2.2K),APP1=62KB(实际使用61K),APP2=62KB(实际使用61K),标志位=1KB(实际使用12字节).编写过程中遇到的问题是boot loader直接跳转到APP1程序运行正常,把boot loader修改直接跳转到APP2的地址,运行正常的APP1程序修改跳转接收地址到APP2,下载后bootloader可以正常跳转,APP无法正常运行,简单说就是:同一段程序在flash 0x08000C00--0x080103FF(62K)可以正常运行,在flash 0x08010400--0x0801FC00(62K)不能正常运行。
boot loader 程序:int main(void)
{
// u32 tem;
SystemCoreClockUpdate();
while(1)
{
if((*(u32*)BOOTLOADER_FIRST_RUN_ADDR)==BOOTLOADER_FIRST_RUN)//0xFFFFFFFF//ÅжÏBOOTLOADERÊÇ·ñµÚÒ»´ÎÖ´ÐÐ
{
FLASH_Unlock();
FLASH_ProgramWord(BOOTLOADER_FIRST_RUN_ADDR, 1);//дBootloader×îºóÒ»Ò³Êý¾ÝΪ0x00000001
FLASH_ProgramWord(IAP1_UPGRADE_FLAG_ADDR, 1);//дAPP1×îºóÒ»Ò³Êý¾ÝΪ0x00000001
FLASH_ProgramWord(IAP2_UPGRADE_FLAG_ADDR, 0);//дAPP2×îºóÒ»Ò³Êý¾ÝΪ0x00000000
FLASH_Lock();
if((*(vu32*)(APP1_START_ADDR+4)&0xFF000000)==0x08000000) // ÅжÏAPP1ÆðʼµØÖ·ÊÇ·ñΪ0x08xxxxxx.
IAP_Load_APP1(APP1_START_ADDR); // Ö´ÐÐAPP´úÂë
} else{
if(FLASH_Read_APP1_Upgrade_Flag() > FLASH_Read_APP2_Upgrade_Flag())
{
if(((*(vu32*)(APP1_START_ADDR+4))&0xFF000000)==0x08000000) // ÅжÏAPPÆðʼµØÖ·ÊÇ·ñΪ0x08xxxxxx.
{IAP_Load_APP1(APP1_START_ADDR);}
}else{
if((*(vu32*)(APP2_START_ADDR+4) & 0xFF000000)==0x08000000) // ÅжÏAPPÆðʼµØÖ·ÊÇ·ñΪ0x08xxxxxx.
{IAP_Load_APP1(APP2_START_ADDR);}
}
}
}
}
|