---
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. mosquitto移植到ARM

      了解mosquitto的小伙伴多数都是想在arm中进行开发,所以将mosquitto移植到ARM板上就尤为重要了,当然也有在x86中进行应用开发的,想了解linux中安装mosquitto可以看我 ...

  2. STM32F10x 串口使用DMA

    一.DMA简介 DMA(Direct Memory Access,直接存储器访问) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载.否则,CPU 需要 ...

  3. 生成带重复的笛卡尔乘积过程 Cartesian Product with Repetition

    目录 What is Cartesian Product with Repetition Code Demo What is Cartesian Product with Repetition 比如说 ...

  4. 一个在线下载地图XYZ瓦片的网站实现

    1. 什么是XYZ瓦片 XYZ瓦片是一种在线地图数据格式,常见的地图底图如Google.OpenStreetMap 等互联网的瓦片地图服务,都是XYZ瓦片,严格来说是ZXY规范的地图瓦片 ZXY规范的 ...

  5. vue03 01.vite创建项目

    目录 01.创建项目 打包工具 vite介绍 安装命令 安装项目依赖 启动项目 浏览效果 代码目录 打包 预览运行 插件使用 编辑器 01.创建项目 打包工具 vite官网 vite创建项目 vite ...

  6. ruby和glang的md5和sha1加密对比

    ruby和glang的md5和sha1加密对比 package main import ( "crypto/md5" "crypto/sha1" "f ...

  7. 原生微信小程序button去掉边框

    直接改没反应,需要使用::after更改

  8. 移动端termux安装kali

    1.相关准备一部安卓手机,termux,NVAC,浏览器2.安装kali首先进入kali的官网选择文档找到Android手机上的kali找到NetHunter-Rootless找到kali安装命令:t ...

  9. apisix~authz-keycloak插件介绍

    参考:https://apisix.apache.org/docs/apisix/plugins/authz-keycloak/ kc插件源码梳理及原理说明 如果只是进行keycloak颁发的toke ...

  10. 现代农业|AIRIOT智慧农业管理解决方案

    ​ 智慧农业是现代化技术在农业领域的应用和成果,其中物联网技术在促生产.保产量和降本增效方面起到了至关重要的作用.运用传感技术和软件平台系统对农业生产进行智能化平台化管理,解决掉传统农业问题的诸多痛点 ...