产品固件烧写方案

 1、前言

     一成熟的量产的嵌入式产品,软件一般分为BootLoader和App,BootLoader用于启动校验、App升级、App版本回滚等功能,BootLoader在cpu上电第一阶段中运行,之后跳转至App地址执行应用程序。

     因此,在发布固件的时候,会存在BootLoader固件和App固件;此时我们期望是将BootLoader固件和App固件合并成为一个固件,这样在量产时只需烧录一次即可。

2. HEX和bin的区别

    一般而言,是将HEX文件烧入MCU中,其中BIN文件数据烧到单片机的FLASH中,STM32具体地址是0x8000000。

    hex指Intel标准的HEX文件,文件内容都是ASCII编码,HEX文件中同时包含数据和地址信息,所以在烧写或下载HEX文件的时候,不需要用户指定地址。Hex文件如果用特殊的程序来查看(一般记事本就可以实现)。打开后可发现,整个文件以行为单位,每行以冒号开头,内容全部为16进制码(以ASCII码形式显示)
   HEX基本格式:
<0x3a>
[数据长度1Byte]
[数据地址2Byte]
[数据类型1Byte]
[数据nByte]
[校验1Byte]
<0x0d>
<0x0a>

     二进制文件,一个后缀名为".bin"的文件,只是表明它是binary格式。比如虚拟光驱文件常用.bin作为后缀,但并不意味着所有.bin文件都是虚拟光驱文件。
    BIN文件只有纯粹的数据(代码)信息,并不包含地址,所以烧写BIN时就需要指定烧写地址,一般可以在烧写工具上修改。

很直观的可以看到BIN文件只是HEX文件中的数据区域。

3.合并bootloader app

 1、生成app bootliader的bin文件

  配置keil或其工具生成app bootliader对应的bin文件。

   2.将bootloader填充到固定大小

     一般我都希望将bootloader后面的app烧写到固定位置,但是生成的bootloader大小肯定是变化的,这是后我们需要预设bootloader的最大尺寸,将剩余的位置填充oxff,保证app烧写在固定的flash位置。

   bootloader的bin文件填充分为两部分。

#include "stdafx.h"
#include <stdlib.h>


#define  VERSION                "V1.01.161225"


int _tmain(int argc, _TCHAR* argv[])
{
	if (argc < 3)
	{
        printf("err! argc < 3.\n");
		return -1;
	}
 
	long   len = (long)strtol(argv[2], NULL, 16);

	printf("fz append. %s\n",VERSION);
	printf("file:%s, size:0x%x\n",argv[1],len);

	FILE	*fp;
	long	off;
	long    append = 0;

    //test file is exist and calculate file size
	//"..\\test\\aa.bin"
    if ((fp = fopen(argv[1], "rb"))==NULL)
    {
        printf("Can not open file\n");
        return -1;
    }

	fseek(fp,0,SEEK_END);
	off=ftell(fp);

    fclose(fp);

	if (off >= len)
	{
       printf("file size is too large. %d > %d\r", off, len);
	   return -1;
	}else
	{
       append = len - off;
	}

	//append data 0xFF
    if ((fp = fopen(argv[1], "ab+"))==NULL)
    {
        printf("Can not open file\n");
        return -1;
    }
    
	fseek(fp,0,SEEK_END);
	printf("open sucess.append size %d append %d\r\n",off,append);
	while(append--)
	{
        fputc('\xff',fp);
	}

	fclose(fp); 

	return 0;
}

上面的代码可用Microsoft Visual Studio的IDE编译生成AppendFixSize.exe 。为填充代码,下面的为填充脚本。

@echo off
@AppendFixSize.exe     Boot.bin    0x4000
@echo   append finish
copy /b .\Boot.bin + .\App.bin Firmware.bin 
srec_cat.exe Firmware.bin -Binary -offset 0x8000000 -o Firmware.hex -Intel
del Firmware.bin
@pause

后续将Fireware.hex 烧入MCU中即可

参考文档:

  如何将BootLoader与APP合并成一个固件

  hex文件与bin文件的区别以及如何在keil中生成bin文件_bin文件hex文件-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水火汪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值