在STM32CubeIDE中使用IAR编译器
一、前言
IAR编译器的大名早有耳闻,但本人一直未深度使用,主要有以下三点原因:
- 首先,它收费,因此笔者更倾向于使用免费的GCC工具链。
- 其次,作为嵌入式开发来说,IAR封装了太多底层细节,要深入了解编译过程和原理,GCC无疑是更好的选择。
- 最后,IAR糟糕的代码编辑体验配不上其编译器,就这一点来说,eclipse要比它好太多了。
但不得不说得是,IAR常年屹立不倒,自有其原因:它的编译器非常优秀,编译出的代码密度高出GCC很多。基于以上原因,很多人使用source insight或者Vscode作为代码编辑器,然后使用IAR编译和调试。但调试过程中需要频繁的修改代码和编译调试,这种组合下的使用体验会非常不适。
作者本人最近的项目恰好遇到了Flash空间不足,需要通过提高代码密度的手段来兼容更多的代码。编译优化选项众所周知,不能调太高,否则会产生各种玄学问题。于是,作者开始研究前人的经验。在STM32CubeIDE下使用IAR工具链进行编译和调试。
最终,成功通过eclipse下的IAR插件实现了STM32CubeIDE + IAR编译器的开发,遂撰文以作记录。
二、准备工作
- STM32CubeIDE
- IAR For ARM
- STM32目标板
STM32CubeIDE安装
截至本文撰写时,STM32CubeIDE最新版本为1.9,读者可登录ST官网进行下载。
安装过程请自行搜索其他博主的文章,并无难度。
IAR For ARM安装
IAR是收费软件,截至本文撰写时,其最新版本为9.2,安装过程读者可自行搜索。
STM32目标板
本教程适用于所有STM32处理器甚至大部分基于eclipse的IDE开发ARM内核MCU的情况。因此,在本文中,使用一块STM32F407的开发板,通过IDE内置的CubeMX生成LED程序以作演示。
三、通过CubeMx新建工程
既然要演示咱们先把工程给建了,其实不管使用CubeMx创建的HAL库工程,亦或是标准库的工程都无所谓,后面通过几步简单的文件替换即可正常使用IAR编译。
需要说明的是,本文的使用的是CubeIDE内置的CubeMX,只能生成GCC工具链的工程,因此后文会有替换文件的操作。若是使用独立的CubeMx直接生成IAR工程,则无需替换文件这一步骤即可使用IAR工具链,但同样需要新建空白的CubeIDE工程,再将IAR工程移植到CubeIDE,如何取舍,读者自行斟酌。本文走了更为繁琐的路线,供读者参考。
后文的新建工程对于老手应该不是问题,可以选择性跳过到安装插件部分
-
新建工程
-
选择处理器后输入工程参数
-
配置外设
-
配置时钟
作者开发板晶振是8M,读者根据实际情况配置即可。
-
配置生成设置
本人习惯不同外设放置在独立源文件中,读者自行考虑
-
生成代码
-
加入延时点灯
在main.c中加入延时和反转GPIO的函数,ALT+/代码会自动补全,笔者在步骤3中给PF9设置了别名LED,现在写代码就很方便。
-
编译运行
此时还是GCC工具链下的编译,先编译运行一遍,确保工程没有问题,笔者这里小灯欢快的在闪烁了。最终编译出的文件占用大概6K的Flash空间。
四、安装IAR的插件
-
进入Help->Install New Software
-
输入以下IAR插件网址,添加软件源并安装
http://eclipse-update.iar.com/plugin-manager/1.0
-
进入Help,进入IAR工具链管理器
进入过程可能会有点慢,甚至卡住,读者可以尝试更换网络或者开启手机热点进行尝试。
-
安装IAR工具链
笔者已经安装过,所以这里显示的是安装完成,其实可以看到,不止ARM,其他处理器的工具链也可以。如果没有出现选项,请手动添加IAR安装路径。笔者在RT-Thread Studio上尝试过安装,虽然有选择,但并未成功,报出依赖错误,估计跟IDE的Eclipse版本有关系。但STM32CubeIDE没有问题。安装会比较慢,跟网络有关系,耐心等待即可。
五、修改工程文件
熟悉底层编译原理的读者应该知道,更换编译器需要替换一些跟编译器相关的文件,咱们既然用IAR去编译,自然要将其原有GCC相关文件替换:
- CMSIS头文件,与编译器深度相关
- 汇编启动代码,也跟编译器深度相关
- 链接脚本,GCC中是.ld文件,IAR中是.icf
因为咱们新建的工程是从库中直接复制,所以,工程中并没有咱们需要的文件,需要从CubeMx的HAL库中去寻找。也没有必要专门去下载个完整HAL库,咱们去安装目录找就行,器默认路径通常是:C:\Users\Username\STM32Cube\Repository。
笔者替换的步骤如下:
-
将工程目录Core\Startup中的startup_stm32f407xx.s启动文件删掉,替换为 C:\Users\Username\STM32Cube\Repository\STM32Cube_FW_F4_V1.27.0\Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\iar目录中的startup_stm32f407xx.s,该文件根据读者所使用的处理器选择。
-
将工程根目录下的链接脚本删掉:
- STM32F407ZGTX_FLASH.ld
- STM32F407ZGTX_RAM.ld
替换为 C:\Users\Username\STM32Cube\Repository\STM32Cube_FW_F4_V1.27.0\Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\iar\linker目录下的:
- stm32f407xx_flash.icf
- stm32f407xx_sram.icf
对于STM32处理器,该步骤其实可以省略,因为后文迁移工程时,工程向导会引导用户选择处理器,会使用默认的链接脚本。作者在此贴出这一步是为使用其他处理器,或者需要自定义链接脚本的读者提供参考。
-
删除适配GCC工具链的相关源文件
IAR编译时不需要这两个文件,编译会报错。
- syscalls.c
- sysmem.c
六、IAR工程设置
-
先将工程从工程列表中删除,但不要删除磁盘源文件
-
重新新建空工程
进入File->New->C/C++ Project,选择C Managed Build后,将出现如下界面。输入工程名,路径不要使用默认路径,一定要选择之前工程的根目录,选择空工程,工具链选择IAR,该选项在不安装IAR插件时是没有的。
-
选择处理器
在该界面,插件会检索IAR的配置目录,让用户选择处理器,视电脑性能,会在该界面加载不等的时间。
加载出来后选择处理器,在此步骤中,实际上IAR为我们选择了默认的链接文件。
-
添加头文件路径和预编译宏
跟GCC工程一样,需要为工程添加头文件路径和预编译宏,该步骤的设置参照原工程即可。
-
打开并行编译
为了使得编译速度更快,可以打开IAR的并行编译,跟GCC的并行编译一个意思。
-
打开生成Hex文件
七、使用IAR编译与调试
-
编译
和使用GCC时一样,点击编译即可,但此时的编译器,已经变为了IAR
编译出的代码仅占用4.7K的Flash,对比GCC的6K,代码密度高要出不少,工程越大,优势越显著。笔者的对比,都是在不开编译器优化的情况下得出。
-
调试设置
调试主界面部分多了一个IAR的选项,我们选择IAR编译生成的.out文件
-
选择调试器
如果不选调试器,默认会是仿真。
-
打断点调试
经测试,可以正常编译,调试,附一个断点截图
八、其他设置-更改链接文件
在本文中,作者并未用到替换的.icf文件,那是因为IAR自动从安装配置中设置了,但实际项目中通常需要自己更改链接文件并使用。更改链接文件的设置参考下图:
九、总结
本文作为抛砖引玉之用,供各位读者参考,本文介绍的IAR插件适用于众多被IAR支持的处理器。现今国产处理器爆发式更新的背景下,大部分处理器优先适配了IAR和MDK,并未对GCC提供支持。因此,如果有读者跟笔者一样,深感IAR编辑器不适,但又想使用其编译器,或是移植未适配GCC工具链的处理器工程,现在,又多了一种选择。作者在AT32F413上做了同样的移植,效果还不错,有空再撰文记录。