STM32F072使用SD卡进行IAP升级

2023-11-01 12浏览
百检网是一家专业的第三方检测平台,汇聚众多拥有权威资质的第三方检测机构为你提供一站式的检测服务,做检测就上百检网。百检网让检测从此检测,一份报告全国通用,专业值得信赖。

之前做的一个小项目,因为刚开始没有考虑到以后会经常升级,而每次升级都要旋开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:

{

百检网秉承“客户至上,服务为先,精诚合作,以人为本”的经营理念,始终站在用户的角度解决问题,为客户提供“一站购物式”的新奇检测体验,打开网站,像挑选商品一样简单,方便。打破行业信息壁垒,建构消费和检测机构之间高效的沟通平台