产品固件烧写方案

 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 0xFFif ((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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/268024.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css 表示具有特定类或者其他属性的某种标签类型的元素

需求 通过 css 选择器获取某种标签&#xff08;如&#xff1a;div、input 等&#xff09;具有某个属性&#xff08;如&#xff1a;class、id 等&#xff09;的元素&#xff0c;从而修改其样式。 代码 通过 [标签].[属性] 的方式来获取 <div class"test">&l…

传输层—UDP—校验和

传输层—UDP—校验和 学习一个协议&#xff0c;当然要掌握协议的特性&#xff0c;还需要理解协议报文格式。 UDP UDP 基本特点&#xff1a;无连接、不可靠传输、面向数据报、全双工 UDP报头包含&#xff1a;源端口、目的端口、UDP报文长度、校验和。 UDP载荷中&#xff1a…

C++STL算法库中谓词的使用

什么是c的谓词 谓词概念&#xff1a; 谓词函数是一个判断式&#xff0c;一个返回bool值的函数或者仿函数&#xff0c;有几个入参就是几元谓词。一般做一个函数的参数使用【引用自百度百科】。 常见的可以作为谓词的东西&#xff1a;函数、函数指针、函数对象、lambda表达式&am…

gprMax安装步骤

本来是想直接在base环境下直接弄的&#xff0c;但是报错了&#xff0c;因为base环境里的conda版本不匹配&#xff0c;于是重新建立虚拟环境gprMax&#xff0c;如下所示。 然后激活建立的gprMax环境&#xff0c;在gprMax环境中安装git 参考文章&#xff1a; https://zhuanlan.…

Unity_ET框架项目-斗地主_启动运行流程

unity_ET框架项目-斗地主_启动运行流程 项目源码地址&#xff1a; Viagi/LandlordsCore: ET斗地主Demohttps://github.com/Viagi/LandlordsCore下载项目到本地。 启动运行步骤&#xff1a; 下载目录如下&#xff1a; 1. VS&#xff08;我用是2022版VisualStudio&#xff09…

小小的日志,大大的坑 | 京东云技术团队

1. 背景 压测过程中优化线程池以后单机qps存在性能瓶颈&#xff0c;优化过程中发现默认线程池及日志对性能存在严重的影响所以引发了一系列对日志优化的整理 2.哪些场景可能导致性能问题 在任何系统中&#xff0c;日志都是非常重要的组成部分&#xff0c;它是反映系统运行情…

pip指定优先从豆瓣源下载包

对于 Unix/macOS 系统&#xff0c;使用以下命令&#xff1a; pip config set global.index-url https://pypi.douban.com/simple/ 对于 Windows 系统&#xff0c;打开命令提示符或PowerShell&#xff0c;并使用相同的命令&#xff1a; pip config set global.index-url http…

部署Nextcloud详细步骤及优化方法

一、安装PHP8.0以上 我这里使用PHP8.0.30 [rootlocalhost ~]# php -v PHP 8.0.30 (cli) (built: Aug 3 2023 17:13:08) ( NTS gcc x86_64 ) Copyright (c) The PHP Group Zend Engine v4.0.30, Copyright (c) Zend Technologies [rootlocalhost ~]# 安装方法参考 二、安装MY…

如何设计接口公共返回码:让你的API“说话”更地道!

在构建RESTful API时&#xff0c;设计一套清晰、一致且易于理解的公共返回码体系是至关重要的。它不仅能够让前端开发者快速理解后端的响应状态&#xff0c;还能够提升整个系统的健壮性和可维护性。本文将深入探讨如何设计一个优秀的接口公共返回码体系&#xff0c;并提供Java实…

【八】python装饰器模式

文章目录 8.1 装饰器模式简介8.2 装饰器模式作用8.3 装饰器模式构成8.3.1 装饰器模式包含以下几个核心角色&#xff1a;8.3.2 UML类图 8.4 装饰器模式python代码实现8.4.1 基本装饰器的使用8.4.2 多个装饰器的执行顺序8.4.3 带返回值的装饰器的使用8.4.4 装饰器模式-关联类模式…

5V低压步进电机驱动芯片GC6150,应用于摄像机,机器人 医疗器械等产品中。具有低噪声、低振动的特点

GC6150是双通道5V低压步进电机驱动器&#xff0c;具有低噪声、低振动的特点&#xff0c;特别适用于相机变焦对焦系统、万向架、摇头机等精度、低噪声STM控制系统&#xff0c;该芯片为每个通道集成了一个256微步的驱动器。通过SPI & T2C接口&#xff0c;客户可以方使地调整驱…

OneNote for Windows10 彻底删除笔记本

找了超多方法&#xff0c;都没有用&#xff0c;我的OneNote都没有文件选项&#xff0c;要在OneDrive中删除&#xff0c;但是一直登不进&#xff0c;然后又找到一个方法&#xff1a; 在网页中打开Office的控制面板 "Sign in to your Microsoft account" 在“最近”一…