STM32烧录指南:Hex/bin文件解析

一、STM32的烧录

1. 用IDE工具烧录

        可以配置IAR或Keil,用IDE下载。硬件工具需要使用ST-Link(分为SWD或Jtag方式,SWD连线少,比较常用于调试)或J-Link连接到板子的相应引脚(详见Jtag引脚定义)。需要注意的是ST-Link烧录盒分为隔离和非隔离,如果板子必须断电烧录,那么用非隔离的烧录(这个时候烧录器也会带电让STM32运行,某些DSP需要单独供电),如果板子需要上电烧录或在线调试,一般使用带隔离的ST-Link或JLink。

2. 用ST-LINK Utility工具烧录

        下载HEX文件,设置好地址后,可以下载app(如果是STM32,那么起始地址一般是0x0800xxxx)和bootloader(如果是STM32,那么起始地址一般是0x08000000)。这个工具大概作用总结如下:

  • 擦除flash相应区域
  • 根据地址设置,可以分别烧录app或bootloader到flash,如果app和bootloader合成为一个hex,那么可以把地址设置为0x08000000,一次烧录app和bootloader到flash的两个区域。
  • 可以作为量产PCBA板的烧录工具
  • 如果板子上STM32的flash没有被添加保护,可以用它读出flash里面的所有数据,然后生成一个hex文件。
  • 可以读取STM32芯片的型号、ID、版本等信息
  • 此软件包含了ST-Link驱动,安装了它,像Keil 或IAR在线调试下载等就不需要额外安装驱动了。        
  • 3. 在线升级

            这种方式只能更新app,不能更新bootloader,具体方法是在程序运行的时候,如果在线升级被触发,那么把一个变量设置为烧录模式(这个变量存放于ram某个位置,一般比较末尾的位置,并在代码中使用相应关键字限定次变量在内存中不会被设置为0,即使STM32被复位)。然后不喂狗,让STM32复位进入bootloder,在bootloader代码中读取上面描述的ram地址的变量,决定进入烧录模式还是调到app入口地址处运行app程序。

    二、Hex/bin烧录文件解析

    1. Hex/bin文件如何生成

            如果是IAR,那么可以在output 处设置选择生成hex还是bin文件。如果是Keil,生成Hex文件用同样的设置方法,但是生成bin文件需要借助相应工具。

    2. Hex文件解析

          Intel HEX 文件是由一行行符合Intel HEX 文件格式的文本所 构 成的ASCII 文本文件。在Intel HEX 文件中,每一行包含一 个 HEX 记录 。 这 些 记录 由 对应 机器 语 言 码 和/ 或常量 数 据的十六 进 制 编码数 字 组 成。Intel HEX 文件通常用于 传输将 被存于ROM 或者EPROM 中的程序和 数 据。大多 数 EPROM 编 程器或模 拟器使用Intel HEX 文件。 这里说的Hex文件单指STM32的固件,以.hex为后缀,比如下面为部分Hex文件的内容:

                                                    图一

             整个文件以行为单位,每一行为一个记录。每行以冒号开头,内容全部为16进制码,2个 ASCII码字符表示1个Hex字节。

    1、每行以冒号开头,":" (0X3a),每一行结尾都是以回车换行结尾((0x0D,0x0A)
    2、第1字节0x02表示数据区的字节个数,用ASCII表示就是4个ASCII字符。
    3、第2、3字节0x0000 表示偏移地址或无用填0
    4、第4字节0x04表示本行记录的类型
    '00' Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录
    '01' End of File Record: 用来标识文件结束,放在文件的最后,标识HEX文件的结尾
    '02' Extended Segment Address Record: 用来标识扩展段地址的记录
    '03' Start Segment Address Record: 段地址 STM32不用
    '04' Extended Linear Address Record: 用来标识扩展线性地址
    '05' Start Linear Address Record: 程序启动运行的地址
    5、5-6字节表示数据区
    6、最后1个字节是校验字节。所有16进制码的累加和(不计进位),检验和 = 0x100 - 累加和
       如何用notepad++打开hex文件,如果每一个记录的最后一个字节即校验和不在notepad中显示为绿色,那么代表校验失败。

           下面是一个Hex文件的例子,注意如果hex文件比较小,可能没有第二个04类型的行用来标识第二个扩展线性地址(如下图中的0x0806高地址)。

                                                     图二

            另外,05类型的行虽然对烧录程序无用,但是它也表示了开始线性地址记录,意思应该就是第一个函数的入口地址,图一中05类型行的地址0x08000239即对应的HEX文件对应的map文件中如下入口地址,也就是系统复位后,此函数位于__main函数之后(__main函数初始化堆栈,把未初始化的全局变量或静态变量清零,调用main函数等)

    3.  bin文件解析

             BIN文件只有纯粹的数据(代码)信息,即图一Hex文件中黑色数据区(没有地址、校验等信息)。它并不包含地址信息,所以烧写BIN时就需要指定烧写地址。由于不带地址等信息,所以比上面描述的hex文件内存占用小一些。

            除开了上面描述的在线烧录bin文件外(bootloader中代码处理,一般上位机使用ymoden协议),还可以使用JLinkARM工具JFlash烧录bin文件到STM32。

            下图是bin文件用ultraedit打开,由于里面只包含程序数据,没有地址校验等信息,其内容对应图一中数据部分,可以与图一数据部分的头尾对比,会发现是一模一样的。

                                     图三

            另外需要注意的是,图三种最左列的地址偏移和冒号都是ultraedit加进去的,这个偏移地址与图一中的偏移地址也是一一对应的。   

            如果上位机需要解析bin文件,那么可以遵循这些特性,比如bin文件中除开最后一行外,其他行字节熟练一般都为16个字节,而且行与行之间地址偏移0x10,根据地址偏移(STM32的flash起始地址一般为0x08000000)可以找到具体地址对应的数据。

            比如两个bin文件,我们可以在相同特定地址处存放不同内容(比如icf文件指定某个地址段section,然后在代码中用@section的方式指定变量存放绝对地址),其他所有地址内容都相同,通过这样的方式,让上位机可以区分开这两个bin,从而实现不同的用途。

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32烧录指南:Hex/bin文件解析

    发表评论