在STM32开发中,经常会碰到hex文件、bin文件与axf文件,这些都是可以烧写到板子里运行的文件。这三个文件有什么区别呢?在这之前,先来一起回顾一下C语言编译的过程:
编译的原理
在之前的C语言笔记《C程序的编译过程》中,有简单的分析了C程序编译的几个过程:
![878f34088bfd46ac9e671049f3a48aa2noop.image_ 878f34088bfd46ac9e671049f3a48aa2noop.image_](https://www.taobobolive.com/wp-content/uploads/2022/08/lazy-480x300-1.png)
STM32也是用C语言来开发,也会经过类似的编译过程,只不过我们常常用MDK或者其它IDE来编译,其编译过程如下:
![6ce7681b04da4feaa2e086abb1e60927noop.image_ 6ce7681b04da4feaa2e086abb1e60927noop.image_](https://www.taobobolive.com/wp-content/uploads/2022/08/lazy-480x300-1.png)
例如,我们的LED程序编译过程如下:
![56c3e8a4577e44f19382d799863a13dbnoop.image_ 56c3e8a4577e44f19382d799863a13dbnoop.image_](https://www.taobobolive.com/wp-content/uploads/2022/08/lazy-480x300-1.png)
在IDE中进行编译时,我们只需点击编译按钮即可完成这些过程,编译过程用到的工具(.exe文件)在IDE的安装目录下的某个文件夹下,比如我们这里用的MDK的编译工具路径:
![b3d5c82c420f4e0a93b07f0e14e8c8a1noop.image_ b3d5c82c420f4e0a93b07f0e14e8c8a1noop.image_](https://www.taobobolive.com/wp-content/uploads/2022/08/lazy-480x300-1.png)
一般这些IDE或者工具集的一些编译工具都放在bin文件夹。再比如我们MinGW工具集(里面包含gcc/g++编译器,可以编译在电脑上运行的程序)的编译工具所在路径为:
![9e7bb3d614fe4630bab14a63a128b4cdnoop.image_ 9e7bb3d614fe4630bab14a63a128b4cdnoop.image_](https://www.taobobolive.com/wp-content/uploads/2022/08/lazy-480x300-1.png)
回归正题,我们的MDK编译时就是使用安装路径下的这些编译工具来完成我们的编译过程。究其本质,我们在cmd命令窗口也是可以通过命令来编译我们的STM32程序的(前提是配好环境变量,否则得到编译工具所在的路径下进行编译),但是我们不会这样干(有这功夫就可以去学学Linux),因为IDE已经给我们提供了很大的便利。比如:
![1c1aa393f0964c3db7a907ab1ebfe154noop.image_ 1c1aa393f0964c3db7a907ab1ebfe154noop.image_](https://www.taobobolive.com/wp-content/uploads/2022/08/lazy-480x300-1.png)
下面看一下我们在cmd窗口下运行armcc命令看会发生什么:
![79f222ba06254c5dac79372e747252d7noop.image_ 79f222ba06254c5dac79372e747252d7noop.image_](https://www.taobobolive.com/wp-content/uploads/2022/08/lazy-480x300-1.png)
我们看到了很多关于armcc命令的提示说明,有些常用的编译选项已经集成在MDK里供我们选择,比如:
![7f76e8dc07c04465b88bd71e882a9d68noop.image_ 7f76e8dc07c04465b88bd71e882a9d68noop.image_](https://www.taobobolive.com/wp-content/uploads/2022/08/lazy-480x300-1.png)
可烧录的文件
axf文件、hex文件与bin文件都是可以运行在我们的stm32上的,它们都存储了编译器根据源代码生成的机器码,根据应用场合的不同,它们又有所区别。
axf文件:包含调试信息。
hex文件:包含地址信息。
bin文件:最直接的代码映像。
axf文件是编译默认生成的文件,不仅包含代码数据,而且还包含着调试信息,在MDK里进行debug调试用的就是这个文件。hex文件在MDK里要勾选如下选项才可以生成:
![27c71f26a90144c1990be98514e7cce4noop.image_ 27c71f26a90144c1990be98514e7cce4noop.image_](https://www.taobobolive.com/wp-content/uploads/2022/08/lazy-480x300-1.png)
hex 文件是一种使用十六进制符号表示的代码记录, 记录了代码应该存储到FLASH 的哪个地址,下载器可以根据这些信息辅助下载。
bin文件是根据axf文件生成的,需要在MDK下添加类似如下格式命令来生成对应的bin文件:
![d8ee65ef5c984e748da1c5153090ed8bnoop.image_ d8ee65ef5c984e748da1c5153090ed8bnoop.image_](https://www.taobobolive.com/wp-content/uploads/2022/08/lazy-480x300-1.png)
bin文件就是最小的可以运行的文件了,其包含最直接的代码映像。这三个文件中axf文件最大,hex文件次之,bin文件最小,如:
![df798cc186eb489daf7c3fe68762882bnoop.image_ df798cc186eb489daf7c3fe68762882bnoop.image_](https://www.taobobolive.com/wp-content/uploads/2022/08/lazy-480x300-1.png)
关于它们的区别这里只是简单的阐述说明,有时间、有精力、有兴趣的朋友可以去分析它们里面的内容。
离线文件的烧录方法
hex文件的烧录,我们可以使用FlyMcu工具通过串口来下载:
![bb2f7ce0cff0497c964ffd9d01321e70noop.image_ bb2f7ce0cff0497c964ffd9d01321e70noop.image_](https://www.taobobolive.com/wp-content/uploads/2022/08/lazy-480x300-1.png)
FlyMcu不可以烧bin文件,因为上面说过了bin文件只包含最直接的代码映像,不包含地址信息,会出现如下错误:
![3b4b467f289a4bb1b1455add9dd9a787noop.image_ 3b4b467f289a4bb1b1455add9dd9a787noop.image_](https://www.taobobolive.com/wp-content/uploads/2022/08/lazy-480x300-1.png)
bin文件可以使用STM32CubeProgrammer软件通过STLINK进行下载:
![ebc9585ec76941869f7f53ad9564397fnoop.image_ ebc9585ec76941869f7f53ad9564397fnoop.image_](https://www.taobobolive.com/wp-content/uploads/2022/08/lazy-480x300-1.png)
本文内容来自网友供稿,文章观点仅代表作者本人,本站非盈利且无偿提供信息存储空间服务,不拥有所有权,如有文章有不实信息或侵犯了您的权益,请发送邮件至 cfseo1997@163.com 反馈核实,如需转载请注明出处:https://www.taobobolive.com/86380.html