STM32F051 IAP源码分享
扫描二维码
随时随地手机看文章
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();
具体实现:
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空间内
如图:
然后正常手段烧入flash即可。
B:application
和上述设置手段一样,只不过in-chip的IROM1设置起始地址为0x8003000,Size为mcu的Flash大小减去0x3000即可(注意是16进制哦)
然后就祝你幸福了0.0
完整源码:
http://blog.csdn.net/metalseed/article/details/40874461