简介:面向嵌入式开发初学者以及参加 NXP ARM MCU 设计竞赛的读者,这份 IAR Embedded Workbench for ARM 快速入门 PPT 以 LPC2148 例程为线索,系统梳理新建工程、选择 ARM 工具链与空工程模板、准备并添加源文件、配置通用选项与编译器优化级别、设定头文件包含路径、选择 Flash 烧写文件格式、指定链接命令文件、选择调试器驱动和程序下载模式、设置 RDI 调试代理,直至编译链接、下载到目标板与在线调试的完整操作链路。内容按创建工程、添加代码、配置工程选项、代码编译和链接、代码下载和调试五部分组织,对每一步的菜单入口、配置参数与调试准备给出提示。压缩包内共 1 个 PPT 文件,大小约 806KB,页面集中,便于按步骤查阅关键配置。已有 510 人学习,适合需要快速熟悉 IAR 工程建立、ARM 调试环境与下载流程的读者作为实操参考,也可结合 H-JTAG、并口 JTAG 等调试设备理解常见问题的排查思路。
1. 先看一个案例:编译零错误,下载却卡住
上个月帮某实验室把一台还在跑 LPC2148 的老机器重新盘活,打开 IAR Embedded Workbench for ARM v4.41A,工程编译零错误,一点下载就卡在连接阶段,折腾到半夜才发现是工程里那份 Linker Command File 还指向 RAM 版本。照着 IAR 使用手册 走流程的人特别容易栽在这类地方——手册把十一个选项页列得很清楚,却没告诉你哪几项必须成对改。这套环境在实验课、板卡验证和旧项目维护里出现频率极高,装不顺的后果也很直接:编译能过、下载失败、单步乱跳,最后开始怀疑板子坏了。下面按我实际装机的顺序重排一遍,从版本选择、安装目录、工程建立到选项配置和下载调试,一步步落到能复现的程度。
2. 装 IAR Embedded Workbench for ARM v4.41A:安装包、调试服务和并口驱动一起备齐
这套环境不是一个安装包双击到底就完事。最少四样东西要凑齐:IAR 本体、能连上板子的调试服务程序 H-JTAG、一根并口转 JTAG 的转接头、以及目标板本身。少一样,后面配置页填得再漂亮也下不进程序。我一般先把四样东西全部放到同一个目录下再动手,避免装到一半去找驱动。
2.1 先对一遍环境清单与版本选择
版本这关必须先过。这份手册对应的是 v4.41A,拿 v5 以后的界面去套,会发现 Debugger 里根本没有 RDI 这个选项——新版本早就换成别的调试驱动体系了,选项名、位置、工程文件格式全变。用老版本工程文件在新版本里打开,软件会提示转换,转完 Linker 配置项散落到别处,反而更乱。
| 组件 | 版本/型号 | 作用 | 备注 |
|---|---|---|---|
| IAR Embedded Workbench for ARM | v4.41A 完整版 | 编译、链接、调试一体 | 需正常安装,含 examples |
| IAR Embedded Workbench for ARM KickStart | v4.41A | 同上,代码体积受限 | 小例程够用,工程一大就撞限制 |
| H-JTAG | 与转接头配套的版本 | 提供 RDI 服务,桥接 IAR 和硬件 | 装完要能识别到目标芯片 ID |
| SuperJTAG 并口-JTAG 转接头 | 并口接口 | 把 PC 并口转成 JTAG 时序 | 其他 Wiggler 兼容设备也可 |
| LPC2148 目标板 | — | 运行和调试对象 | 备一根串口线看输出 |
KickStart 是免费的那一版,做 Uart 这类小例程完全够,但代码量上去以后链接阶段会直接报体积超限。如果是给别人搭环境、后面还要往里加功能,建议一开始就装完整版,省得中途换工具重配一遍选项。
2.2 安装 IAR 并核对 arm\examples 目录
安装路径有个坑值得单独说:v4.41A 装完,目录名是Embedded Workbench 4.0,不是 4.41。这是内部版本号的习惯,很多脚本和批处理里写死 4.41 就会找不到路径。我一般把它装到非系统盘、路径不带中文和空格的位置,老工具对空格和中文路径的容忍度比想象中低,尤其是 Linker Command File 的路径。
装完先别急着建工程,按下面三条核对一遍目录。第三条最关键,后面要复制的两份.xcl就在那里。
# 安装完成后核对三处,盘符和路径按自己的实际情况替换 ls "/c/Program Files/IAR Systems/Embedded Workbench 4.0/arm/bin/iccarm.exe" # ARM C/C++ 编译器 ls "/c/Program Files/IAR Systems/Embedded Workbench 4.0/arm/bin/ilinkarm.exe" # 链接器 ls "/c/Program Files/IAR Systems/Embedded Workbench 4.0/arm/examples" # 官方例程根目录第一条确认编译器在位,第二条确认链接器在位,第三条确认安装时勾选了例程组件。如果examples下面空空如也,说明安装时选了自定义组件、把示例去掉了,重新跑一遍安装程序补上就行,不用卸载重装。进到examples之后再往下一层,找到 LPC214x 对应的例程目录,路径中间那一层是芯片厂商的缩写,不同安装包可能略有差异,进去看一眼目录名就知道了。找到Uart/Configuration这一级,里面躺着的就是LPC2148_flash.xcl和LPC2148_RAM.xcl。
2.3 装 H-JTAG 与并口驱动
H-JTAG 装完第一件事是单独打开它,让它自己去识别目标芯片。能读出芯片 ID,说明并口、转接头、目标板这条链路是通的;读不出来,后面在 IAR 里怎么点都是白费。并口地址一般是 0x378,主板 BIOS 里并口模式建议设成 ECP 或 EPP,设成单向模式有时能识别但下载会中途断。
注意:USB 转并口线在这类老调试器上基本不可用,时序对不上。要么用主板原生并口,要么换 USB 接口的 JTAG 调试器并改用对应的驱动。
H-JTAG 装完会留下一个H-JTAG.dll,记住它的完整路径,第 4 章配置 RDI 服务时要一字不差地填进去。另外这类老程序在较新的系统上建议用管理员身份运行一次,否则读写并口端口可能被拦。
3. 创建工程与添加代码:Empty project、.xcl 与 .s79 一个都不能少
工程这一层最容易出的问题不是操作不会,而是“少东西”。少一份.xcl,链接器不知道代码该放哪;漏了.s79汇编启动文件,程序跑起来第一件事就是飞。这一章按顺序把该进目录的东西列清楚,再谈怎么加进工程。
3.1 新建工程:Tool chain 选 ARM,模板选 Empty project
从开始菜单进 IAR Embedded Workbench,菜单路径是 IAR 那一栏下面两级。进去之后Project > Create New Project…,弹出的小窗口里两个下拉框必须选对:Tool chain 选 ARM,Project templates 选 Empty project。
选 Empty project 是有讲究的。模板列表里还有带 main 的、带 C++ 的、以及各种芯片厂商预置的模板,那些模板会自带一批文件和默认选项,和你的启动文件、链接文件撞在一起时,报错信息会非常难读。空工程什么都不带,所有文件由你亲手加,出了问题也只可能是你加的那几个文件的问题,排查范围小得多。
选完模板会直接弹保存对话框,这时候把工程存成LPC2148_Demo.ewp,放在你准备好的工程目录里。.ewp是工程文件,记录文件列表和所有选项配置,后面的十一个选项页全都存在这个文件里。
3.2 三个文件必须先进目录:源文件与两份 .xcl
工程文件落盘之后,先把目录整理干净。我习惯建一个独立目录,比如D:\work\LPC2148_Demo,把三类文件一次性放进去,再回 IAR 里添加。顺序很重要:先放文件,后添加,反过来容易加进一堆临时路径的引用。
第一类是业务代码,C/C++ 源文件和头文件。第二类是 ARM 汇编源文件,扩展名是.s79,这是老版本 IAR 对 ARM7 指令集汇编文件的后缀约定,写成.s反而不认。第三类就是前面提到的那两份链接命令文件,控制代码和数据在 LPC2148 内部存储器里怎么分配:片上 Flash 从 0x00000000 起,片上 RAM 从 0x40000000 起,两份.xcl分别对应这两套地址布局。
# 工程目录准备:源文件、汇编文件、两份链接命令文件一次到位 mkdir -p /d/work/LPC2148_Demo cp /path/to/src/*.c /d/work/LPC2148_Demo/ # C 源码 cp /path/to/src/*.h /d/work/LPC2148_Demo/ # 头文件 cp /path/to/src/*.s79 /d/work/LPC2148_Demo/ # ARM 汇编,注意后缀不是 .s # 两份链接命令文件从安装目录的 LPC214x 例程里复制过来 SRC="/c/Program Files/IAR Systems/Embedded Workbench 4.0/arm/examples" cp "$SRC"/<厂商目录>/LPC214x/IAR-LPC-214X/Uart/Configuration/LPC2148_flash.xcl /d/work/LPC2148_Demo/ cp "$SRC"/<厂商目录>/LPC214x/IAR-LPC-214X/Uart/Configuration/LPC2148_RAM.xcl /d/work/LPC2148_Demo/ ls -l /d/work/LPC2148_Demo/*.xcl # 确认两个文件都在且非空前三条是搬源码,中间两条是搬链接命令文件,最后一条是自检。<厂商目录>换成你在examples下实际看到的目录名。这个文件名千万别改,第 4 章选 Linker Command File 时下拉框里显示的就是这两个名字,改了之后配置对不上,链接器会报找不到文件。两份都要复制,只复制 Flash 那份的话,想切到 RAM 调试时又得回来找。
3.3 Add Files 与 Workspace 保存:.ewp 和 .eww 不是一回事
文件进目录之后回到 IAR,Project > Add Files…打开文件选择框。这里有个小坑:默认的文件类型过滤器只显示.c,汇编文件根本看不见。要么把过滤器切到 All files,要么直接在文件名输入框里敲*.s79回车。想一次加完,就在文件名框里输入*.c;*.h;*.s79再回车,多选确认。
加完在左侧 Workspace 窗口里检查一遍文件树,重点看两件事:汇编启动文件在不在,头文件有没有被当成源文件重复加进去。头文件加进去不会编译报错,但会让文件树很乱,后面找文件费劲。
最后是保存 Workspace,File > Save Workspace,存成LPC2148_Demo.eww。.ewp和.eww是两层东西:.ewp管单个工程的选项和文件列表,.eww管工作区,记录当前打开了哪些工程、哪个是活动工程。只存.ewp不存.eww,下次双击.ewp打开,IAR 会当成新工作区处理,偶尔会出现选项没生效的错觉。两个都存,文件名前缀保持一致。
4. 工程选项配置:LPC2148 十一个标签页的填法与取舍
这一章是整套环境的核心。所有配置都在Project > Options…里,入口有两个:菜单栏的 Project 菜单,或直接在 Workspace 窗口里右键工程名选 Options。两种方式打开的是同一个对话框,后者更顺手。
十一个步骤看着多,其实可以归成三组:编译相关(通用选项、优化级别、头文件路径)、链接相关(输出文件参数、烧写格式、Linker Command File)、调试相关(驱动、下载模式、RDI 服务路径)。三组之间是联动的,改一组往往要跟着改另一组。
4.1 通用选项与编译器优化级别
General Options 里最先确认的是目标器件。选到 LPC214x 系列对应的条目,字节序保持小端。这一步改错,后面所有地址计算都是错的,报错还特别隐晦。
优化级别在C/C++ Compiler > Optimizations里。档位从 None 到 High,还有单独的 Size。取舍很直接:调试阶段用 None 或 Low,发布阶段再上 High 或 Size。High 会把变量塞进寄存器、把相邻语句合并,表现出来就是单步时行号乱跳、想看的局部变量显示成不可用,很多人以为是调试器坏了,其实是优化把代码改得面目全非了。
我一般把工程分成两套配置,调试用 Low、发布用 High,切换靠 Options 里那一个下拉框,五分钟的事,比在 High 下硬着头皮猜变量值强得多。
4.2 头文件包含路径与 C-SPY 额外输出
如果源码里 include 了别的目录下的头文件,必须在C/C++ Compiler > Preprocessor的 Additional include directories 里把路径加上,一行一个。路径建议用工程相对路径的写法,别写死成D:\work\...,换台机器就废。
Linker 的 Output 页有个Allow C-SPY-specific extra output file开关,勾上之后会额外产出一份给调试器用的输出文件。只要打算在 IAR 里下载和调试,这个开关就勾上;只用外部工具烧写、完全不在 IAR 里调试的场景可以不勾,输出目录会干净一些。
4.3 输出格式与 Linker Command File:RAM 与 Flash 两套组合
这两页必须成对配置,是全篇最容易翻车的地方。单独改一页,另一页还是旧值,结果就是能编译、能链接、下不进板子。三种常见组合我整理成一张表:
| 调试方式 | Linker Output 格式 | Linker Command File | Use flash loader(s) | 产物后缀 |
|---|---|---|---|---|
| 下载到 RAM 调试 | 可跳过,不生成额外格式 | LPC2148_RAM.xcl | 不勾 | .d79等调试文件 |
| 下载到 Flash 调试 | simple-code | LPC2148_flash.xcl | 勾选 | .d79等调试文件 |
| 生成 Hex 交外部工具烧写 | intel-extended | LPC2148_flash.xcl | 不勾 | 手动把后缀改成.hex |
表格第二行是日常最常用的组合。第三行是给外部烧写工具准备文件用的,intel-extended出来的是 Intel HEX 格式,但 IAR 默认给的后缀不是.hex,得自己改,不改的话很多烧写工具认不出来。第一行是 RAM 调试,好处是不动片上 Flash、反复下载快,坏处是掉电就没了、程序大小受 RAM 限制。
Linker Command File 在Linker > Config页里指定,点后面的浏览按钮选工程目录下的.xcl。这里不要图省事直接引用安装目录里的原件,一定复制到工程目录再用,否则换台机器或者重装 IAR,路径一断,链接器直接罢工。
4.4 调试器驱动、下载模式与 RDI 服务路径
Debugger > Setup 页的 Driver 下拉框里选 RDI。选完之后驱动名后面会出现一个可点的按钮,点开填 H-JTAG 那个 dll 的完整路径,要填到文件名,只填目录是不认的。
Download 页的Use flash loader(s)就是表格里那一列,Flash 调试勾上,RAM 调试去掉。这一项和 4.3 的输出格式、.xcl三者的取值必须一致,我把它们当成一个三元组来记:RAM 三件套是「RAM 的 xcl + 不勾 loader + 不需要格式」,Flash 三件套是「flash 的 xcl + 勾 loader + simple-code」。
填完点 OK,回到主界面,File > Save Workspace再存一次。选项是存在.ewp里的,不保存就等于没配。
4.5 Rebuild all 与下载调试的动作顺序
配置齐了,Project > Rebuild all全量重编。不要用增量编译的 Build,第一次配环境用全量重编,能把所有文件的告警都刷出来。Build 窗口最后一行是错误和告警统计,0 error 才往下走。
下载调试的标准动作顺序是:先单独打开 H-JTAG,确认它已经识别到目标芯片;再回 IAR,点Download and Debug。反过来先点 IAR 再开 H-JTAG,十次有八次连不上,因为 RDI 服务端还没起来。调试结束用Debug > Stop Debugging退出,别直接叉掉窗口,有时候会把调试连接占住,下一次连不上。
5. 排查:这套 IAR 加 H-JTAG 组合最容易翻车的五处
下面这五条是我在这套环境上真实踩过的,按出现频率从高到低排。每条都按现象、原因、解决三段写,遇到问题时可以直接对着症状找。
5.1 报 RDI 连接失败,但 H-JTAG 显示已连上
现象:单独打开 H-JTAG 能读出芯片 ID,一切正常;回 IAR 点下载,弹窗提示 RDI 连接失败或者根本没有任何反应。
原因:RDI 服务路径没填对,或者 H-JTAG 不是以管理员身份运行的。前者最常见,很多人只填了 dll 所在目录,没填到文件名;后者在较新的系统上会被端口访问权限拦住,H-JTAG 界面看着正常,实际拿不到并口。
解决:先打开 Options 的 Debugger 页,把 RDI 那一栏的路径补全到...\H-JTAG.dll。再确认 H-JTAG 是管理员权限启动的。还不行就把 IAR 也以管理员权限启动一次,两边权限对齐之后再试。最后再检查并口地址是不是 0x378、BIOS 里并口模式有没有被改回单向模式。
5.2 RAM 版本跑得好好的,切到 Flash 就飞
现象:RAM 调试一切正常,程序能跑、断点能停。想烧到 Flash 长期运行,改完配置重新下载,程序一上电就是无反应,或者跑几条指令就死。
原因:三元组只改了一半。典型情况是.xcl换成了 flash 版,但Use flash loader(s)忘了勾;或者 loader 勾了,Linker Command File 还指着 RAM 那份。这样链接器按 RAM 地址布局生成代码,烧写器却往 Flash 里写,启动时取指地址对不上。
解决:打开 Options,一次性核对三处——Linker 的 Config 页是不是LPC2148_flash.xcl、Output 格式是不是simple-code、Debugger 的 Download 页是不是勾了Use flash loader(s)。三处对齐之后 Rebuild all,不要用增量编译,然后再下载。
5.3 生成的 hex 用外部烧写工具写不进去
现象:按手册把输出格式改成 intel-extended,输出目录里生成了文件,拖进外部烧写工具提示格式不识别或文件为空。
原因:后缀没改。intel-extended 生成的还是 IAR 自己的默认后缀,不是.hex,不少烧写工具是看后缀判断格式的。
解决:把输出文件后缀手动改成.hex再喂给烧写工具;或者干脆走 IAR 自己的下载通道,用 simple-code 加 flash loader 直接烧,省掉一次格式转换。要长期用外部工具烧,就在 Linker 的 Output 页把额外输出开关打开,让每次编译自动多产一份,避免每次手动改名。
5.4 单步调试时行号乱跳、变量显示不可用
现象:断点能停,但单步执行时光标在几行之间来回跳,想看某个局部变量,结果显示成不可用或者一直是旧值。
原因:优化级别开得太高。High 档下变量进寄存器、相邻语句被合并重排,调试信息和源码行号对不上,这是编译器的正常行为,不是调试器出问题。
解决:调试阶段把优化级别降到 None 或 Low,重新 Rebuild all 再下载。如果代码量敏感必须开 High,就把要观察的变量加 volatile 修饰,或者改用观察内存地址和寄存器的办法,别死盯着变量窗口。
5.5 换台机器打开工程,Include 路径和 xcl 全变红
现象:工程在原来那台机器上好好的,拷到另一台打开,头文件标红、链接器报找不到.xcl,编译直接失败。
原因:路径写成绝对路径了,或者.xcl直接引用的是安装目录下的原件而不是工程目录里的副本。
解决:头文件路径改成相对工程目录的写法,.xcl一律复制到工程目录再引用。养成习惯:工程目录里应包含.ewp、.eww、源码、两份.xcl,这个目录整个拷走就能在别的机器上直接打开。配置好之后我会顺手把这几样打个包留档,重装系统时直接解压,比重新点十一个选项页快得多。
6. 验证:三步自检确认工程真的在 LPC2148 上跑起来
配完不等于通。我的做法是不看界面判断,只看三样东西:输出文件、串口输出、调试器的运行状态。三样都对上,这套环境才算真正装好。
第一步查输出文件。Rebuild all 之后去工程目录下的 Debug 或 Release 子目录,看产物是不是预期的后缀和体积。RAM 版本应该只有调试文件,Flash 版本除了调试文件还应该有能烧进片上的那份。用一条命令就能看清:
# 编译产物自检:后缀、体积、时间戳三项一起看 ls -lh /d/work/LPC2148_Demo/Debug/*.d79 /d/work/LPC2148_Demo/Debug/*.hex 2>/dev/null # .d79 是 IAR 调试用的输出;.hex 只在 Linker 里选 intel-extended 并改过后缀后出现后缀对不上说明 4.3 那一页没配对;文件大小为 0 说明链接阶段其实失败了,只是 Build 窗口滚上去了没看见。
第二步查运行证据。LPC2148 的例程序列里串口打印是最直观的,把串口线接上,按例程的波特率打开串口工具,复位板子,应该能看到固定格式的输出。看不到输出先别改代码,回头确认.xcl选的哪一份、loader 勾没勾——地址布局不对时程序可能根本没有正常启动。
第三步查调试器状态。点Download and Debug进入调试界面后,先看程序指针停在什么位置。正常情况下应该停在启动文件或 main 附近,停在一片空白区域基本可以断定是链接布局错了。再全速跑一次、手动暂停,看指针是不是落在主循环里;能停下来、能看寄存器、能单步,这条链路就是通的。
| 验证项 | 通过标准 | 不通过先查哪 |
|---|---|---|
| 编译产物 | 后缀正确、体积非零、时间戳是刚生成的 | Linker Output 格式与.xcl是否成对 |
| 串口输出 | 复位后能打出预期内容 | loader 勾选状态、地址布局 |
| 调试连接 | 能进调试、能暂停、能单步 | RDI 的 dll 路径、H-JTAG 是否已识别芯片 |
三步都过再动代码。越过验证直接改业务逻辑,出问题时根本分不清是环境没装好还是代码写错了,这是最耗时间的排查方式。
从那以后我每次新建 IAR 工程,都会先把.xcl和输出格式这两项成对确认一遍,再点下载;配完先跑一遍上面这三步自检,才允许自己开始改业务代码。这套流程多花十分钟,能省掉一整个晚上的怀疑人生。希望帮到你。
本文还有配套的精品资源,点击获取