在STM32CubeIDE中使用IAR编译器

在STM32CubeIDE中使用IAR编译器

一、前言

IAR编译器的大名早有耳闻,但本人一直未深度使用,主要有以下三点原因:

  1. 首先,它收费,因此笔者更倾向于使用免费的GCC工具链。
  2. 其次,作为嵌入式开发来说,IAR封装了太多底层细节,要深入了解编译过程和原理,GCC无疑是更好的选择。
  3. 最后,IAR糟糕的代码编辑体验配不上其编译器,就这一点来说,eclipse要比它好太多了。

​ 但不得不说得是,IAR常年屹立不倒,自有其原因:它的编译器非常优秀,编译出的代码密度高出GCC很多。基于以上原因,很多人使用source insight或者Vscode作为代码编辑器,然后使用IAR编译和调试。但调试过程中需要频繁的修改代码和编译调试,这种组合下的使用体验会非常不适。

​ 作者本人最近的项目恰好遇到了Flash空间不足,需要通过提高代码密度的手段来兼容更多的代码。编译优化选项众所周知,不能调太高,否则会产生各种玄学问题。于是,作者开始研究前人的经验。在STM32CubeIDE下使用IAR工具链进行编译和调试。

​ 最终,成功通过eclipse下的IAR插件实现了STM32CubeIDE + IAR编译器的开发,遂撰文以作记录。

二、准备工作

  1. STM32CubeIDE
  2. IAR For ARM
  3. 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,如何取舍,读者自行斟酌。本文走了更为繁琐的路线,供读者参考。

​ 后文的新建工程对于老手应该不是问题,可以选择性跳过到安装插件部分

扫描二维码关注公众号,回复: 15008233 查看本文章
  1. 新建工程

    在这里插入图片描述

  2. 选择处理器后输入工程参数

    在这里插入图片描述

    在这里插入图片描述

  3. 配置外设

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

  4. 配置时钟

    作者开发板晶振是8M,读者根据实际情况配置即可。

    在这里插入图片描述

  5. 配置生成设置

    本人习惯不同外设放置在独立源文件中,读者自行考虑

    在这里插入图片描述

  6. 生成代码

    在这里插入图片描述

  7. 加入延时点灯

    ​ 在main.c中加入延时和反转GPIO的函数,ALT+/代码会自动补全,笔者在步骤3中给PF9设置了别名LED,现在写代码就很方便。
    在这里插入图片描述

    在这里插入图片描述

  8. 编译运行

    此时还是GCC工具链下的编译,先编译运行一遍,确保工程没有问题,笔者这里小灯欢快的在闪烁了。最终编译出的文件占用大概6K的Flash空间。

    在这里插入图片描述

四、安装IAR的插件

  1. 进入Help->Install New Software

    在这里插入图片描述

  2. 输入以下IAR插件网址,添加软件源并安装

    http://eclipse-update.iar.com/plugin-manager/1.0

    在这里插入图片描述

  3. 进入Help,进入IAR工具链管理器

    进入过程可能会有点慢,甚至卡住,读者可以尝试更换网络或者开启手机热点进行尝试。

    在这里插入图片描述

  4. 安装IAR工具链

    笔者已经安装过,所以这里显示的是安装完成,其实可以看到,不止ARM,其他处理器的工具链也可以。如果没有出现选项,请手动添加IAR安装路径。笔者在RT-Thread Studio上尝试过安装,虽然有选择,但并未成功,报出依赖错误,估计跟IDE的Eclipse版本有关系。但STM32CubeIDE没有问题。安装会比较慢,跟网络有关系,耐心等待即可。

    在这里插入图片描述

五、修改工程文件

​ 熟悉底层编译原理的读者应该知道,更换编译器需要替换一些跟编译器相关的文件,咱们既然用IAR去编译,自然要将其原有GCC相关文件替换:

  1. CMSIS头文件,与编译器深度相关
  2. 汇编启动代码,也跟编译器深度相关
  3. 链接脚本,GCC中是.ld文件,IAR中是.icf

​ 因为咱们新建的工程是从库中直接复制,所以,工程中并没有咱们需要的文件,需要从CubeMx的HAL库中去寻找。也没有必要专门去下载个完整HAL库,咱们去安装目录找就行,器默认路径通常是:C:\Users\Username\STM32Cube\Repository。

笔者替换的步骤如下:

  1. 将工程目录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,该文件根据读者所使用的处理器选择。

  2. 将工程根目录下的链接脚本删掉:

    1. STM32F407ZGTX_FLASH.ld
    2. STM32F407ZGTX_RAM.ld

    替换为 C:\Users\Username\STM32Cube\Repository\STM32Cube_FW_F4_V1.27.0\Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\iar\linker目录下的:

    1. stm32f407xx_flash.icf
    2. stm32f407xx_sram.icf

    对于STM32处理器,该步骤其实可以省略,因为后文迁移工程时,工程向导会引导用户选择处理器,会使用默认的链接脚本。作者在此贴出这一步是为使用其他处理器,或者需要自定义链接脚本的读者提供参考。

  3. 删除适配GCC工具链的相关源文件

    IAR编译时不需要这两个文件,编译会报错。

    1. syscalls.c
    2. sysmem.c

六、IAR工程设置

  1. 先将工程从工程列表中删除,但不要删除磁盘源文件

    在这里插入图片描述

  2. 重新新建空工程

    进入File->New->C/C++ Project,选择C Managed Build后,将出现如下界面。输入工程名,路径不要使用默认路径,一定要选择之前工程的根目录,选择空工程,工具链选择IAR,该选项在不安装IAR插件时是没有的。

    在这里插入图片描述

  3. 选择处理器

    在该界面,插件会检索IAR的配置目录,让用户选择处理器,视电脑性能,会在该界面加载不等的时间。

    在这里插入图片描述

    加载出来后选择处理器,在此步骤中,实际上IAR为我们选择了默认的链接文件。

    在这里插入图片描述

  4. 添加头文件路径和预编译宏

    跟GCC工程一样,需要为工程添加头文件路径和预编译宏,该步骤的设置参照原工程即可。

    在这里插入图片描述

  5. 打开并行编译

    为了使得编译速度更快,可以打开IAR的并行编译,跟GCC的并行编译一个意思。

    在这里插入图片描述

  6. 打开生成Hex文件

    在这里插入图片描述

七、使用IAR编译与调试

  1. 编译

    和使用GCC时一样,点击编译即可,但此时的编译器,已经变为了IAR

    编译出的代码仅占用4.7K的Flash,对比GCC的6K,代码密度高要出不少,工程越大,优势越显著。笔者的对比,都是在不开编译器优化的情况下得出。

    在这里插入图片描述

  2. 调试设置

    调试主界面部分多了一个IAR的选项,我们选择IAR编译生成的.out文件

    在这里插入图片描述

  3. 选择调试器

    如果不选调试器,默认会是仿真。

    在这里插入图片描述

  4. 打断点调试

    经测试,可以正常编译,调试,附一个断点截图

    在这里插入图片描述

八、其他设置-更改链接文件

​ 在本文中,作者并未用到替换的.icf文件,那是因为IAR自动从安装配置中设置了,但实际项目中通常需要自己更改链接文件并使用。更改链接文件的设置参考下图:

在这里插入图片描述

九、总结

​ 本文作为抛砖引玉之用,供各位读者参考,本文介绍的IAR插件适用于众多被IAR支持的处理器。现今国产处理器爆发式更新的背景下,大部分处理器优先适配了IAR和MDK,并未对GCC提供支持。因此,如果有读者跟笔者一样,深感IAR编辑器不适,但又想使用其编译器,或是移植未适配GCC工具链的处理器工程,现在,又多了一种选择。作者在AT32F413上做了同样的移植,效果还不错,有空再撰文记录。

猜你喜欢

转载自blog.csdn.net/lone5moon/article/details/123540883