IAP需要有兩個工程,第一個是Bootloader,第二個是Application
同時將這兩份程序放在mcu的flash里的不同位置,啟動時自動進入bootloader(可選擇)進行iap,成功后跳轉至application。
那么IAP問題簡化成三個步驟,
Step1:做Bootloader工程
Step2:做Application工程
Step3:燒進Flash的不同位置
Step1:需要做這些事情:
1:初始化IAP相關外設
2:下載文件(ymodem協(xié)議)
3: 寫入Application程序存儲空間
雞:
IAP_Init();
SerialDownload();
具體實現(xiàn):
voidIAP_Init(void)
{
uint32_tt;
LEDInit();
SysTickInit();
USART_Configuration();
FLASH_If_Init();
for(t=2000;t>10;t>>=1)
{
LEDTogle(1);delayms(t);
}
}
voidSerialDownload(void)
{
uint8_tNumber[10]={0};
int32_tSize=0;
SerialPutString("Waitingforthefiletobesent...(press'a'toabort)nr");
Size=Ymodem_Receive(&tab_1024[0]);
if(Size>0)
{
SerialPutString("nnrProgrammingCompletedSuccessfully!nr--------------------------------rnName:");
SerialPutString(FileName);
Int2Str(Number,Size);
SerialPutString("nrSize:");
SerialPutString(Number);
SerialPutString("Bytesrn");
SerialPutString("-------------------n");
}
elseif(Size==-1)
{
SerialPutString("nnrTheimagesizeishigherthantheallowedspacememory!nr");
}
elseif(Size==-2)
{
SerialPutString("nnrVerificationfailed!nr");
}
elseif(Size==-3)
{
SerialPutString("rnnAbortedbyuser.nr");
}
else
{
SerialPutString("nrFailedtoreceivethefile!nr");
}
}
Step2:需要這樣干:
在Application工程中程序運行的一開始加上如下中斷拷貝即可
voidInterruptRemap(void)
{
u8i;
u32Data;
u32Address;
for(i=1;i<48;i++)
{
Data=*(__IOu32*)(0x08003000+i*4);
Address=0x20000000+(i*4);
*(__IOu32*)Address=(u32)Data;
}
SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
}
Step3:這就樣
將兩個工程分別燒在不同的flash地址段中
A:bootloader
1:點Project選項卡,然后點Optionsfor Target選項如圖:
2:Target選項卡下有on-chip地址設置,bootloader放在0x8000000開頭的0x3000空間內(nèi)
如圖:
然后正常手段燒入flash即可。
B:application
和上述設置手段一樣,只不過in-chip的IROM1設置起始地址為0x8003000,Size為mcu的Flash大小減去0x3000即可(注意是16進制哦)
然后就祝你幸福了0.0
完整源碼:
http://blog.csdn.net/metalseed/article/details/40874461