HEX文件

HEX文件以及特定位置写入

stm32特定位置写入数据

1
2
const char __attribute__((section(".lua_script"))) script[] = {1,2,3,4,5,6};
//数组名可以去掉
1
2
3
4
5
6
.lua_script 0x08003000 :
{
. = ALIGN(4);
KEEP(*(.lua_script))
. = ALIGN(4);
} >FLASH

编译输出hex

1
2
3
4
5
6
7
8
9
:082D5400434445460000000065
:042D5C00F900000872
:042D6000CD0000089A
:083000000102030405060000B3
:10300800AA550000000000000000000000000000B9
:103018000000000000A24A04001000100010001078
:043028000010001084
:04000005080029893D
:00000001FF

:083000000102030405060000B3

由于链接文件多处使用”.”定位,链接器链接是按照SECTIONS里的段顺序排列的,前面的排列完之后就能计算出当前地址,私有部分最好自定义段位置,各个段不要超过地址限制
如:

1
2
3
4
5
6
7
FLASH_USR (rx)      : ORIGIN = 0x8006000, LENGTH = 8K
.lua_script 0x8007F00:
{
. = ALIGN(4);
KEEP(*(.lua_script))
. = ALIGN(4);
} >FLASH_USR

stm32特定位置写入函数

1
2
3
4
5
6
.lua_script2 0x80F0100 :
{
. = ALIGN(4);
KEEP(*(.lua_script2))
. = ALIGN(4);
} >FLASH_USR

运行函数,地址+1

1
(*(void(*)())0x80F0100+1)();

链接文件脚本说明

HEX文件

  • 第一个字节0×02表示该行数据中有两个数据(字节)
  • 第二个、第三个字节0x00 0x00表示本行数据的起始地址位
  • 第四个字节有0x00 0x01 0x02 0x03 0x04 0x05,分别有以下含义
    ‘00’ Data Rrecord: 用来记录数据,HEX文件的大部分记录都是数据记录
    ‘01’ 文件结束记录: 用来标识文件结束,放在文件的最后,标识HEX文件的结尾
    ‘02’ 扩展段地址记录: 用来标识扩展段地址的记录
    ‘03’ 开始段地址记录: 开始段地址记录
    ‘04’ 扩展线性地址记录: 用来标识扩展线性地址的记录
    ‘05’ 开始线性地址记录: 开始线性地址记录
  • 最后一个字节0xf8为校验和。校验和= 0x100 - 累加和。在nodepad++中,如果该校验和不是绿色,则表示该校验和是错的。

注意,0×04标识扩展线性地址的记录,所以如020000040002f8中,拓展地址是0002。那么第二行数据的起始地址就是0002c000,即0x0002c000开始

HEX文件详解

其他

KEIl编译stm32,堆栈使用超过设定便会溢出

GCC编译,根据链接文件排列各段,堆栈大小设置只起到判断大小是否超过RAM,对结果没有任何影响

ARM 之一 ELF文件、镜像(Image)文件、可执行文件、对象文件 详解

map文件可以看出Reset_Handler处开始运行,然后顺序进入函数
Linker script and memory map可以看出
__do_global_dtors_aux出自gcc中crtbegin.o

bootloader合并

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@echo off

set BOOT_HEX=.\boot.hex
set APP_HEX=.\app.hex
set OUT_HEX=.\out.hex

set TEMP=.\temp.txt

:HEX_STEP
set var=":00000001FF"
findstr /v %var% "%IAP_HEX%" >>%TEMP%

del %OUT_HEX%
type %TEMP% %APP_HEX% >> %OUT_HEX%

del %TEMP%

依赖jlink.exe JLinkARM.dll

1
jlink.exe config.txt

config.txt

1
2
3
4
5
6
7
8
9
si 1     // #选择swd接口                                                   
speed 4000 //设置速度
device STM32F427II
r //重新复位目标
h //挂起目标
loadfile "./out.hex"
setpc 0x08000000 //设置pc指针
g
q
-->

请我喝杯咖啡吧~

支付宝
微信