之前做的一个小项目,因为刚开始没有考虑到以后会经常升级,而每次升级都要旋开4颗螺丝拆壳,然后烧程序,再装壳,如果只要更新几个倒没啥感觉,但是一下更新几百个,那工作量。。。。,正好板子上有SD卡,就想着写个Bootloader程序,通过读取SD卡中的Bin文件进行IAP升级,这样可以大大简化以后的升级。IAP升级原理就不多说了,网上相关的资料和帖子一大堆,这里简单介绍我做的IAP方案,欢迎大家批评指正!
Bootloader程序设计
bootloader程序的设计思路很简单,流程图如下:
初始化程序就不介绍了,比较简单。主要介绍下Bin文件检测以及IAP过程。我将IAP过程分为5个步骤,如下:
Step1:检查是否存在升级文件,若存在,打开后跳至Step2,若不存在或者打开失败,跳至Step5
Step2:擦除App程序对应的扇区,擦除成功后跳至Step3,若擦除失败,跳至Step5
Step3:使用f_read()函数读取Bin文件,每次读取2048个字节,并写入Flash。当文件全部被写入flash后跳至Step4,若中间出现写入错误,跳至Step5
Step4:检查栈顶地址,跳转至App程序。若栈顶地址非法,跳至Step5
Step5:此步表示本次升级失败,死循环,同时LED提示升级失败,等待重新上电
查找升级文件时我固定从Update文件夹查找,所以只要将Bin文件拷贝至Update文件夹就行了。
五个步骤的转换是通过switch函数实现的。代码如下:
while(1)
{
switch(iap_step)
{
/* Step1:检查是否存在升级文件 */
case 1:
{
/* 查找升级文件 */
result = f_findfirst(&dj, &fno, "0:/Update", "FDR_update*.bin");
/* 存在升级文件 */
if(result==FR_OK && fno.fname[0])
{
/* 获取文件名字符串 */
#if _USE_LFN
fn_str = *fno.lfname ? fno.lfname : fno.fname;
#else
fn_str = fno.fname;
#endif
/* 得到完整的文件名路径 */
sprintf(fname_path,"/Update/%s",fn_str);
/* 打开升级文件 */
result = f_open(&file_fdr,fname_path,FA_OPEN_EXISTING|FA_READ);
if(result==FR_OK)
{
/* 打开成功,准备升级 */
iap_step = 2;
}
else
{
/* 打开失败 */
f_close(&file_fdr);
f_closedir(&dj);
iap_step = 5;
}
}
else
{
/* 不存在升级文件,直接跳转 */
f_closedir(&dj);
iap_step = 4;
}
break;
}
/* Step2:存在升级文件,先擦除扇区 */
case 2:
{
FLASH_Unlock();
res = IAP_FLASH_Erase(APPLICATION_ADDRESS);
FLASH_Lock();
if( res )
{
iap_step = 3;
}
else
{
f_close(&file_fdr);
f_closedir(&dj);
iap_step = 5;
}
break;
}
/* Step3:扇区擦除成功,准备依次读取并写入 */
case 3:
{
memset(appbuf,0xFF,2052);
f_read(&file_fdr,appbuf,2048,&br);
FLASH_Unlock();
res = IAP_FLASH_Write((u32*)appbuf,(u16)ceil(br/4.0f));
FLASH_Lock();
Toggle_LED_AP();
if(res == 0)
{
f_close(&file_fdr);
f_closedir(&dj);
iap_step = 5;
}
else
{
/* 文件读完了 */
if(br<2048)
{
f_close(&file_fdr);
f_closedir(&dj);
f_unlink(fname_path);
iap_step = 4;
}
}
break;
}
/* Step4:跳转至App程序 */
case 4:
{
上一篇:stm32f2 从 SD卡里面的读取程序的bootloader
下一篇:stm32程序升级SD卡读取hex文件写入flash
推荐阅读最新更新时间:2024-11-12 22:06
设计资源 培训 开发板 精华推荐
- MIC4724 的典型应用:具有 6Vmax 输入的 3A 2MHz 集成开关降压稳压器
- LV8961HUWR2GEVK:LV8961H 评估套件
- Si9181 微功率 350mA CMOS 可调输出 LDO 稳压器的典型应用,具有错误标志/上电复位
- LT3091MPDE 500mA LED 驱动器的典型应用,具有接地 LED 接线片(散热器)
- 使用 Analog Devices 的 LT3992 的参考设计
- Mini_DSO
- AD8657ARMZ-RL同相运算放大器配置的典型应用电路
- NCV317MAB慢开启稳压器的典型应用
- 智能大棚控制
- AD587JNZ 低功耗电压基准、12 位 CMOS DAC 应用的典型应用电路