---
title: 合并STM32 iap的hex文件合并为一个hex文件
date: 2020-06-15 04:32:26
categories:
tags:
- iap
- stm32
---

背景

只要设计了IAP功能,一般就需要有2段程序。手动烧写2段程序到不同的分区是一件比较麻烦的事情。

当然,也可以使用分散加载文件来把2段程序写为一个工程,但是工作量更大。

方法

记得在MDK中Options - Output 勾选 Create HEX File

先写再读写FALSH

IAP 先烧写进flash 的 0x0800 0000 开始位置, APP烧写到 flash 的0x 0800 3000开始的地方; 之后通过我上一篇博文的 IAP程序的文件读出功能读取flash 上的数据读到一个.bin文件上。然后通过程序刷写工具刷入起始flash地址为 0x0800 0000中。

手动编辑

手动合并iap 和app 的.hex 文件(麻烦,出错率高)

(1)设置IAP程序下载到flash 的开头地址为0x0800 0000,然后编译程序生成hex文件。

(2)设置APP程序下载到flash 的开头地址(地址依据芯片和程序大小而定),然后编译程序生成hex文件。

(3)用 notepad++ 打开 IAP 的hex文件和APP的hex 文件

    把IAP的.hex 最后一句结束语句去掉(即:删除:00000001FF)

    把APP的.hex 全部内容拷贝复制到 刚才删掉结束语句的 IAP的.hex后面

(4)把两个hex合成的hex文件重新命名为XXX.hex,然后通过烧写工具烧写到0x0800 0000 开始位置的地址即可。

这里有python3的实现

# -*- coding: utf-8 -*-
import sys,os
import intelhex def createHelpDialog():
#print("软件实现的是将两个Hex文件同时转为Bin文件并且合并为一个Bin文件输出的功能。")
print("将两个Hex文件合并为一个Hex文件。") def mergeHex(inhex1, inhex2, outhex):
# 两个 hex
#inHex1 = 'bootloader.hex'
#inHex2 = 'app.hex'
#outHex = 'python.hex' inHex1 = inhex1
inHex2 = inhex2
outHex = outhex #get file name
hex_boot_len = os.path.getsize(inHex1)
hex_app_len = os.path.getsize(inHex2)
print("First %s size is %d" %(inHex1, hex_boot_len))
print("Second %s size is %d"%(inHex2, hex_boot_len))
## 删除 之前的结果
if(os.path.isfile(outHex)):
os.remove(outHex) #先读写hex,再合并成bin
print("Merge Hex file....")
hex_boot_file = open(inHex1, 'rb')
hex_app_file = open(inHex2, 'rb')
hex_file = open(outHex, 'ab') for h in hex_boot_file.readlines():
if h == b':00000001FF\r\n' :
print(h)
break
else :
hex_file.write(h)
continue for h in hex_app_file.readlines():
hex_file.write(h)
hex_file.write(b'\r\n') hex_boot_file.close()
hex_app_file.close()
hex_file.close() def hex2bin(mergeHex, outBin) :
## 删除 之前的结果
if(os.path.isfile(outBin)):
os.remove(outBin)
print("Hex File To Bin File...")
# BUG
intelhex.hex2bin(mergeHex, outBin, None, None, None, 00)
if(os.path.isfile(outBin)):
bin_file_len = os.path.getsize(outBin)
print("Bin File is [%s] "%(outBin))
print("Bin File size is [%d] "%(bin_file_len))
print("Hex File To Bin File completly") if __name__ == "__main__":
#mergeHex('bootloader.hex', 'app.hex', 'python2.hex')
#hex2bin('python.hex', 'python.bin')
hex2bin('merge.hex', 'python.bin')

使用现成的工具

我在网上找到了一个开源的项目:STM32-IAP-HEX-Merge

语言为c#,运行环境为 vs

合并STM32 iap的hex文件合并为一个hex文件的更多相关文章

  1. Linux内核驱动将多个C文件编译成一个ko文件的方法——每一个C文件中都有module_init与module_exit

    以两个C文件为例: 将本该被分别编译成adc_device.ko和adc_driver.ko的adc_device.c.adc_driver.c编译成一个ko文件! 採用方法: 第一步.改动C文件 1 ...

  2. PyCharm在同一个包(package)下,如何把一个.py文件导入另外一个.py文件下

    PyCharm在同一个包(package)下,如何把一个.py文件导入另外一个.py文件下 在同一个包下只需要用import 掉以后就可以找到模块所在的位置,但是如果不在同一个包下,在需要返回父级调用 ...

  3. 合并csv文件保存到一个csv文件中-保留表头

    主要实现功能: 在同一文件夹下的所有csv文件全部合并到同一个csv文件中,并将csv文件的表头保留 1 import os 2 import pandas as pd 3 path = os.get ...

  4. WPF中Style文件引用另一个Style文件中的样式

    第1种方法: 直接在当前Style文件(*.xaml)文件中使用: <ResourceDictionary.MergedDictionaries>来进行合并 <!-- 关键是注意so ...

  5. python 一个包中的文件调用另外一个包文件 实例

    python不同文件夹中模块的引用调用顺序,被调用的模块中①有类的 模块.类().方法()   ②无类的:模块.方法() test包中testIm.py 调用 test1包中testIm1.py中的方 ...

  6. 如何将一个h5ad文件内部添加一个csv文件作为属性obsm

    问题展开 学习生物信息的时候发现,需要将一个M * N的csv文件作为anndata文件的.X部分,一个M * 2的csv文件作为anndata文件的空间位置信息标识. 首先先读M*N的文件 myda ...

  7. matlab 循环读入多个mat文件组合成一个mat文件

    今天做实验,需要到这个功能,在朋友的告知下,写了代码,在此留个标记 clc clear load('F:\效果对比\colorhist\1.mat'); a=ans; a=a'; : filename ...

  8. 将一个html文件引入另一个html文件的div中

    width="" height=""属性可根据要求自己设定

  9. [java]将多个文件压缩成一个zip文件

    此文进阶请见:https://www.cnblogs.com/xiandedanteng/p/12155957.html 方法: package zip; import java.io.Buffere ...

  10. RTF文件合并 备忘

    多个独立的rtf文件合并时,如果文件纸张方向存在横向 纵向不一致时,文件之间需要插入分节符 \pard \ltrpar\qj \li0\ri0\nowidctlpar\wrapdefault\aspa ...

随机推荐

  1. Nginx 简单应用(Windows os)

    实际问题如下: 我的电脑上有vm虚拟机,我有两个网络,一个叫137,一个叫102 ,我现在vm的网络是102的网络(137不允许被vm使用),但是别人都是137的网络,如何让137的局域网访问我的vm ...

  2. Mybatis的逆向工程(generator)

    Tips:Mybatis generator官网 http://www.mybatis.org/generator/configreference/commentGenerator.html Myba ...

  3. 【Python基础】两个参数的for循环步长写法

    一个参数for循环步长写法 >>> for i in range(1,10000,1000):print(i) ... 1 1001 2001 3001 4001 5001 6001 ...

  4. virutalenvwrapper安装和使用

    目录 virutalenvwrapper安装和使用 目的: 1.安装pip 2.安装virutalenv和virutalenvwrapper 3.配置环境变量 4. 创建虚拟环境 5.列出全部的虚拟环 ...

  5. rails 之下载

    控制器 def index #传给前端展示层当前的id @id = 6 end # http://127.0.0.1:3000/admin/category_statistics/export_tab ...

  6. uniapp微信小程序uni.request捕获500异常

    通常使用ajax,axios等进行服务请求,500错误或者其他的错误都会直接进入到错误通道里头,比如ajax异常的话会进入到error的回调函数里头,axios异常会进行到catch里头,一开始以为u ...

  7. QGIS开发笔记(三):Windows安装版二次开发环境搭建(下):将QGis融入QtDemo,添加QGis并加载tif遥感图的Demo

    前言   使用QGis的目的是进行二次开发,或者说是融入我们的应用(无人车.无人船.无人机),本片描述搭建QGis二次基础开发环境,由于实在是太长了,进行了分篇: 上半部分:主要是安装好后,使用QtC ...

  8. 公司es扩容kibana添加密码访问

    准备工作 基础优化[部署好的es无需操作,新server操作] setenforce 0 getenforce sed -i 's#^SELINUX=.*$#SELINUX=disabled#g' / ...

  9. iOS11 ReplayKit2 问题总结

    一.苹果自6月30日发布iOS11系统之后,其中的Airplay的协议发生变更,导致市场上的苹果直播助手(录屏)大部分变得不可用,因此在iOS11之后需要寻找新的技术方案来录屏 1)采用系统提供的Re ...

  10. OpenCV笔记(9) calcHist绘制直方图

    直方图只是简单地将数据归入预定义的组,并在每个组内进行计数.也可以选择对数据提取特征,再对特征进行计数,这里的特征可以是梯度的长度.梯度的方向.颜色或其他任何可以反应数据特点的特征.也就是说,直方图是 ...