
简介这份 IAR 使用手册以 PPT 形式梳理 IAR Embedded Workbench for ARM 的快速入门路径面向刚接触 ARM 嵌入式开发、需要熟悉 IAR 工程配置与在线调试流程的工程师、课程学习者及竞赛参赛者。内容按创建工程、添加代码、配置工程选项、编译链接、下载调试的顺序展开结合 LPC2148 示例说明工具链与工程模板选择、优化级别、头文件包含路径、输出文件参数、Flash 烧写格式、Linker Command File、调试器驱动、程序下载模式及 RDI 调试代理等关键设置并提示该流程可推广至其他 NXP ARM MCU。压缩包共 1 个文件为单个 PPT大小约 806KB便于随查随用。手册示例涉及 H-JTAG 调试代理与 Wiggler 兼容调试设备对早期 LPC2148 实验环境尤具参考价值。已有 510 人学习可作为课程实验、NXP ARM MCU 开发入门或设计竞赛前期环境搭建的参考帮助读者建立从新建工程到下载调试的完整流程认知。1. 版本卡在 v4.41A这套 ARM7 工具链为什么还值得单独装一遍上周有同学抱着一块 LPC2148 开发板来找我说工程双击打开是空白的新装的 IDE 直接提示工程格式不认识。我翻出他电脑里那份 IAR 使用手册一看是 2007 年那套 IAR Embedded Workbench for ARM v4.41A 的快速入门文档——.ewp工程文件、.xcl链接命令文件、RDI 调试代理全是那一代工具链的写法跟现在 9.x 的.ewp/.icf根本不是一回事。这类环境在实验室、竞赛板和存量项目里非常常见麻烦在于它几乎不报「安装失败」编译器装上了工程建了选项也配了最后卡在下载这一步或者下载进去了程序不跑你还看不出是哪一层出的问题。这篇按「装什么版本、目录怎么摆、选项怎么配、坏了怎么救」的顺序走一遍目标只有一个——让 v4.41A 在你机器上从头到尾跑通一次。2. 装前把环境列清v4.41A、KickStart 与 H-JTAG 三件套装这种老工具链最容易犯的错是「先装了再说」。它依赖的东西比新版多一层编译器之外还有调试代理和并口驱动这三样任何一样缺失现象都不在编译阶段暴露而是在最后点 Debug 的时候。所以我在动手前会先把版本、路径、调试链路三件事确认完再点下一步。2.1 版本与授权Full 和 KickStart 32K 选哪个手册里点名的软件只有两个IAR Embedded Workbench for ARM v4.41A或它的 KickStart 版本 v4.41A。两个版本号一致差别在授权KickStart 是免费版带 32KB 代码尺寸上限Full 版没有。判断的依据很简单——LPC2148 的 Uart 例程本身只有几 KBKickStart 完全跑得动但你把工程当模板往上加自己的业务代码一旦超了 32KB链接阶段会直接报代码尺寸超限而不是给出一个含糊的错误。所以我的做法是先按手册用 KickStart 把流程跑通确认整条链路没问题再决定要不要换 Full。装之前还有两个细节值得先定下来。第一是安装路径我一般不用默认的C:\Program Files\...而是装到C:\IAR\ewarm44。原因是 4.41A 这套工具的链接命令文件会被命令行工具以完整路径引用路径里带空格在老版本上偶尔会解析出问题短路径能省掉一类玄学。第二是机器上可能同时存在多个版本装完必须确认快捷方式指向的到底是哪一个。:: 装完先确认「三件套」都在位缺一个后面都会卡住 dir /b C:\IAR\ewarm44\arm\bin\iccarm.exe dir /b C:\IAR\ewarm44\arm\bin\ilinkarm.exe dir /b C:\IAR\ewarm44\arm\bin\cspybat.exe :: 打印版本号确认是 4.41A而不是 4.42 或 5.x C:\IAR\ewarm44\arm\bin\iccarm.exe --version三条dir分别对应编译器、链接器和 C-SPY 的批处理调试器前两个负责编译链接第三个负责命令行下载调试后面验证环节要用它。--version的输出里应该带 V4.41A 字样如果打出来是 5.x 或者 8.x说明 PATH 或者开始菜单快捷方式指到了别的安装目录这时候别急着建工程先把快捷方式的目标路径改对否则你配的是 4.41A 的选项跑的是另一套编译器。2.2 目录结构与例程位置xcl 从哪来v4.41A 装完之后有三块目录必须心里有数。arm\bin是编译链接工具arm\config放器件描述文件决定 General Options 里能选到哪些芯片arm\examples\NXP\LPC214x是这一代最值钱的资产——手册里提到的LPC2148_flash.xcl和LPC2148_RAM.xcl就躺在里面还有配套的启动文件和 Uart 例程。这两个 xcl 文件是整个工程能不能跑起来的关键它们的作用是告诉链接器ROM 从哪个地址开始、多大RAM 从哪个地址开始、多大。LPC2148 的 Flash 起始在 0x00000000片内 RAM 起始在 0x40000000选错文件的表现不是报错而是程序下载后停在原地。:: 列出 LPC214x 例程目录下所有链接命令文件 dir /s /b C:\IAR\ewarm44\arm\examples\NXP\LPC214x\*.xcl :: 只看 xcl 里以 -D 开头的宏定义行确认 ROM/RAM 起止地址 findstr /b -D C:\IAR\ewarm44\arm\examples\NXP\LPC214x\IAR-LPC-214X\Uart\Configuration\LPC2148_flash.xcl第一条命令正常应该返回两条记录分别落在Uart\Configuration下面一条 flash 一条 RAM。第二条命令会打出一串-D开头的行那是给链接器预定义的地址宏后面紧跟着的-Z(CODE)、-Z(DATA)才是真正把代码段和数据段分配到具体地址区间的语句。这里有个版本差异必须说明4.x 用.xcl5.x 之后换成了.icf网上搜到的绝大多数 IAR 配置教程是.icf写法直接套到 4.41A 上会对不上别在这上面浪费时间。2.3 H-JTAG 与并口驱动调试链路的前置条件手册里指定的调试代理是 H-JTAG调试设备是 SuperJTAG 并口-JTAG 转接头或者其它 Wiggler 兼容设备。这条链路是这样的IAR 通过 RDI 驱动接口去调 H-JTAGH-JTAG 再通过并口把时序打到 JTAG 上。三层里任何一层没通现象都是「Debug 按钮点下去卡住」或者「连不上目标」而编译器那边一切正常很容易误判成工程配错了。我的习惯是先把 H-JTAG 单独跑通再进 IAR。打开 H-JTAG在设置里选 LPT 端口端口地址填 0x378然后点检测目标能读到 ARM7TDMI 的内核 ID 才算通。如果读不到先查 BIOS 里并口模式是不是 ECP 或 EPP这个不设对表现是时好时坏属于典型的血泪经验。:: 确认系统里能识别到并口设备XP/Win7 上有效 wmic path Win32_ParallelPort get Name,DeviceID,Status返回结果里应当有 LPT1 且状态正常。返回空的话要么主板没并口要么 BIOS 里被关了要么用的是 USB 转并口线——后者在这类调试器上兼容性很差能换就换。这一步过了再回去装 IAR顺序上不会乱。3. 从空工程到能编译创建、加文件、配选项的完整链路工程创建本身只有三步但这三步里的每一个选择都会在后面某个环节找回来。手册给的顺序是创建工程、加代码、配选项、编译链接、下载调试我按这个顺序走但会把每个选项为什么这么配讲清楚因为真正让人卡住的从来不是「点哪个按钮」而是「这个值改了会怎样」。3.1 创建工程与保存目录先定工程别搬着走启动方式是开始菜单进 IAR Embedded Workbench然后 Project 菜单里选 Create New Project。弹出的对话框里两个下拉框Tool chain 选 ARMProject templates 选 Empty project。工具链选错的话编译器会按 8051 或者别的内核去编译报一堆莫名其妙的寄存器未定义。保存这一步有个容易忽略的点.ewp是单个工程文件.eww是工作区文件一个工作区可以挂多个工程。手册里保存的是LPC2148_Demo.ewp最后再 File Save Workspace 存成LPC2148_Demo.eww。我一般先在磁盘上把目录建好例如D:\work\LPC2148_Demo把工程存进去源码、头文件、xcl 也全部放在这个目录或者它的子目录下。原因很实在工程文件里记录的头文件路径、链接文件路径一旦用了绝对路径换台机器或者换个盘符就全断用相对路径$PROJ_DIR$才能跟着工程一起搬。文件作用建议位置LPC2148_Demo.ewp单个工程的选项集合工程根目录LPC2148_Demo.eww工作区记录打开了哪些工程工程根目录LPC2148_flash.xclFlash 调试用的链接命令文件工程根目录LPC2148_RAM.xclRAM 调试用的链接命令文件工程根目录3.2 添加源码四类文件一次到位手册里要求准备的文件有四类自己写的 C/C 源文件、C/C 头文件、ARM 汇编源文件后缀是.s79加上从例程目录拷过来的两个 xcl。注意这里还隐含一类——启动文件。LPC2148 的例程目录里有startup.s79一类的汇编文件它负责定义中断向量表和复位入口不加进去编译能过链接也能过但下载后程序不会跳到你的main。这是新手最常见的翻车点之一。添加方式是 Project Add Files。这里有个坑必须提前说文件类型过滤器默认只显示*.c; *.cpp汇编文件根本不在列表里你会以为例程里没有汇编文件。把过滤器改成 All files或者直接在文件名框里敲*.*回车.s79才会出现。:: 加文件之前先把要用的文件一次拷齐到工程目录 copy C:\IAR\ewarm44\arm\examples\NXP\LPC214x\IAR-LPC-214X\Uart\Configuration\LPC2148_flash.xcl . copy C:\IAR\ewarm44\arm\examples\NXP\LPC214x\IAR-LPC-214X\Uart\Configuration\LPC2148_RAM.xcl . :: 确认汇编启动文件的实际文件名不同例程可能叫法不同 dir /b C:\IAR\ewarm44\arm\examples\NXP\LPC214x\IAR-LPC-214X\Uart\*.s79拷贝命令末尾的.表示拷到当前目录也就是你执行命令时所在的工程目录。第二步的dir是为了确认启动文件的真实名字别凭记忆写文件名——这一类老例程里不同外设的例程目录结构并不完全一致用dir看一眼比猜快得多。3.3 通用选项与优化级别Debug 下为什么用 Low配置入口是 Workspace 窗口里右键工程名选 Options。第一项 General Options里面最重要的是 Target 页的器件选择选到 LPC2148 之后工具链会带进来一批器件相关的默认宏定义中断向量和寄存器地址才认得对。第二重要的是 C/C Compiler 里的优化级别。这一项在调试阶段坑最多优化级别代码尺寸单步调试体验适用场景None最大语句逐行对应变量都能看定位逻辑错误Low略小基本能逐行个别变量被合并日常 Debug 首选Medium中等部分语句被重排功能验证High小断点乱跳变量常提示已优化掉发布Size最小同上Flash 紧张时我一般 Debug 配置下固定用 LowNone 编出来的代码太大KickStart 的 32KB 很容易撑爆High 又会把变量优化没你在 Watch 窗口里看到的全是「变量已被优化」调个中断都调不动。3.4 头文件路径与输出格式simple-code 还是 intel-extended如果代码里 include 了其它目录下的头文件必须显式给出包含路径位置在 C/C Compiler Preprocessor Additional include directories一行一个目录。这里强烈建议用$PROJ_DIR$开头的相对写法例如$PROJ_DIR$\inc它展开成工程文件所在目录工程搬到哪都不断。:: 在工程根目录下建一个 inc 目录把公共头文件放进去 mkdir inc :: 选项里填$PROJ_DIR$\inc输出格式这一项在 Linker Output 里手册里写得很细勾上 Allow C-SPY-specific extra output file然后在 Output format 选 Debug information for C-SPYExtra output 里再选具体格式。三种组合对应三种用途——只做 Flash 调试选 simple-code要给 Flash Magic 这类外部工具烧写选 intel-extended 并把后缀改成 hex只下到 RAM 调试这一步可以直接跳过。用途Output formatExtra output备注Flash 在线调试Debug information for C-SPYsimple-code配合 flash loader外部工具烧写Debug information for C-SPYintel-extended后缀手动改成 hexRAM 调试Debug information for C-SPY不勾跳过本节3.5 链接命令文件与调试器驱动RAM 和 Flash 是两套组合这一节是整篇的核心因为它决定了程序到底被放到哪。手册把两套组合写得很明确Flash 调试这条路链接命令文件选LPC2148_flash.xclDebugger Download 里勾上 Use flash loader(s)由 flash loader 负责把代码写进片内 Flash。RAM 调试这条路选LPC2148_RAM.xcl不勾 flash loader代码直接下到 RAM 里跑速度快、不伤 Flash但掉电就没了。链接文件的位置在 Linker Config 页勾上 Override default然后浏览选择具体的 xcl。这里最容易出的错是改了 xcl 但没勾 Override default工具链仍然用默认配置你以为换了其实没换。调试器驱动在 Debugger Setup 里Driver 选 RDI Driver这是为了对接 H-JTAG 调试代理和 SuperJTAG 转接头。选完 RDI 之后会多出一个 RDI 配置入口里面必须给出H-JTAG.dll的完整路径例如C:\Program Files\H-JTAG\H-JTAG.dll。这个路径不给或者给错现象是点 Debug 之后进度条卡在「Connecting」没有任何有用报错。组合xcl 文件Use flash loader(s)程序去向Flash 调试LPC2148_flash.xcl勾选片内 Flash掉电保持RAM 调试LPC2148_RAM.xcl不勾片内 RAM掉电丢失配置完成后 File Save Workspace把.eww存下来。到这里工程层面的东西就齐了。3.6 编译链接与 map 文件核对Project Rebuild All 全量重编。Build 窗口最后会给一行汇总包含错误数、警告数和代码数据尺寸。错误清零是基本要求警告我也建议清零——尤其是「变量定义了没用」这类在优化级别较高时往往预示着某段逻辑根本没被编进去。工程选项配错的时候IDE 的报错往往指向不明这时候可以用命令行单独编一个文件来定位把问题从「工程配置」缩小到「某个选项」:: 单文件编译用来确认 include 路径和 CPU 型号是否生效 C:\IAR\ewarm44\arm\bin\iccarm.exe src\main.c --cpuARM7TDMI-S -I inc -o Debug\Obj\main.o--cpuARM7TDMI-S要和 General Options 里选的器件对得上-I inc就是头文件包含路径和界面上填的$PROJ_DIR$\inc等价-o指定输出目标文件。如果这条命令能过而 IDE 里报找不到头文件那八成是选项改完没保存或者你改的是另一个 build configuration。链接完成后看 map 文件这是排查地址问题最直接的黑匣子。重点看两处CODE 段的起始地址应该是 0x00000000 一带DATA 段起始应该在 0x40000000 一带。如果 CODE 跑到 0x40000000 去了说明 xcl 选成了 RAM 版本而你又勾了 flash loader两边打架。:: 从 map 文件里捞出代码段和数据段的分布 findstr /i CODE DATA Debug\List\LPC2148_Demo.map这条命令输出的是段名和地址区间配合前面的 xcl 宏定义一起看能很快判断出程序被放在了哪块存储上。4. 常见问题排查五处最容易翻车的地方这套环境的问题有个共同特征编译器几乎不报错错误都发生在链接之后。所以排查思路要反过来——先假定配置是对的从现象倒推是哪一层没接上。下面五条是我这些年重复遇到次数最多的按「现象 → 原因 → 解决」记下来。4.1 五条踩坑记录第一条Add Files 对话框里看不到汇编文件。现象是打开添加文件窗口例程目录里明明有.s79列表里却一个都没有。原因是文件类型过滤器默认只匹配*.c; *.cpp。解决办法是在文件名输入框直接敲*.*回车或者把过滤器下拉切到 All files。加完之后确认启动文件确实出现在工程树里否则链接阶段不会报错下载后程序停在复位地址不动。第二条编译报 cannot open source file xxx.h。现象是自写代码里 include 的头文件全部报找不到但文件确实存在。原因是 Additional include directories 里没加对应目录或者加了但用了绝对路径、换机器后失效。解决办法是回到 C/C Compiler Preprocessor用$PROJ_DIR$相对路径逐行补齐每行一个目录不要用分号串在一行里。改完 Rebuild All增量编译有时不会重新解析包含关系。第三条链接过了下载也提示成功程序就是不跑。这是最典型的一组。原因通常有两个叠加xcl 选成了 RAM 版本却勾了 Use flash loader(s)或者反过来选了 flash 版本却没勾 flash loader。前者会把代码按 RAM 地址链接flash loader 又把它写到 Flash运行地址全错后者代码按 Flash 地址链接却直接灌进 RAM一上电就飞。解决办法是对着 3.5 节那张表逐项核对两处必须成对。判断当前用的是哪套看 map 里 CODE 段起始地址最快。第四条点 Debug 卡在 Connecting没有任何有效报错。原因基本锁定在调试链路上Driver 没选 RDI或者 RDI 里H-JTAG.dll的路径空着、写错、指向了另一个版本。解决办法是先在 IAR 外面单独打开 H-JTAG点检测目标能读到内核 ID 再回来。读不到就先查并口模式和端口地址 0x378再查转接头供电。这一步的顺序不能反IAR 里的报错信息量太少靠它定位基本靠猜。第五条KickStart 版链接报代码尺寸超限。现象是编译全过链接阶段报超出 32KB 限制。原因不是你代码写错了是授权版本的上限到了。解决办法有两条换 Full 版授权或者在 Debug 配置下把优化级别从 None 调到 Low 甚至 Size先把尺寸压下来。判断当前占用多少看 map 里 CODE 段的总长度或者 Build 窗口汇总行里的 code 字节数。4.2 配置改乱了怎么回滚两套工程比一套稳选项一多改着改着就忘了最初哪个值是对的这是常态。我的做法是从来不在一个工程上来回切 RAM 和 Flash 两套配置而是保留两份.ewp一份固定 flash 组合一份固定 RAM 组合需要哪套就打开哪份工作区。这样任何一次改坏另一份都是干净的对照。:: 建好 flash 版之后直接复制一份出来当 RAM 版再单独改选项 copy LPC2148_Demo.ewp LPC2148_Demo_ram.ewp :: 每次改选项之前先留一份备份改坏了直接覆盖回去 copy LPC2148_Demo.ewp LPC2148_Demo.ewp.bak复制出来的.ewp在同一条工作区里可以通过 Project Add Existing Project 挂进来两个工程共用同一批源文件只是选项不同。改坏的时候把.bak覆盖回去比在 Options 十几个页签里逐项回忆改过什么快得多。这套办法看起来笨但它把「配置」变成了可以版本化的文件出问题时有后悔药可吃。5. 装完怎么验证三步确认这套环境真能跑通装完不等于能用。我给这套环境定的验收标准是三步每步都有明确的通过条件任何一步不满足就回去查对应章节不要往下走。第一步Rebuild All 零错误零警告。这一步验的是工具链和工程选项。看 Build 窗口最后一行错误数必须是 0警告我也要求清零特别是「变量已定义未使用」和「函数隐式声明」这两类它们在低优化级别下不致命但往往意味着某个头文件没包含对。通过条件很直白全量重编一次输出干净。第二步map 文件里的段地址对得上。这一步验的是 xcl 和下载模式是否成对。:: 一次性核对代码段、数据段和总尺寸 findstr /i CODE DATA Debug\List\LPC2148_Demo.mapCODE 段起始应当在 0x00000000 一侧Flash 组合DATA 段起始在 0x40000000 一侧。同时看 CODE 段总长度KickStart 版必须小于 32KB。如果 CODE 落在 RAM 区间说明你选的是 RAM 版 xcl这时就别勾 flash loader两边保持一致。第三步真正下载一次并停在复位入口。Project Debug 进入 C-SPY然后 Debug Download and Debug。通过条件有三个下载过程不报错下载完成后反汇编窗口的 PC 停在复位处理入口附近而不是 0x00000000 之后一片空白按全速运行后你写的第一条有效指令点灯、串口打印、或者往某个寄存器写值确实生效。第三步是唯一能证明「编译链接下载」整条链路都通的验收前两步都过了但这一步不过问题一定在调试器驱动或者 flash loader 上。验收步骤检查对象通过条件Rebuild All编译器、工程选项0 错误 0 警告map 核对xcl、输出格式CODE 在 0x00000000 侧DATA 在 0x40000000 侧下载调试RDI、flash loaderPC 停在复位入口程序实际生效从那以后我每次装这种老工具链都会强制走一遍这三步哪怕只是帮人看一个「下载不进去」的问题也先从 map 文件的段地址看起——它比任何报错信息都诚实。希望这套流程能帮到你少在连接超时上耗一个下午。本文还有配套的精品资源点击获取