ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

IAR 9.30以上版本安装注册与STM32工程配置完整指南

IAR 9.30以上版本安装注册与STM32工程配置完整指南 做嵌入式开发这些年IAR这个工具链算是陪我最久的老伙计之一了。最近把手头一个项目从IAR 8.x迁到了9.30以上的新版本中间把安装、注册、新建工程和配置这条完整的链路又重新捋了一遍踩了不少坑也积累了不少心得。这篇文章就围绕IAR 9.30以上版本的安装、注册、新建工程和配置过程做个尽量完整的记录适合刚入行想用IAR做STM32或者其他ARM芯片开发的朋友也适合准备从旧版本迁移的老手做个参考。1. 为什么是IAR 9.30以上版本这次升级到底带来什么1.1 新版本的核心改动IAR Embedded Workbench for ARM也就是大家常说的EWARM从9.30开始最大的变化就是全面转向了基于VSCode内核的新一代IDE界面。老用户第一次打开会有一种既熟悉又陌生的感觉菜单结构变了工程文件格式也升级了老版本的.ewp工程文件虽然还能打开但建议在9.30以上版本里另存成新格式不然有些新特性用不上。编译器方面9.30以上的版本对Cortex-M系列的内核支持更全面像Cortex-M85这类新内核在旧版本里是选不到的。另外编译器的优化能力也有提升我用同一个STM32F103项目做过对比9.40的编译器在-O3优化下生成的代码体积比8.50省了大概5%到8%时序要求高的地方也能减少关键函数的指令条数。对于flash紧张的老项目来说光靠换一个新版工具链就能省出空间这是最直接的红利。新版本还加强了对CMSIS-Pack的支持很多芯片厂商提供的SVD文件和Flash算法可以直接通过Pack Manager加载不用再手动到处找。这个改动对项目里面芯片型号多、经常换芯片平台的朋友来说非常友好一套工具链可以同时管理多个厂商的芯片支持包。1.2 哪些项目和人值得升级我自己的判断标准是这样的:如果项目还在用ARM Cortex-M3/M4这个级别并且IAR 8.x用得顺手、没有新芯片需求其实不急着升。但如果涉及以下场景9.30以上版本基本是必选项要用Cortex-M33、M55、M85这类新内核需要利用新版本编译器优化来压减代码体积团队协作时别人已经开始用新版工程文件来回切换容易出兼容性问题或者你打算入手带新内核的板子用来学习那直接用新版最省事。当然升级也不是零成本License的激活方式、新界面配置项的迁移都需要重新熟悉。这篇后面讲到的安装和配置事项我是以9.40版本为基准来写的9.30到9.50之间的版本操作基本一致可以放心跟着走。2. 安装全程实操从下载到装完不踩坑2.1 安装前准备系统环境与安装包选择先说系统要求。9.30以上版本官方要求Windows 10 64位以上Windows 7已经不在官方支持列表里。不过实测在Windows 11专业版上跑得很稳内存建议至少8GB编译大工程的时候16GB会更舒服。这里有个容易忽略的点IAR的IDE是64位程序编译器和调试器的驱动部分仍然会有一些老的依赖所以系统尽量保持更新常年不装补丁的老机器偶尔会出现莫名其妙的驱动加载失败。安装包要去官网下载下载页面会根据你选择的架构给你生成一个独立的下载链接文件一般是几个GB级别的压缩包。下载前注意看清楚是ARM版本还是RISC-V版本这两个架构是独立安装包别下错了。下载完建议用certutil -hashfile或者HashCalc核对一下文件SHA256官网每个下载项旁边都会给出校验值这一步能避免下载过程中文件损坏导致的安装报错。如果你是公司内部使用建议直接走公司的License服务器管理联系IAR代理商或者原厂销售获取安装包和许可这样后续不用操心个人注册的问题。如果是个人学习使用可以先申请30天评估License后面第3章会说注册流程。2.2 一步步安装与常见安装失败处理安装过程本身不复杂但有几个细节能帮你省掉后续很多麻烦。第一安装路径不要带中文和空格我见过最典型的例子是把IAR装在C:\Program Files (x86)\IAR Systems\...这种带空格的路径下大部分时候没问题但一旦涉及自定义链接脚本里的路径引用空格就会引发各种妖孽问题。我自己现在固定装到D:\IAR\EWARM这种纯英文短路径下面清爽也省心。第二安装过程中会询问要安装哪些组件一般默认全选就行Debugger相关的驱动和Flash Loader这些建议都装上以免后面调试的时候缺组件。如果你只做编译不调试可以去掉不必要的调试支持组件缩短安装时间。第三安装到快结束时UAC弹窗授权驱动安装这时候不要直接关掉弹窗否则调试器驱动装不完整。我这里就发生过一次安装一切正常结果接上J-Link之后电脑认不出设备排查了半天才发现是当时图快把驱动装那个步骤跳过了。安装失败的常见原因主要是这几种杀毒软件实时防护拦截了驱动安装安装包解压不完整旧版本IAR残留注册表冲突。处理顺序建议是先退出杀毒软件以管理员身份重新运行安装程序再检查安装包SHA256最后用系统自带的程序卸载工具清理旧版本不要手动删注册表那很容易把系统弄坏。3. 注册与License配置让软件真正可用3.1 IAR的授权机制和常见授权类型IAR的License机制跟很多软件不太一样搞清楚它后面配置才不会一头雾水。当前主流的授权方式有三种个人节点锁License、网络浮动License和评估License。节点锁License是把License文件绑定到当前电脑的机器特征码上一台机器一个授权离线也能用。机器特征码一般取网卡MAC地址做一定变换所以这台电脑换网卡、改MAC或者重装系统都有可能导致原License失效需要找发行方重新申请这点要有心理准备。网络浮动License是安装在企业的License服务器上团队成员通过网络借用授权适合公司多人开发需要保证电脑跟License服务器网络连通。评估License是安装完成后自动生成的30天试用授权适合学习阶段使用。每个版本只能申请一次评估期过期之后续期比较麻烦所以建议准备正式用了再开始算时间不要装好了就顺手把评估激活了白白浪费。3.2 注册激活的完整操作流程拿到正式License之后注册激活是在IDE里面完成的具体步骤如下。打开IAR for ARM菜单栏选Help - License Manager打开License管理窗口。如果此时还是评估模式右侧会显示剩余天数和一个Register按钮。点击Register后系统会重新启动到License注册向导界面。在这里根据自己的授权类型选择如果你有License文件通常是.lic后缀选Import license file并浏览到该文件如果你的授权是License Number形式选Enter license number手动输入。输入完成后点击NextLicense Manager会尝试在线校验。如果当前电脑能上网校验通常几秒就完成界面上会显示注册成功和License有效期。如果校验失败或者电脑不能上网可以点在线的Offline activation选项生成一个请求文件然后把请求文件拿到能上网的机器上提交给官方激活页面换取响应文件再导回来。这个离线流程稍微显繁琐但胜在可靠。这里有个关键细节License Manager在上一步会显示当前机器特征码。这个特征码在你联系发行方申请License之前就要记下来发给对方因为同事之间互相拷贝License文件是无效的每台机器的特征码不一样。而且安装完成后如果首次注册前修改过网卡或主板特征码会变所以要养成注册前先看一眼特征码的习惯。注册完成后重启IAR在Help - About里确认授权状态显示为正式License即可。另外提醒一下千万不要在任何第三方网站下载所谓破解补丁或者注册机那些文件不仅违反知识产权规定而且很容易被植入后门嵌入式开发电脑上一般都连着调试器、代码库中招的代价远比买一套License大得多。还是老老实实用官方试用或正规采购图个放心。4. 新建工程全流程以STM32标准库项目为例4.1 创建工作区和项目IAR里工程文件组织方式跟Keil有一点区别它用Workspace工作区包住Project工程。一个Workspace可以放多个Project适合做bootloader和app两个工程同时管理的场景切来切去很方便。打开IAR后菜单File - New - Workspace先建一个空的Workspace然后Project - Create New Project。弹出窗口里选择工具链New版本默认就是ARM不需要额外选填好工程名和保存路径点击保存后Workspace窗口就会看到新工程。新建的工程会默认放一个main.c和一个stm32_flash.icf链接脚本文件。这里有个易错点虽然是芯片代码工程模板但是它会生成一个通用壳工程里面main.c几乎是空的而icf文件后面要根据实际芯片重新选千万别直接用默认的。很多人建完工程直接编译发现link时报错多半就是没管这个默认icf。4.2 芯片选型与源文件组织接下来第一步是告诉IAR你用的哪个芯片。右键工程名选择Options在General Options - Target标签页里点击芯片选择按钮弹出对话框里按厂商、内核、系列三层目录去找到对应型号。以最常见的STM32F103VET6为例路径大致是ST - STM32F1 Series - STM32F103 - STM32F103VE。选对型号之后IAR会自动带上该型号的默认链接配置文件同时Flash和RAM大小也会自动匹配。这里注意一点选到具体的子型号时后缀字母代表flash大小不同VE是512KB的而V8是64KB的如果选错了型号linker阶段不会报错但是生成的下载算法和flash地址会对不上下到板子上十有八九跑飞。源文件组织分两步。第一步在Workspace窗口右键工程选择Add - Add Group按User、StdPeriph_Driver、Startup这样的方式建几个组方便管理。第二步右键组名选择Add Existing Files把对应的.c文件加进去。对于STM32标准库项目StdPeriph_Driver组里是src目录下按外设拆分的源文件Startup组里是IAR专用的启动文件startup_stm32f10x_hd.s而User组放自己的main.c、stm32f10x_it.c这些。IAR里组只是逻辑上的组织方式不会影响实际编译顺序所以不用太较真顺序。4.3 关键配置项逐个说明工程建好、文件加完先不要急着点编译硬着头皮编译只会得到一堆头文件找不到的报错。这时候要把下面几个配置项逐一过一遍它们就是新建工程能否跑起来的关键。第一个是C/C Compiler - Preprocessor这里要添加两个东西预定义符号和头文件路径。预定义符号在Defined symbols里加。用标准库时一般要定义USE_STDPERIPH_DRIVER和STM32F10X_HD前者告诉标准库启用外设驱动后者告诉标准库当前的芯片是高密度版本不同容量对应的宏不一样用错了编译时stm32f10x.h里的配置会错乱。头文件路径在Additional include directories里加注意用$PROJ_DIR$这个环境变量来写相对路径比如$PROJ_DIR$\..\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x不要写死D:\work\...这种绝对路径否则工程拷给别人或者换个目录就全盘崩溃。第二个是General Options - Library Configuration。IAR默认的库配置是Normal对应的是DLib标准C库。使用STM32标准库时一般保持这个默认即可。如果你用printf输出调试信息而工程没有重定向fputc可以选Full或者以后通过--no_exceptions来精简库但新手不建议在这块折腾默认就好。第三个是General Options - Linker。正常情况下选对芯片型号后会用默认的.icf文件不用改。只有当你想把代码放到特殊位置比如bootloader后面的偏移地址才需要换成自定义icf文件。换的时候只要在Configuration file里选Override default然后指向你的icf路径即可。第四个是Debugger - Setup。这里选择调试器类型默认是Simulator也就是纯软件仿真。实际开发要用J-Link就选J-LINK/J-TRACE用ST-Link就选ST-LINK。这个选项直接影响后续下载和单步调试很多人建完工程能编译但下不进去就是这里忘了改。选定驱动之后还要去Debugger - Images确认下载算法新版本一般会自动带出来老版本需要在Flash Loader里手动添加。把这些配好基本就能编译了。上面讲的每一步都有明确目的不是机械操作。预定义符号是让芯片头文件和驱动代码知道该编译哪部分内容路径是让编译器能找到头文件调试器设置是让下载工具知道用哪个协议去擦写芯片里的flash。理解了这一串逻辑换任何品牌芯片都能举一反三。5. 编译烧录与调试配置实战5.1 编译前的最终检查清单我习惯在点下编译按钮之前按下面这个清单过一遍能筛掉大部分低级问题。工程路径和工程名没有中文、没有空格。芯片型号跟实际板子一致后缀字母没选错。预定义符号里容量宏跟芯片容量匹配。Include路径用的是$PROJ_DIR$相对路径目录名没写错。调试器类型不是Simulator而是实际的J-Link或ST-Link。首次新建工程时默认的main.c内容为空至少要写一个能编译通过的main函数。这六条看着简单每一条我都踩过。尤其是第一条的路径中文问题用Keil习惯了觉得中文路径没什么但IAR的编译器对路径里的中文字符支持得不好源文件能打开但编译时偶尔出现找不到文件的诡异错误。建议装IAR的机器上工作目录统一用英文命名。5.2 首次编译常见报错与处理第一次编译顺利通过的概率不高报错信息集中在下面几类。Fatal Error[Pe1696]: cannot open source file stm32f10x.h这表示头文件路径没有配好。检查C/C Compiler - Preprocessor里的Additional include directories确保路径指向的是实际存在的目录而且路径层级正确。有些用标准库的朋友习惯把所有头文件复制到工程目录下面然后路径简化为$PROJ_DIR$这种也能跑只是后续升级库的时候麻烦。Error[Li005]: no definition for SystemInit这是链接阶段的错误说明启动文件或者系统初始化函数没有参与编译。STM32的启动文件调用SystemInit函数这个函数在system_stm32f10x.c里实现工程里没有添加这个文件就会出现上面的错误。解决办法是把system_stm32f10x.c加进工程的StdPeriph_Driver或者单独的CMSIS组里。Error[Og005]: unknown symbol UART这类未定义符号报错一般是漏加了对应外设的源文件比如用到串口却没加stm32f10x_usart.c。逐个把用到的外设源文件补齐就解决了。如果编译报错信息夹杂着乱码或者提示编码不兼容那就是源码文件编码问题。IAR新版本对新工程默认UTF-8编码但是从老工程拷过来的文件往往是GB2312编码混合编译就会出现乱码报错。处理方式是让工程里的所有源文件统一编码最稳妥的做法是全部转成UTF-8 no BOM在编辑器右下角编码状态处切换保存即可。5.3 烧录与在线调试配置编译通过只是第一步能把程序烧进板子才算闭环。烧录之前先确认硬件接线SWD就接SWDIO、SWCLK、GND三根线如果目标板供电不稳再从调试器引出VCC给板子供电。IAR默认的烧录快捷键是CtrlD弹出调试会话后自动下载并运行到main函数停住。下载失败大多跟三件事有关。第一件是Debugger驱动没选对在Project - Options - Debugger - Setup里确认Driver类型。第二件是连接速度太高有些板子在SWD接口走线过长或者用了杜邦线的场景下默认速度会导致通信不稳把这个速度档位调低到1MHz甚至100kHz再试。第三件是芯片处于读保护状态老项目开了读保护之后用IAR下载会提示Could not connect这种要先解除读保护新版本在Flash Loader或者调试器的连接选项里能找到Unlock操作J-Link也可以用J-Flash先unlock。下载能进去但程序跑不起来优先检查复位引脚是否有外部干扰、启动模式boot0和boot1的跳线是否在正确位置然后看调试器里的PC指针是否停在0x08000000附近。如果PC停在了地址0xFFFFFFFE多半是芯片里没有有效代码或者向量表没被正确映射这时候重新检查一下链接配置里的FLASH起始地址是否真的指向0x08000000而不是被改成了别的。6. 常见问题与排查技巧实录6.1 高频问题速查表问题现象可能原因解决方法安装过程报错退出安装包损坏或杀毒拦截核对SHA256校验值退出杀毒软件重试License注册提示无效特征码不匹配或License权限类型不对对照License Manager中的机器特征码重新申请绑定本机的License找不到目标芯片型号安装时未勾选对应芯片支持包通过Pack Manager安装芯片支持包或重装时选全组件编译报Pe1696找不到头文件Include路径没配或路径写错在Preprocessor中补齐路径优先用$PROJ_DIR$相对路径链接报Li005 SystemInit未定义system_stm32f10x.c没添加进工程加入CMSIS目录下的system_stm32f10x.c并重新编译下载时Could not connect接线错误、速度过高或芯片读保护检查SWD接线降低调试速度解除读保护单步调试时变量看不到值优化等级偏高导致变量被优化把优化等级改为Low或None调试完成再调回程序能烧录但运行异常芯片型号选错Flash大小或icf配置错误核对子型号后缀和icf文件中的FLASH、RAM地址范围这张表是这几年我在群里帮人答疑时高频出现的问题汇总基本覆盖了新建工程到第一次点亮板子的全流程。建议下载到本地遇到问题先对号入座比到处搜帖子省时间。6.2 几个不容易被发现的坑除了上面这些明面上的问题还有几个坑是藏得比较深的稍微说一下。一个是工程目录和Workspace文件分离导致的问题。IAR的Workspace文件记录的是工程相对路径如果把Workspace文件和工程放在不同层级目录或者动了目录结构但不更新Workspace内容打开Workspace时会显示工程文件缺失。我自己的习惯是Workspace文件和工程放在同一级目录Workspace.eww和Project.ewp挨着放然后整个文件夹一起拷贝这样迁移工程最不容易出问题。另一个是老项目的结构体对齐问题。IAR编译器默认的结构体对齐方式与GCC不完全一致如果项目里用到了和其他平台交换数据包的结构体迁移到新版IAR时一定要检查结构体的对齐属性和#pragma pack否则通信协议很容易对不上字段。这类bug的排查成本极高因为编译器不报错只有运行的时候数据错乱。建议在工程里用static_assert锁定关键结构体的sizeof提前发现问题。第三个是调试断点时踩到的坑IAR 9.30以上的IDE调试器在源码级别断点和汇编级别断点之间有一个自动换算机制当你用优化等级-O3编译时源码行和汇编指令的对应关系会变得飘忽不定有时断点打上去但永远不会触发。遇到这个情况别怀疑自己逻辑有bug直接把工程的优化等级降下来等调试通了再改回去重新编译发布。我之前排查一个电机控制bug折腾了两天最后才发现是优化等级把中断里的变量处理顺序打乱导致的。写在最后的几点体会从8.x迁到9.30以上版本这段时间我个人的体会是新版IAR在界面美观度、对新芯片的支持和编译性能上的提升是实打实的但换工具链从来不是零成本的事许可证管理方式变了工程文件的默认行为变了连快捷键在某些菜单下都跟旧版不一样刚上手那几天确实有点别扭。给准备升级的朋友两个建议。一是不要在生产项目的紧张阶段做切换最好挑一个项目周期比较松的时候自己先搭一个测试工程把编译配置、下载调试、License激活这些环节都走通再考虑把老工程迁过来。二是博客里写的这些配置步骤与其死记硬背不如从原理上去理解IAR的工程配置结构Target选芯片、Preprocessor管符号和路径、Linker管地址布局、Debugger管下载方式这四个维度搞清楚了换任何芯片、任何开发板新建工程这件事对你来说就是几分钟的熟练活。最后再分享一个小技巧IAR 9.30以上版本支持直接导入老版本工程目录但导入之后我一般会新建一个空工程重新添加源文件而不是依赖它的自动迁移。自动迁移虽然省事但会把老工程里很多历史遗留配置一并带过来反而容易埋雷。手动重建一次工程顺便把用不到的文件和配置清理干净后续维护起来轻松得多。
返回列表