我们先来详细分析“方法一”的操作:

1.我们设置编译 程序的编译器(如图),这个设置意思是把程序下载到flash 的 0x0800 0000开头的位置,然后编译程序

2.编译完程序后,在工程目录的output文件夹中找到编译后生产的.hex文件;

用 notepad++  或者 UltraEdit 打开 程序 的.hex文件

hex文件格式:

(1)以行为单位,每行以冒号开头,内容全部为16进制码(以ASCII码形式显示)

(2)在HEX文件里面,每一行代表一个记录。记录的基本格式为:

冒号 本行数据长度 本行数据起始地址 数据类型 数据 校验码
  1 byte 2 bytes 1 byte n byte 1 byte
           
           

第一个字节 表示本行数据的长度;

第二、三字节表示本行数据的起始地址;

第四字节表示数据类型,数据类型有:0x00、0x01、0x02、0x03、0x04、0x05。

'00' Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录

'01' End of File Record:用来标识文件结束,放在文件的最后,标识HEX文件的结尾

'02' Extended Segment Address Record:用来标识扩展段地址的记录

'03' Start Segment Address Record:开始段地址记录

'04' Extended Linear Address Record:用来标识扩展线性地址的记录

'05' Start Linear Address Record:开始线性地址记录

然后是数据,最后一个字节 为校验和。

校验和的算法为:计算校验和前所有16进制码的累加和(不计进位),检验和 = 0x100 - 累加和

打开.hex内容如下:(中间部分数据略去)

[plain] view plaincopy
  1. <strong>:020000040800F2
  2. :10000000B80B00207D250008850300088703000841</strong>
  3. :100010009B0300089F030008A303000800000000E2
  4. :10002000000000000000000000000000A70300081E
  5. :10003000A903000800000000AB030008AD0300089E
  6. :102B40000400000000000000000000000000000081
  7. :102B50000000000000000000000000000000000075
  8. :102B6000010203040102030406070809020406081F
  9. :102B700000366E01000000000000000001020304A6
  10. :042B80000607080933
  11. <strong>:0400000508000121CD
  12. :00000001FF</strong>

先分析第一条语句---- “:02 0000  04 0800  F2”

冒号 本行数据长度 本行数据起始地址(偏移地址) 数据类型 数据 校验码
  1 byte 2 bytes 1 byte n byte 1 byte
[plain]view plaincopy
 
[plain]view plaincopy
     
02 0000 04 0800 F2

在上面的数据类型后2种记录(04,05)都是用来提供地址信息的。每次碰到这2个记录的时候,都可以根据记录计算出一个“基”地址。对于后面的数据记录,计算地址的时候,都是以这些“基”地址为基础的。以我们的语句为例:

第1条记录的长度为02,LOAD OFFSET为0000,RECTYPE为04,说明该记录为扩展段地址记录。数据为0800,校验和为F2。从这个记录的长度和数据,我们可以计算出一个基地址,这个地址为(0x0800 << 16) = 0x0800 0000 ,后面的数据记录都以这个地址为基地址。

第二条语句----“ :10000000B80B00207D250008850300088703000841”

冒号 本行数据长度 本行数据起始地址(偏移地址) 数据类型 数据 校验码
  1 byte 2 bytes 1 byte n byte 1 byte
[plain]view plaincopy
[plain]view plaincopy
       
: 10 0000 00 B80B00207D2500088503000887030008 41

第 2 条记录的长度为 10(0x10=16字节) , LOAD OFFSET 为 0000 , RECTYPE 为 00('00' Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录) ,数据为B80B00207D2500088503000887030008   校验码为41;此时基地址为:0x0800 0000  加上偏移地址:0x0000   这条记录的16个字节的数据的起始地址为:0x0800000 + 0x0000 =0x0800 0000

第3条语句----“:0400000508000121CD”

冒号 本行数据长度 本行数据起始地址(偏移地址) 数据类型 数据 校验码
  1 byte 2 bytes 1 byte n byte 1 byte
[plain]view plaincopy
[plain]view plaincopy
       
: 04 0000 05 08000121 CD

记录的长度为 04 , LOAD OFFSET 为 0000 , RECTYPE 为 05 ,此时,EIP寄存器里存放的地址:0x0800 0121; 即IP指向下一个要执行的指令所在地址,我们来看一下IAP工程list目录下的.map文件,其中第393行处如图:(看到没?0x0800 0121值main函数的入口地址)

EIP是32位机的指令寄存器, IP是指令寄存器,存放当前指令的下一条指令的地址。CPU该执行哪条指令就是通过IP来指示的

上图参考hex数据文档:http://pages.interlog.com/~speff/usefulinfo/Hexfrmt.pdf 或 http://microsym.com/editor/assets/intelhex.pdf

第4条语句---“:00000001FF”  (每一个.hex文件的最后一行都是固定为这个内容)

冒号 本行数据长度 本行数据起始地址(偏移地址) 数据类型 数据 校验码
  1 byte 2 bytes 1 byte n byte 1 byte
[plain]view plaincopy
         
: 00 0000 01   FF

(每一个.hex文件的最后一行都是固定为这个内容)
记录的长度为 00 , LOAD OFFSET 为 0000 , RECTYPE 为 01   ( 01' End of File Record:用来标识文件结束,放在文件的最后,标识HEX文件的结尾)

.hex 文件详解 stm32相关推荐

  1. hex文件详解及常用合并方法介绍

    前言 在很多复杂的系统中,或者多人参与设计的系统中,程序分区必不可免,拿最简单的IAP升级来说,包含两个程序区,BOOT区和APP区,BOOT区的主要职责是引导代码进去APP区执行目标功能,但是在下载 ...

  2. STM32(Cortex-M3)启动过程+IAR中xcl及icf文件详解

    一:STM32(Cortex-M3)启动过程(入口地址) ARM7和ARM9启动时从绝对地址0X00000000开始执行复位中断程序,即固定了复位后的起始地址,但中断向量表的位置是可变的. Corte ...

  3. STM32启动文件详解-比较清晰的一篇

    STM32启动文件详解 启动文件使用的 ARM 汇编指令汇总 启动程序源码注释(点此下载) 1. Stack-栈 Stack_Size EQU 0x00000400AREA STACK, NOINIT ...

  4. BIN,S19,M0T,SREC,HEX文件解析;FileParse(一)之文件详解

    简介 一.摘要 1.描述 2.关键字 二.为什么要文件解析 三.BIN文件格式 四.S19,M0T,SREC文件格式 五.HEX文件格式 六.源码下载 七.其他 八.参考 一.摘要 1.描述 本文主要 ...

  5. 【转载】CodeWarrior IDE使用tips之prm链接文件详解(自定义存储器分区以及自定义RAM数据初始化与在RAM中运行函数)...

    CodeWarrior IDE使用tips之prm链接文件详解(自定义存储器分区以及自定义RAM数据初始化与在RAM中运行函数) 2017-08-19 胡恩伟 汽车电子expert成长之路 内容提要 ...

  6. Illumina输出文件详解

    Illumina输出文件详解 Illumina测序原理(next-seq-550) 基本过程 基本概念 BCL文件(Base Call Files) BCI文件(Base Call Index Fil ...

  7. UCOSII 移植文件详解——笔记

    1.滴答定时器 SysTick 滴答定时器是一个24位的倒计数定时器,当计数到0时,将从RELOAD寄存器中自动重装载定时器初值,只要不关闭SysTick使能位,就将永久不息. SysTick的最大使 ...

  8. Linux中/proc目录下文件详解

    Linux中/proc目录下文件详解(一) 声明:可以自由转载本文,但请务必保留本文的完整性. 作者:张子坚 email:zhangzijian@163.com 说明:本文所涉及示例均在fedora ...

  9. Mybatis复习笔记3:映射文件详解

    映射文件详解 参数处理(#和$的区别) #{}:可以获取map中的值或者实体对象属性的值: ${}:可以获取map中的值或者实体对象属性的值: select * from person where i ...

最新文章

  1. 字符串基本操作 c语言,数据结构C语言字符串的基本操作.doc
  2. 【数学基础】一份非常适合人工智能学习的高等数学基础材料中文版 (国内教材精华)...
  3. 职场智慧之如何提升自己在公司的价值
  4. WORD样式保存为主题集?
  5. Hibernate获取'上一条'和'下一条'记录
  6. HDU 2389(HK 最大二分匹配)
  7. Android UI学习之---Button
  8. 信号的平移和尺度变换matlab,基于matlab的信号与系统实验指导
  9. uploadify文件上传插件使用教程
  10. Python利用GUI界面制作B站弹幕分析工具
  11. 物联网--解决ESP8266与电脑串口通讯
  12. 等保测评机构申请难吗?到哪里申请?
  13. Android Camera2对焦框和对焦
  14. linux洪水攻击路由器,(20)Linux下ICMP洪水攻击实例
  15. 万字详解 阿里面试真题:请你说说索引的原理
  16. 【Cython】Cython 基本用法
  17. 孩子学python用的笔记本电脑_教孩子学Python 后的一点感受
  18. 哎哟,不错哦之玩乐动物园
  19. Stanford University courses of computer science department(斯坦福计算机系课程设置)
  20. python dfs

热门文章

  1. 按文件名批量分类文件到文件夹
  2. Android 动态分区详解(六) 动态分区的底层机制
  3. 陈抟(tuán)《心相篇》
  4. uniApp实现热更新
  5. android如何释放图片缓存
  6. ffmpeg加水印、logo等
  7. 离散数学 传递闭包 Warshall算法
  8. 冲击图(alluvial diagram)及R实现
  9. 学习 Java8 函数式编程 (二)
  10. Redis应用场景-排行榜