IAP需要有两个工程,第一个是Bootloader,第二个是Application
同时将这两份程序放在mcu的flash里的不同位置,启动时自动进入bootloader(可选择)进行iap,成功后跳转至application。
那么IAP问题简化成三个步骤,
Step1:做Bootloader工程
Step2:做Application工程
Step3:烧进Flash的不同位置
Step1:需要做这些事情:
1:初始化IAP相关外设
2:下载文件(ymodem协议)
3: 写入Application程序存储空间
鸡:
IAP_Init();
SerialDownload();
具体实现:
void IAP_Init(void)
{
uint32_tt;
LEDInit();
SysTickInit();
USART_Configuration();
FLASH_If_Init();
for(t = 2000; t > 10; t >>= 1 )
{
LEDTogle(1); delayms(t);
}
}
void SerialDownload(void)
{
uint8_t Number[10] = {0};
int32_t Size = 0;
SerialPutString("Waitingfor the file to be sent ... (press 'a' to abort)\n\r");
Size = Ymodem_Receive(&tab_1024[0]);
if(Size > 0)
{
SerialPutString("\n\n\r Programming CompletedSuccessfully!\n\r--------------------------------\r\n Name: ");
SerialPutString(FileName);
Int2Str(Number, Size);
SerialPutString("\n\r Size: ");
SerialPutString(Number);
SerialPutString(" Bytes\r\n");
SerialPutString("-------------------\n");
}
else if (Size == -1)
{
SerialPutString("\n\n\rThe image size is higher than the allowedspace memory!\n\r");
}
else if (Size == -2)
{
SerialPutString("\n\n\rVerification failed!\n\r");
}
else if (Size == -3)
{
SerialPutString("\r\n\nAborted by user.\n\r");
}
else
{
SerialPutString("\n\rFailedto receive the file!\n\r");
}
}
Step2:需要这样干:
在Application工程中程序运行的一开始加上如下中断拷贝即可
void InterruptRemap(void)
{
u8 i;
u32 Data;
u32 Address;
for(i=1;i<48;i++)
{
Data = *(__IOu32*)(0x08003000+i*4);
Address = 0x20000000 + (i*4);
*(__IO u32*)Address= (u32)Data;
}
SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
}
Step3:这就样
将两个工程分别烧在不同的flash地址段中
A:bootloader
1:点Project选项卡,然后点Optionsfor Target选项如图:
2:Target选项卡下有on-chip地址设置,bootloader放在0x8000000开头的0x3000空间内
如图:
然后正常手段烧入flash即可。
B:application
和上述设置手段一样,只不过in-chip的IROM1设置起始地址为0x8003000,Size为mcu的Flash大小减去0x3000即可(注意是16进制哦)
然后就祝你幸福了 0.0
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』