STM32F072使用SD卡进行IAP升级

发布者:huanran最新更新时间:2020-02-01 来源: eefocus关键字:STM32F072  SD卡  IAP升级 手机看文章 扫描二维码
随时随地手机看文章

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

                {  

[1] [2]
关键字:STM32F072  SD卡  IAP升级 引用地址:STM32F072使用SD卡进行IAP升级

上一篇:stm32f2 从 SD卡里面的读取程序的bootloader
下一篇:stm32程序升级SD卡读取hex文件写入flash

推荐阅读最新更新时间:2024-11-12 22:06

SD卡存储容量的计算过程
前言 SD卡底层驱动代码量不小,功能稍微有点复杂,其他的功能不说了;本博文主要介绍SD卡V1.0和V2.0版本的SD卡的容量结算; 在对SD卡进行FATFS文件系统(最新R0.13c版本)移植时,接口函数DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void *buff )会获取SD卡的三个重要信息作为f_fdisk和f_mkfs函数为整个SD卡分区和挂载文件系统的依据; 下面的代码来自于STM32官方提供的固件库的SD卡例程,但是:例程里边有错误的地方需要修改,如果不修改有可能会影响到FatFS系统移植时分区的问题,在博文的最后有特别指出; CSD寄存器(Card-Specific Data
[单片机]
<font color='red'>SD卡</font>存储容量的计算过程
SD卡大小的随身气象站:能准确预测未来天气
    明明天气预报说要下雨,结果却是阳光明媚;明明说有台风来袭,结果却是天气晴朗。这样的状况相信大家已经见怪不怪了,但不准确的天气预报确实会给人们带来影响。尤其是外出进行冲浪、爬山等运动时,人们尤其希望能够及时准确的获得气象信息。     因此在Kickstarter上就出现了这款名叫StormTag的可穿戴气象站,它拥有气温、气压、温度、紫外线等多种气象传感器,能通过配套的应用程序WeatherSignal追踪用户所在地区的气候变化,让人们随时能观测到最新的天气情况。     StormTag是一款钥匙扣外形的传感器设备,它的大小和SD记忆卡差不多大,采用六角形设计,十分轻便。它采用100%防水设计,不用担心风雨天
[安防电子]
S3C6410使用---10为SD卡与NAND FLASH的uboot加上menu菜单
用ok6410进行烧写时,每次都需要敲一大堆命令,又费时又费力. 记得以前用TQ2440时,u-boot启动时会有一个菜单,只按一个数字键就把内核烧好了,非常方便. 现在这张SD卡功能就很全面了,不仅能够直接从SD卡启动,而且还可以烧写nand flash中的u-boot zImage rootfs,呵呵. 下面就把这个功能加到ok6410的u-boot 中去. 一、修改SD卡的u-boot1.1.6 1. common/main.c中 void main_loop (void) { ....... if (bootdelay = 0 && s && !abortboot (bootdelay)) {
[单片机]
STM32利用SPI读写SD卡的程序详解
关于SD卡的基础知识这里不做过多陈述,如果有对这方面感兴趣的朋友可以直接百度一下,有很多讲SD卡的文章,这里主要是针对SD卡的读写程序实现做一些详细说明。 SD卡的读写驱动程序是运用FATFS的基础,学了FATFS就可以在SD卡上创建文件夹及文件了。 我们先从main文件了解一下程序的执行流程 int main(void) { u16 i; USART1_Config(); for(i=0;i 1536;i++) send_data ='D'; switch(SD_Init()) { case 0: USART1_Puts( \r\nSD Card Init
[单片机]
Mico SD卡的消失,仅仅是安全问题吗?
苹果(Apple)在内等智能型手机厂在2年前开始在手机采内建存储器设计后,正式舍弃Micro SD卡扩充设计,随后其他手机厂商也纷纷跟进,造成目前仍支持Micro SD卡扩展的手机寥寥无几。   媒体分析认为,造成Micro SD卡逐渐在手机失宠原因除了安全性外,某种程度来说,去Micro SD卡后让具备更大存储器需求之用户必须改采购价格更高的手机,自然可为厂商贡献更多收益。   除了苹果不再支持Micro SD卡之外,Google在去Micro SD卡的努力也早有脉络可循。当年Google所推出首款Nexus One仍可支持Micro SD卡槽,但日后各款Nexus便不再支持该功能。   Google为了更彻底
[嵌入式]
STM32与SD卡通信分层思考
  最近做了一些 STM32 和SD卡通信的一些思考,一直以来SD的驱动和应用困扰了我很久,寒假的时候看到SD简化版物理层协议的时候就傻掉了,看到SD的驱动快3000行的代码也动摇了。这几天几种地看了一下SD卡的相关内容,总结了一些体会,感觉也没有那么恐怖了。我决定从分层上来讨论SD的驱动和应用,因为这样可以构建一个清晰的逻辑,且不知哪位计算机大师曾说过:一切计算机问题都可以用分层的方法来解决。   我自己把SD卡从驱动到应用共分为4层,从下至上依次为:驱动层、物理层、文件系统层、应用层。下面一一来介绍各层的一些重要的操作。   1)驱动层   驱动层,对应到ST的库,就是stm32f10x_sdio.c/.h这个两文件。其实使用任
[单片机]
SD卡驱动程序移植
1.内核MMC/SD驱动程序框架 内核drivers/mmc目录下有3个子目录:card/、core/和host/,这刚好表示了MMC/SD驱动程序的3个层次,如下: 1)区块层 向文件系统层、用户空间提供文件操作的接口,主要文件是card/目录下的block.c,queue.c向它提供了几个函数来操作队列。 区块层调用core/目录下的core.c、sysfs.c提供的接口来识别存储卡的分区、读写存储卡等功能。 2)核心层 核心层代码在core/目录下,它封装了MMC/SD命令,实现MMC/SD协议,它调用主机控制器层的接口完成存储卡的识别、设置、读写等。 可知,
[单片机]
<font color='red'>SD卡</font>驱动程序移植
一个AVR的SD卡接口程序
/************************************************************/ /* SD Code for M32L */ /* By pasyong */ /* 2006-4 */ /* Base ICC6.31A */ /************************************************************/ #include iom32v.h #include macros.h #include 1011.h #define uchar unsigned char #define uint unsigned int #define MMC_
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved