Bootloader升级方式一———擦、写flash在RAM中运行

发布者:鑫森淼焱最新更新时间:2020-01-09 来源: eefocus关键字:Bootloader  升级方式  flash  RAM 手机看文章 扫描二维码
随时随地手机看文章

在汽车ECU软件运行中,软件代码运行安全性是第一,在代码中尽可能的不要固化有flash_erase、flash_write操作存在,主要是防止当出现异常情况时,程序跑飞,误调用erase、write对flash操作,使得原软件受到破坏,以致ECU不能正常工作。

Bootloader也称为启动引导加载程序,这段程序是硬件设备在上电复位之后执行的第一段软件代码。

方式一、为了实现在线更新功能,Bootloader程序需要对flash进行操作。一般情况下,我们将FLASH操作程序作为Bootloader组件的一部分固化在存储器中,在需要执行flash擦除或烧写操作时,先将该部分代码复制到RAM中,再做调用。操作代码的复制工作也可以在Bootloader启动阶段完成。


方式二、两级Bootloader方案,没有在flash存储器中固化flash擦写代码,而是通过通讯口将该部分代码从上位机下载到指定的RAM出,在需要指出flash擦除或烧写操作时,再调用RAM中的该代码。


方式三、Bootloader制作下载引导程序,此软件不固化flash擦写代码,通过通讯口下载另外Bootloader(包含flash擦写操作)到指定的RAM中,跳转到RAM运行升级流程。

现在我们做简单的测试,按照方式二测试,Bootloader中没有擦写falsh操作代码,我们把flash_erase和flash_write编译后生成的bin信息保存在Bootloader软件的一个数组中(PS:RAM中就是存放全局变量等信息,通过上位机下载也是存放在指定RAM中,我们可以使下载保存在数组中,效果一样)。


1、新建flash工程;

2、flash.c文件中主要包含:uint32_t flash_erase(uint32_t u32addr)和uint32_t flash_write(uint32_t u32addr, uint32_t u32data),两个函数,注意:这两个函数中不能存在调用外部函数、全局变量信息;


3、编译生成bin文件,通过.map文件查看这两个函数的位置;

4、在生成的bin文件中提取出这两个函数信息,重新生成新的bin文件;注意地址是偶数

或者上位机直接下载此bin文件(原始bin文件),在MCU端需要从0x218地址处提取数据;

5、在boot中开辟擦、写两个函数code长度的数组,为下载擦、写函数的数据存放在RAM中做准备,以数组形式放在ram中;

6、 将数组地址强制类型转换为函数指针;


7、在调用这个函数的地址,用函数指针来调;


#define FMC_ISPCMD_PROGRAM     0x21     /*!< ISP Command: Program Flash    */

#define FMC_ISPCMD_PAGE_ERASE  0x22     /*!< ISP Command: Page Erase Flash */

 

uint32_t flash_erase(uint32_t u32addr)

{

FMC->ISPCMD = FMC_ISPCMD_PAGE_ERASE; /* Set ISP Command Code */

    FMC->ISPADR = u32addr;               /* Set Target ROM Address. The address must be page alignment. */

//__set_PRIMASK(1);

__asm("CPSID I");

FMC->ISPTRG = 0x1;                   /* Trigger to start ISP procedure */

    __ISB();                             /* To make sure ISP/CPU be Synchronized */

    while(FMC->ISPTRG);                  /* Waiting for ISP Done */

    //__set_PRIMASK(0);

__asm("CPSIE I");

 

    /* Check ISPFF flag to know whether erase OK or fail. */

    if(FMC->ISPCON & FMC_ISPCON_ISPFF_Msk) {

        FMC->ISPCON |= FMC_ISPCON_ISPFF_Msk;

        return 1;

    }

    return 0;

}

uint32_t flash_write(uint32_t u32addr, uint32_t u32data)

{

FMC->ISPCMD = FMC_ISPCMD_PROGRAM;   /* Set ISP Command Code */

    FMC->ISPADR = u32addr;              /* Set Target ROM Address. The address must be word alignment. */

    FMC->ISPDAT = u32data;              /* Set Data to Program */

  // __set_PRIMASK(1);

__asm("CPSID I");

    FMC->ISPTRG = 0x1;                  /* Trigger to start ISP procedure */

    __ISB();                            /* To make sure ISP/CPU be Synchronized */

    while(FMC->ISPTRG);                 /* Waiting for ISP Done */

    //__set_PRIMASK(0);

__asm("CPSIE I");

 

    if(FMC->ISPCON & FMC_ISPCON_ISPFF_Msk) {

        FMC->ISPCON |= FMC_ISPCON_ISPFF_Msk;

        return 1;

    }

return 0;

}


下面我们来是测试代码:


//编译生成的擦、写文件,此处直接加载到数组中,而非通过上位机下载

//__align(4) :对齐方式

__align(4) uint8_t flash_erase_buf[]={

0x01,0x46,0x22,0x20,0x11,0x4A,0xD0,0x60,0x10,0x46,0x41,0x60,0x72,0xB6,0x01,0x20,

0x10,0x61,0x00,0xBF,0x00,0xBF,0x00,0xBF,0xBF,0xF3,0x6F,0x8F,0x00,0xBF,0x00,0xBF,

0x00,0xBF,0x00,0xBF,0x09,0x48,0x00,0x69,0x00,0x28,0xFB,0xD1,0x62,0xB6,0x07,0x48,

0x00,0x68,0x40,0x22,0x10,0x40,0x00,0x28,0x06,0xD0,0x04,0x48,0x00,0x68,0x10,0x43,

0x02,0x4A,0x10,0x60,0x01,0x20,0x70,0x47,0x00,0x20,0xFC,0xE7,0x00,0xC0,0x00,0x50,

};

 

__align(4) uint8_t flash_write_buf[]={

0x02,0x46,0x21,0x20,0x12,0x4B,0xD8,0x60,0x18,0x46,0x42,0x60,0x81,0x60,0x72,0xB6,

0x01,0x20,0x18,0x61,0x00,0xBF,0x00,0xBF,0x00,0xBF,0xBF,0xF3,0x6F,0x8F,0x00,0xBF,

0x00,0xBF,0x00,0xBF,0x00,0xBF,0x0A,0x48,0x00,0x69,0x00,0x28,0xFB,0xD1,0x62,0xB6,

0x07,0x48,0x00,0x68,0x40,0x23,0x18,0x40,0x00,0x28,0x06,0xD0,0x04,0x48,0x00,0x68,

0x18,0x43,0x03,0x4B,0x18,0x60,0x01,0x20,0x70,0x47,0x00,0x20,0xFC,0xE7,0x00,0x00,

0x00,0xC0,0x00,0x50

};

 

typedef void (*flash_erase_handler)(uint32_t u32addr);

typedef void (*flash_write_handler)(uint32_t u32addr, uint32_t u32data);

 

flash_erase_handler flash_erase = (flash_erase_handler)(flash_erase_buf + 1); // cortex-mo 使用thumb指纹,函数地址低位为1

flash_write_handler flash_write = (flash_write_handler)(flash_write_buf + 1);

 

int main(void)

 

main_powerOnInit();

SYS_UnlockReg();

DrvFMC_Open();

DrvFMC_EnableAPUpdate();

DrvFMC_Erase(SPIFLAG_ADDR);

DrvFMC_Write(SPIFLAG_ADDR,0x88776655);

DrvFMC_DisableAPUpdate();

DrvFMC_Close();

SYS_LockReg();

//DisableInterrupts;

SYS_UnlockReg();

DrvFMC_Open();

DrvFMC_EnableAPUpdate();

flash_erase(SPIFLAG_ADDR);

flash_write(SPIFLAG_ADDR,0xAABBCCDD);

DrvFMC_DisableAPUpdate();

DrvFMC_Close();

SYS_LockReg();

//EnableInterrupts;

for (;;);

}


测试结果显示,的确能够写法flash中。

下面附上车载诊断升级示意流程图:

关键字:Bootloader  升级方式  flash  RAM 引用地址:Bootloader升级方式一———擦、写flash在RAM中运行

上一篇:写STM8flash和写外部flash EN25Q16A-104HIP 的函数小纪
下一篇:STM8做BUS OFF快慢恢复策略

推荐阅读最新更新时间:2024-11-02 13:33

单片机系统RAM的测试方法回顾与研究
在各种单片机应用系统中,存储器的正常与否直接关系到该系统的正常工作。为了提高系统的可靠性,对系统的可靠性进行测试是十分必要的。通过测试可以有效地发现并解决因存储器发生故障对系统带来的破坏问题。本文针对性地介绍了几种常用的单片机系统RAM测试方法,并在其基础上提出了一种基于种子和逐位倒转的RAM故障测试方法。 1 RAM测试方法回顾 (1)方法1 参考文献中给出了一种测试系统RAM的方法。该方法是分两步来检查,先后向整个数据区送入#00H和#FFH,再先后读出进行比较,若不一样,则说明出错。 (2)方法2 方法1并不能完全检查出RAM的错误,在参考文献中分析介绍了一种进行RAM检测的标准算法MARCH—G。MARCH一G算
[单片机]
使用Flash Magic烧写LPC176
1、 连接串口到PC机 注:串口线必须是全状态 2、 将J1、J2用短接棒短接 3、 打开Flash Magic软件 4、 设置Flash Magic ★ 打开“Options”下的Advanced Options… ★ 按照下图设置后退出 ★ 参照下图设置,“Device“那里选对要下载的器件 ★ 点击“Browse”选择要下载的程序 ★ 点击“Start”下载程序,下载程序前 J1 和 J2的 1、2 脚需要加上短路帽。 ★ http://www.flashmagictool.com/提供最新的下载软件。 5、 出现的问题与解决 ★ 出现串口波特率失败问题 有三个原
[单片机]
使用<font color='red'>Flash</font> Magic烧写LPC176
华为P10闪存混着用因供应链Flash严重缺货?
余承东日前爆料称,P10系列手机混用UFS和EMMC两种闪存方案的核心原因,就是供应链Flash严重缺货,华为的存储至今还处于缺货之中。那么,NAND Flash制造商如今产能状况如何?缺货问题何时能够得到缓解?下面就随嵌入式小编一起来了解一下相关内容吧。 华为P10闪存混着用因供应链Flash严重缺货? 据DIGITIMES报道,全球存储器主要的几家大型原厂开始针对3D NAND Flash提高产能,包括三星电子、SK海力士、东芝、美光、英特尔等,3D NAND产能将有望在今年下半年放量。有后段封测厂表示,供给紧缺局面得到稍微缓解、价格回稳,至少要等到2017年第三季度。 主要是因为2017年存储器大厂将工艺从2D NA
[嵌入式]
Flash Download failed - "Cortex-M3"解决方法
前几天在玩STM32F1的时候,烧录代码的时候出现这样一个错误。 Error:Flash Download failed - Cortex-M3 首先肯定要看配置问题: 采用不同的仿真器,需要配置的选项就不同,这个完全可以自己看产品说明。 当确定配置没有问题后,还是同样的问题出现,可以来到下图的配置框中: 点击“”“Add”后就会出现如下的Programming Algorithm: 在里头找到自己芯片对应的型号,点击“”Add“”添加就可以解决问题了。 如果真的很不凑巧,在Programming Algorithm愣是没找到你需要的型号,可以直接去你安装keil文件夹下: 将MDK keil5AR
[单片机]
<font color='red'>Flash</font> Download failed -
索尼新机现身GFXBench:配骁龙630+3GB内存
11月21日消息 又有一款索尼新机被曝光,不出意外的话这款新机应该会于明年发布,其型号为H4133,相关配置也都已经在GFXBench网站中列出。   这款索尼新机定位中端,搭载了骁龙630处理器,内存组合则是3GB RAM+32GB ROM,屏幕为5.2英寸1080P显示屏,预装Android 8.0系统。主摄像头为2100万像素,支持4K视频录制和LED闪光灯,前置摄像头则为800万像素,该机支持NFC。   之所以说该机将会在明年推出,是因为其型号以“H”开头,而索尼手机型号开头字母每年递增一次,2017年手机以“G”开头。
[手机便携]
韦东山ARM第一期作业(三)内存控制器和SDRAM
01 - 作业所在路径 ARM裸机1期加强版源码文档图片文档图片第012课_内存控制器与SDRAM 02 - 作业描述 把第11课实现的printf函数移植到011_sdram程序中,修改内存数据,再以16进制打印出来 03 - 作业解答 移植很简单,把.h和.c以及除法库lib1funcs.S放到工程中,只需要在Makefile中添加uart_printf.c和lib1funcs.S的编译,再在arm-linux-ld链接后面添加.o文件,最后在需要使用printf的地方#include “uart_printf.h”,直接使用就可以 #修改前 all: arm-linux-gcc -c uart.c -o uar
[单片机]
基于RAM的嵌入式可编程控制器的设计与实现
引言 可编程逻辑控制器(PLC)以其高可靠性和使用方便的特性.使其在现代工业控制中得到了广泛的应用。随着工厂自动化的进展,对PLC之间以及PLC同其他控制设备之间相互联系的要求也相应提高。由于PLC的通讯方式为串行通讯,受通讯方式的制约,传统的PLC(即外挂式PLC)难以胜任微机和PLC都必须参与实时控制和控制功能较为复杂的系统。当输入/输出点数多时,PLC体积会随点数的增多而增大,安装不太方便。此外,目前国内因没有自己的品牌,在应用PLC的场合仍多选用国外产品,品牌多,成本高,因此研制符合实际应用需求的国产化新型PLC系统及其通用开发平台具有重要意义和应用前景。 为了提高速度,降低成本,可采用虚拟式PLC,即把PLC上的
[单片机]
基于<font color='red'>RAM</font>的嵌入式可编程控制器的设计与实现
缺少仿真器时avr单片机的开发方法
对FLASH存贮器单片机,不要仿真机也能方便快速地开发程序。具体可以从以下几方面入手: 一、尽量使用高级语言开发系统程序 您有没有在写汇编程序时,标错一个标号而浪费您大把时间找错或跳转偏移量过大而不得不改动程序结构的经历。其实您如果使用高级语言开发程序,就不会有这样的痛苦。 在开发程序时,除了建立一个良好的开发文档外,使用语言的选择也很重要。有许多人认为使用汇编写程序比较精简,而用高级语言开发会浪费很多程序空间,其实这是一种误解。对一个有经验的,而且非常熟悉某种单片机的汇编高手而言,他是能写出比高级语言更精简的代码。而对汇编不是很熟的开发者、或突然更换了一种新的单片机,您能保证一定可以写出比高级语言更简练的代码吗? 高级语言的优越
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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