keil 编译stm32,编译信息释义

本文介绍了代码和只读/可读写/初始化为0数据在内存中的分布,包括Flash(1006076字节)和RAM(225464字节)占用情况。编译过程产生了一个19秒的执行文件(Hex),虽有3个警告但无严重错误。

文章目录


在这里插入图片描述
上图中:

Code:表示代码大小,占用 279420 字节。
RO-Data:表示只读数据所占的空间大小,一般是指 const 修饰的数据大小。
RW-Data:表示有初值(且非 0)的可读写数据所占的空间大小,它同时占用 FLASH(存放其初始值)和 RAM 空间。
ZI-Data:表示初始化为 0 的可读写数据所占空间大小,它只占用 RAM 空间。
即:代码总大小(Program Size)为:FLASH 占用 1006076 字节(Code+ RO + RW),SRAM 占用 225464 字节(RW + ZI);成功创建了 Hex 文件(可执行文件,放在Output 目录下);编译 0 错误,3 警告;编译耗时 19 秒钟。

<think>我们正在使用Keil MDK-ARM(Keil 5)为STM32F103C8T6微控制器生成.bin文件。以下是步骤: 1. 打开项目,并确保项目配置正确(选择正确的目标设备STM32F103C8T6)。 2. 配置输出选项以生成.axf文件(这是链接器的输出,也是生成.bin文件的来源)。 3. 使用Keil内置的fromelf工具将.axf文件转换为.bin文件。 具体步骤: a. 在Keil中,打开项目,然后点击“Options for Target”按钮(或通过Project -> Options for Target)。 b. 在“Output”选项卡中,确保“Name of Executable”已经设置(通常为项目名),并勾选“Create HEX File”(虽然我们不需要HEX,但这一步确保输出.axf文件)。 c. 在“User”选项卡中,我们可以设置在构建完成后运行fromelf命令来生成.bin文件。 在“User”选项卡的“After Build/Rebuild”部分,勾选“Run #1”,然后输入以下命令(根据你的Keil安装路径调整): fromelf --bin --output=@L.bin !L 解释: --bin : 生成bin文件 --output=@L.bin : 输出文件名为项目名(@L)加上.bin后缀 !L : 输入文件是当前目标的.axf文件(即链接器输出文件) 注意:fromelf工具位于Keil安装目录的ARM\ARMCC\bin文件夹中,但通常Keil会自动将其加入环境变量,因此可以直接使用。 另一种写法(更明确): fromelf --bin -o "output.bin" "你的项目名.axf" 但是为了通用性,我们可以使用Keil的变量,例如: fromelf --bin --output=.\Objects\@L.bin .\Objects\@L.axf 这里假设输出目录为Objects文件夹,并且.axf文件也在该目录。 更常见的做法是直接使用相对路径,并且使用Keil的预定义变量: $K\ARM\ARMCC\bin\fromelf.exe --bin --output=@L.bin !L 其中$K代表Keil的安装根目录。 但是,在Keil MDK中,通常可以直接使用fromelf而不需要完整路径(因为构建环境已经设置好路径)。所以我们可以简化为: fromelf --bin --output=@L.bin !L 如果构建成功,你将在项目目录下(或指定的输出目录)找到生成的.bin文件。 另外,确保在“Output”选项卡中,输出文件夹(Select Folder for Objects)设置正确,这样.axf文件才会生成在指定位置,fromelf才能找到它。 步骤总结: 1. 打开项目选项(Options for Target)。 2. 在“Output”选项卡,设置输出文件夹(例如.\Objects),并记住这个路径(用于在User命令中指定.axf文件的位置,但使用变量!L则不需要,因为!L就是输出目录下的.axf文件)。 3. 在“User”选项卡,勾选“Run #1”,然后输入命令:fromelf --bin --output=@L.bin !L 4. 重新构建项目,构建完成后,在项目目录(或输出目录)下会生成一个.bin文件。 注意:@L表示不带扩展名的目标名称(即项目名称),!L表示带路径和扩展名的.axf文件(在输出目录中)。 如果遇到问题,可以检查构建输出窗口,看fromelf命令是否执行,是否有错误信息。 另外,也可以使用绝对路径来避免路径问题,但使用Keil变量更灵活。 参考Keil的文档:fromelf工具的使用说明可以在Keil的帮助文档中找到(ARM Development Tools)。 示例: 假设项目名为“stm32_demo”,那么构建成功后,在项目目录下会生成stm32_demo.bin(因为--output=@L.bin,所以文件名为stm32_demo.bin)。 如果希望bin文件输出到特定目录(比如项目下的bin文件夹),可以修改命令: fromelf --bin --output=.\bin\@L.bin !L 注意:需要确保bin文件夹存在,否则会生成失败。 因此,我们可以手动创建bin文件夹,或者在构建前使用命令创建(在Run #1之前可以添加创建目录的命令,但Run #1只能执行一条命令,所以可以写一个批处理文件,或者使用md命令)。 例如,我们可以这样写(在Run #1): md .\bin 2>nul fromelf --bin --output=.\bin\@L.bin !L 但是,Keil的User命令只支持单行,所以我们可以用&&连接: md .\bin 2>nul && fromelf --bin --output=.\bin\@L.bin !L 注意:md .\bin 2>nul 表示创建bin目录,如果目录已经存在,则忽略错误信息(2>nul)。 另一种方法是使用两个Run命令(Keil支持Run #1和Run #2),但通常我们使用一个命令组合。 因此,最终在“User”选项卡的“After Build/Rebuild”部分的“Run #1”框中输入: md .\bin 2>nul && fromelf --bin --output=.\bin\@L.bin !L 这样,bin文件就会生成在项目目录下的bin文件夹中。 注意:如果不想创建bin文件夹,也可以直接输出到Objects目录(即默认输出目录)或者项目根目录(使用.\@L.bin)。 现在,按照上述步骤操作,即可在Keil5中为STM32F103C8T6项目生成bin文件。 参考:[Keil MDK-ARM fromelf tool](http://www.keil.com/support/man/docs/armutil/armutil_dom1361289857290.htm) [^1] 注意:如果使用AC6编译器(ARM Compiler 6),fromelf工具同样适用,命令相同。 如果遇到fromelf找不到的问题,请检查Keil安装目录下是否有fromelf.exe(通常在ARM\ARMCC\bin或ARM\ARMCLANG\bin下),并确保该路径已添加到系统环境变量PATH中,或者在命令中使用完整路径。 例如,如果Keil安装在C:\Keil_v5,则命令为: C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe --bin --output=.\bin\@L.bin !L 但通常Keil在构建时会设置好环境,所以直接使用fromelf即可。 最后,重新编译项目,构建成功后,检查bin文件夹(或指定输出目录)中是否有.bin文件。 如果构建输出窗口显示fromelf命令执行成功,但没有生成bin文件,请检查输出路径是否正确,以及是否有写权限。 如果构建失败,提示fromelf不是内部或外部命令,那么请使用完整路径。 对于Keil MDK默认安装,ARMCC编译器(AC5)的fromelf位于:C:\Keil_v5\ARM\ARMCC\bin 对于ARMCLANG编译器(AC6),fromelf位于:C:\Keil_v5\ARM\ARMCLANG\bin 因此,根据你选择的编译器,可能需要调整路径。 在Keil中,可以在“Target Options”的“Target”选项卡中查看使用的编译器(Use: ARM Compiler 5 还是 ARM Compiler 6)。 为了通用性,我们可以使用Keil的变量$K,它代表Keil的安装根目录。例如: $K\ARM\ARMCC\bin\fromelf.exe --bin --output=.\bin\@L.bin !L (对于AC5) 或者 $K\ARM\ARMCLANG\bin\fromelf.exe --bin --output=.\bin\@L.bin !L (对于AC6) 但是,Keil的User命令中,$K变量可能不被直接识别(在Run命令中,Keil提供了一些预定义变量,如@L, !L等,但没有$K)。因此,我们可以使用相对路径或绝对路径。 实际上,Keil在运行User命令时,会设置环境变量,包括ARMCC的路径,所以直接使用fromelf应该可以。如果不行,建议使用绝对路径。 另一种方法是使用Keil的预定义环境变量:KEIL_V5_ROOT(如果安装时设置了),但Keil的User命令并不直接支持这个变量。 因此,最可靠的方法是:如果使用默认安装,可以直接写绝对路径(如果知道Keil安装位置),或者使用相对路径(如果fromelf在系统PATH中)。 如果用户不确定,可以先在命令行中测试fromelf命令是否可用。如果不可用,则使用完整路径。 在Keil中,我们可以通过一个折中的办法:使用Keil的安装路径变量。在User命令中,我们可以这样写: "%ARMCCBIN%\fromelf" --bin --output=.\bin\@L.bin !L 其中,%ARMCCBIN%是Keil设置的环境变量,指向ARMCC编译器的bin目录(对于AC5)。对于AC6,环境变量名为%ARMCLANGBIN%。 但是,在Keil的User命令中,环境变量需要用$符号括起来,即:$ARMCCBIN$。所以: "$ARMCCBIN$\fromelf" --bin --output=.\bin\@L.bin !L (AC5) "$ARMCLANGBIN$\fromelf" --bin --output=.\bin\@L.bin !L (AC6) 注意:在Keil的User命令中,环境变量的引用方式是:$变量名$(包括美元符号)。 因此,我们可以根据编译器选择不同的命令,但这样需要用户根据自己使用的编译器修改命令。我们可以写一个通用的方法:使用Keil的另一个变量,即编译器可执行文件所在的目录,这个变量是!S(工具集目录)。但是,fromelf并不在编译器目录,而是在Keil的ARM目录下。 所以,最方便的方法还是使用绝对路径,或者确保fromelf在PATH中。 考虑到兼容性,我们推荐使用相对路径或直接使用fromelf(如果用户已经配置了PATH)。如果用户遇到问题,再使用绝对路径。 总结:大多数情况下,直接使用“fromelf”命令即可。 如果用户在使用AC6时遇到问题,请检查fromelf的路径。在Keil5安装AC6后,fromelf.exe位于ARMCLANG的bin目录下。因此,如果用户使用的是AC6,而Keil的User命令中fromelf不可用,则需要使用完整路径(或将该路径加入系统PATH)。 最后,建议用户先尝试简单的命令:fromelf --bin --output=@L.bin !L 如果失败,再根据编译器类型使用完整路径。 注意:在Keil中,构建过程中输出的信息可以在Build Output窗口中查看,如果fromelf执行失败,会有错误提示。 生成bin文件后,就可以通过烧录工具(如ST-Link Utility、OpenOCD等)将bin文件烧录到STM32F103C8T6中。 希望这些步骤能帮助你成功生成bin文件。</think>### 如何在 Keil 5 中为 STM32F103C8T6 生成 BIN 文件 以下是详细的操作步骤: #### 方法一:通过用户自定义命令(推荐) 1. **打开项目选项** 在 Keil 中右键点击项目 → 选择 "Options for Target"。 2. **配置用户命令** - 转到 "User" 选项卡 - 在 "After Build/Rebuild" 区域勾选 "Run #1" - 输入以下命令: ```bash fromelf --bin --output=@L.bin !L ``` - `--bin`:指定输出 BIN 格式 - `--output=@L.bin`:生成与项目同名的 BIN 文件 - `!L`:输入链接器输出的 AXF 文件 *(命令解释参考 Keil 官方文档)*[^1] 3. **验证输出路径** - 转到 "Output" 选项卡 - 确认 "Select Folder for Objects..." 路径(默认在项目目录的 `Objects` 文件夹) - 编译后 BIN 文件将生成在此路径下 #### 方法二:通过批处理文件 1. **创建批处理文件** 在项目根目录创建 `gen_bin.bat`,内容如下: ```bat @echo off set FROMELF="C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe" %FROMELF% --bin --output=Objects\output.bin Objects\项目名.axf ``` 2. **在 Keil 中调用** 在 "User" 选项卡的 "Run #1" 输入: ```bash gen_bin.bat ``` #### 关键注意事项 1. **编译器路径** - ARMCC (AC5) 编译器:`C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe` - ARMCLANG (AC6) 编译器:`C:\Keil_v5\ARM\ARMCLANG\bin\fromelf.exe` *(根据实际安装路径调整)* 2. **文件关联验证** 编译成功后,在 Build Output 窗口会显示: ```log After Build - User command #1: fromelf --bin --output=test.bin Objects\test.axf ``` 3. **烧录准备** 生成的 BIN 文件可直接用 ST-Link Utility 或 OpenOCD 烧录到 STM32F103C8T6 的 `0x08000000` 起始地址。 #### 常见问题解决 - **错误:'fromelf' 不是命令** 使用完整路径:`"C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe" --bin ...` - **找不到 AXF 文件** 确认 "Output" 选项卡中的输出路径和文件名 - **文件权限问题** 以管理员身份运行 Keil > 提示:Keil 默认不显示 BIN 文件,需在 Project 窗口点击 "Refresh" 按钮刷新目录[^1]。 --- ### 相关问题 1. 如何在 Keil 中配置 STM32F103C8T6 的启动文件? 2. STM32 的 BIN 文件和 HEX 文件有什么区别? 3. 如何通过 ST-Link 命令行工具烧录生成的 BIN 文件? [^1]: Keil MDK-ARM 用户手册 (uVision IDE 配置章节)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智驾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值