历史上的今天
返回首页

历史上的今天

今天是:2025年02月01日(星期六)

2020年02月01日 | STM32F072使用SD卡进行IAP升级

2020-02-01 来源:eefocus

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

                {  

推荐阅读

史海拾趣

HEC Inc公司的发展小趣事

机顶盒,全称为数字视频变换盒,是现代家庭娱乐中不可或缺的重要设备。从广义上讲,任何与电视机连接的网络终端设备均可视为机顶盒,其发展历程涵盖了从模拟频道增补器到数字卫星、地面及有线电视机顶盒的广泛范畴。而从狭义角度看,机顶盒特指那些具备数字处理能力的设备,如IPTV机顶盒、DVB-S卫星机顶盒、DVB-T地面机顶盒及DVB-C有线电视机顶盒等。

机顶盒的核心功能在于接收并转换数字电视信号,使之能在传统或智能电视上播放。它不仅能接收来自有线电缆、卫星天线及宽带网络的信号,还能提供电子节目指南、网页浏览等增值服务。通过机顶盒,用户能够享受到高清乃至4K超高清的电视节目,体验更为细腻的画面和震撼的音效。此外,机顶盒还具备网络交互能力,支持在线购物、观看网络视频、玩游戏等多元化活动,使电视机从单向接收信息的设备转变为智能互动终端。

随着技术的不断进步,机顶盒正朝着高清化、智能化方向发展。未来,机顶盒将不仅限于基本的信号接收与解码功能,还将融入更多智能推荐、语音识别等先进技术,为用户提供更加个性化、便捷的娱乐体验。总之,机顶盒作为连接电视与互联网的桥梁,正以其丰富的功能和广泛的应用场景,不断满足用户日益增长的娱乐需求。

虹冠电子(Champion)公司的发展小趣事

虹冠电子始终秉持着节能环保的理念,将这一理念融入到产品研发和生产过程中。公司推出的电源管理IC产品,不仅具有高效能、低能耗的特点,还具备类零电压切换PFC与PWM技术,进一步提高了电源的使用效率。虹冠电子的产品广泛应用于个人计算机、云端运算服务器、LED显示屏等领域,为全球节能减排事业做出了积极贡献。

迈翔科技(COILMX)公司的发展小趣事

进入21世纪后,迈翔科技面临了来自国内外同行的激烈竞争。为了保持竞争力,公司投入大量资源进行技术研发和创新。通过不懈努力,公司成功开发出了一系列高性能的贴片功率电感和大电流电感,这些产品凭借卓越的性能和稳定的品质,迅速获得了市场的认可。

EXXELIA Group公司的发展小趣事

进入21世纪后,迈翔科技面临了来自国内外同行的激烈竞争。为了保持竞争力,公司投入大量资源进行技术研发和创新。通过不懈努力,公司成功开发出了一系列高性能的贴片功率电感和大电流电感,这些产品凭借卓越的性能和稳定的品质,迅速获得了市场的认可。

Hi-G Relays公司的发展小趣事

迈翔科技(COILMX)的创始人看到了电子行业,特别是电感器市场的巨大潜力。1996年,公司正式成立,初期主要专注于SMD电感的设计、制造和销售。公司从香港起步,逐步在深圳设立工厂,引进先进的生产设备和技术,为未来的发展奠定了坚实的基础。

CalAmp公司的发展小趣事

CalAmp公司以其卓越的无线产品、设备和方案供应能力,赢得了业界的广泛认可。某年,CalAmp与全球知名的电子分销商Mouser签署了全球分销协议。这一合作使得Mouser能够备有CalAmp公司的一系列产品,如UHF和VHF收发器模块、遥感勘测模块以及适用于不同频带的无线通信装置。这些产品广泛应用于各种无线通信领域,其方便快速集成的特点大大加快了客户产品的上市时间,同时提供了性价比极高的无线解决方案。这一协议的签署不仅进一步巩固了CalAmp在全球无线产品市场的领导地位,也为Mouser带来了更多的业务机会。

问答坊 | AI 解惑

cyclone芯片一般要多少钱一块?

cyclone芯片一般要多少钱一块?…

查看全部问答>

PADSLAYOUT2007

想学习PADSLAYOUT2007的工程师看看吧,不错的东西…

查看全部问答>

创意水管灯

水管也有它的生命: …

查看全部问答>

ce6的中文界面和activesync冲突?

以前都是用英文界面的ce6,一直没什么问题,这几天把界面改成了中文,结果就发现activesync无法连接成功,只要把usb fuction口和pc连接后,不但activesync无法连接,而且整个系统的运行速度也会变得非常慢(但是在串口调试软件上有插入usb fuction ...…

查看全部问答>

Windows CE 和 嵌入式Windows XP 比较

Windows CE有500个左右组件;嵌入式Windows XP大约是12,000个。 1、可运行的Windows CE最小尺寸约为200 KB ,平均尺寸大约是4 MB到18 MB。 2、嵌入式Windows XP 最小的尺寸约为5 MB,平均尺寸约为40 MB左右。 3、Windows CE是实时OS,嵌入式Win ...…

查看全部问答>

如何使用PsCreateSystemThread

请教各位大虾,系统线程函数PsCreateSystemThread应该在什么位置创建。我在deviceIoCtrl中创建线程后,安装驱动的时候,电脑回重启,在DriverEntry入口函数末尾创建会出现同样的问题。请各位大虾帮帮忙,这应该如何解决。 我创建的这个线程主要是 ...…

查看全部问答>

用pb4.2下用网线下载WINCE镜像出错.无法下载,,,

用pb4.2下用网线下载WINCE镜像出错.无法下载,,, 弹出一个对话框,标题:Connection to Target Failed. 内容:platform Builder was unable to make a connection to the target device.Please make sure all setting in Configure Remo ...…

查看全部问答>

为什么在我刚装的vs2003中不能创建 智能设备应用程序?

vs2003 我刚装上。 开发一般的windows应用程序没有问题。 但在创建一个winCE的windows应用程序时,在“Form1.cs[设计]”这个窗口中显示: “加载文档时出错。修复此错误,然后再重新尝试加载该文档。错误信息如下所示: 文件中的类都不能进行设 ...…

查看全部问答>

关于外部中断问题

为什么我设置了外部按键中断,在FLASH中调试,在调试时按下会跳转到中断服务程序(闪烁灯翻转),而关掉板子,再打开板子就不运行中断了,而式一直卡在灯亮的地方,这是为什么呢?调试了好几天了,着急啊。 求各位指教。。下面贴代码,开发环境是I ...…

查看全部问答>

nxp今年怎么不见培训活动

nxp今年怎么不见培训活动…

查看全部问答>