LPC2148 IAR 工程配置与下载调试避坑指南
简介:这份PPT手册面向使用IAR开发LPC2148等NXP ARM单片机的嵌入式初学者、高校学生与竞赛队伍,定位为快速入门与工程配置参考,背景可追溯到NXP中国ARM MCU大学设计竞赛的培训材料。内容按创建工程、添加代码、配置工程选项、编译链接、下载调试五部分展开:从选择ARM工具链与空白工程模板,到添加C/C++及汇编源文件,再到设置优化级别、头文件路径、Flash烧写格式、链接命令文件、调试器驱动和调试代理,流程覆盖较完整。压缩包只有1个PPT文件,约806KB,篇幅集中,适合快速浏览、教学分享和按步骤对照。已有511人学习,说明其在IAR入门与NXP ARM MCU开发场景中具备一定参考价值。读者可借此理解常见工程选项的含义,熟悉从建工程到在线调试的链路,并参考LPC2148示例迁移到相近芯片,减少环境配置阶段的试错。
1. 从一块躺了三天的 LPC2148 说起
翻出这份 IAR 使用手册,是因为一块 LPC2148 的板子在桌上躺了三天:IAR Embedded Workbench for ARM v4.41A 里工程 Rebuild all 全绿,点 Download and Debug 却卡在 Flash loader 那一步不动,进度条像被人按了暂停。这套环境在 ARM7 教学板、竞赛板上太常见了,手册薄薄几十页,真正决定成败的是 Options 里那十几个下拉框——选错一个,编译照过,下载就是进不去。下面按我自己的装机顺序走一遍:建工程、加代码、配选项、编译链接、下载调试,每个选项为什么这么选、填错了看什么现象,都摊开写。适合刚拿到板子和这套工具、准备从零跑通第一个工程的人;用 KickStart 版的对得上大部分步骤,差别只在代码体积上限。
2. 建工程:Tool chain 选 ARM、模板选 Empty project 这两个下拉框
2.1 启动路径和 Create New Project 的两个下拉框
装完 EWARM 之后,开始菜单里会多出一组 IAR Embedded Workbench for ARM 的快捷方式,点最外层那个 IAR Embedded Workbench 启动,不要点成命令行工具或卸载项。进主界面后走 Project → Create New Project…,弹出的对话框里只有两个下拉框需要你决定:Tool chain 和 Project templates。
Tool chain 选 ARM。有人在这里找不到 ARM 选项,多半是装成了 8051 或 MSP430 版本,或者是 KickStart 版装在另一个目录、开始菜单里两个图标并排,点错了。Project templates 选 Empty project,别图省事挑带 main 的模板。模板会把启动文件、链接脚本、甚至某个具体芯片的配置一股脑塞进工程,版本对不上时排查成本比从零搭更高,这也是我后来一律用空工程的原因。
点 OK 之后不要急着找源文件,先去存盘。存盘这一步手册里写得轻松,翻车的人不少,下一节说清楚。
2.2 .ewp 和 .eww 不是一回事
IAR 的工程体系里有两个文件必须分清。.ewp是工程文件,记录的是这个工程的全部配置:源文件列表、Options 里每一个页签的每一项、链接脚本路径、调试器驱动。.eww是 workspace 文件,记录的是这个工作区里挂了哪几个工程、当前激活哪个 configuration。只存.ewp不存.eww,下次打开得重新把工程挂进工作区;只存.eww不存.ewp更难受,双击打开是一片空白。两个都存,放同一个目录。
目录本身也有讲究:路径别带中文、别带空格。IAR 4.x 时代的工具链对含空格路径的容忍度不高,链接脚本里再拼上相对路径,很容易出现「文件明明在,链接器说找不到」。我一般会按下面的结构摆:
# 工程目录就这么摆,路径不带中文和空格 mkdir -p ~/work/LPC2148_Demo cd ~/work/LPC2148_Demo # EWARM 4.x 的安装目录名是 Embedded Workbench 4.0,按自己的实际安装位置改 EWARM="/opt/iarbuild/Embedded Workbench 4.0" # 从安装目录自带的例程里拷两份链接脚本过来,一份给 Flash 一份给 RAM cp "$EWARM/arm/examples/LPC214x/IAR-LPC-214X/Uart/Configuration/LPC2148_flash.xcl" . cp "$EWARM/arm/examples/LPC214x/IAR-LPC-214X/Uart/Configuration/LPC2148_RAM.xcl" . ls -l$EWARM只是个普通 shell 变量,路径里有空格所以必须加双引号,这一点和后面在 IAR 里填路径是同一个道理。两份.xcl是链接器命令文件,用来控制代码和数据在芯片内部存储器里怎么摆(Flash 段、RAM 段、堆栈大小),一份对应把程序烧进 Flash 跑,一份对应下载到 RAM 里跑,后面 Options 里二选一,别手滑删掉任何一份。
工程文件存成LPC2148_Demo.ewp,和源文件、脚本放在同一层,后面所有相对路径才有基准点。
2.3 添加源文件:.c、.cpp 和 *.s79
源码准备好之后走 Project → Add Files…,文件类型过滤填*.c; *.cpp; *.s79一次全选。.s79是 IAR ARM 汇编器的源文件扩展名,启动代码、中断向量这类文件通常就是它,漏掉它的典型现象是链接阶段报缺少__vector_table或者复位入口,编译本身不报错,很容易被当成链接脚本写错。
Add Files 只是把文件引用进工程,不会复制。源文件还在原目录的话,换台机器或者把工程目录拷给别人,文件就断了。凡是进工程的源文件,一律先拷到工程目录下再 Add,这是省后悔药的做法。添加完成后 Workspace 窗口里会按组显示,我习惯按src、startup、config分三组,工程一大就靠这个分组找人。
到这一步工程骨架就有了,但还不能编译,Options 里该配的一项都没配。
3. 编译侧配置:优化级别、头文件路径和 Flash 输出格式
3.1 Options 的入口,以及你改的是哪个 configuration
在 Workspace 窗口右击工程名,选 Options…,快捷键是 Alt+F7。这个对话框是所有配置的总入口,页签树从左到右依次是 General Options、C/C++ Compiler、Assembler、Output Converter、Custom Build、Build Actions、Linker、Debugger 这一类。第一次打开容易懵,其实只有四组需要动:通用、编译器、链接器、调试器。
先看对话框左下角的 configuration 下拉。IAR 建工程时会自动生成 Debug 和 Release 两套构建配置,Options 是分 configuration 保存的——你在 Debug 下改的东西,切到 Release 全是默认值。我一般只留 Debug 一套用到底,省掉「Debug 能跑 Release 挂掉」这种最难查的坑;如果项目要求两套并行,改完一套立刻切另一套同步改。
3.2 通用选项与编译器优化级别
General Options → Target 页签里,Device 选到具体型号 LPC2148,Endian 选 Little。Device 这一项不只是个标签,它决定编译器预定义哪些宏、链接器默认的存储器布局,选错了后面所有地址都可能对不上。
C/C++ Compiler → Optimizations 页签的 Level 是新手最容易随手一拉的地方,选项是 None、Low、Medium、High、Size。经验做法:调试阶段用 Low,交付前再评估要不要上 High 或 Size。High 会把局部变量直接优化进寄存器甚至消掉,你在 Watch 窗口看到的是<not available>,单步时行号还会乱跳,这不是环境坏了,是优化把代码重排了。Size 优先体积,代码节奏和源码对不上的概率更高,定位时序问题的时候尤其别开。
顺带提一句命令行方式,批量重建或者脚本里跑的时候用得上:
# 全量重建 Debug 配置,输出窗口的告警会打到终端 iarbuild LPC2148_Demo.ewp -build Debug # 想强制全量而不是增量,换成 -rebuild iarbuild LPC2148_Demo.ewp -rebuild Debug-build是增量构建,改了哪个文件编哪个;-rebuild是清干净重来,怀疑缓存脏了就用它。末尾那个参数是 configuration 名,必须和对话框里那套一致,写错会直接报找不到配置。
3.3 头文件包含路径:用 $PROJ_DIR$ 而不是绝对路径
程序里 include 了其它目录的头文件,就得在 C/C++ Compiler → Preprocessor 页签的 Additional include directories 里一行一条写清楚。这里最常见的写法错误是填绝对路径,本机跑得好好的,拷到实验室另一台机器上全线报找不到xxx.h。
用 IAR 自带的路径变量:
$PROJ_DIR$\inc $PROJ_DIR$\driver\inc $PROJ_DIR$\..\common\inc$PROJ_DIR$指向.ewp文件所在目录,工程拷到哪它就跟到哪,这是这套环境里最省事的一个变量。另一个常用的是$TOOLKIT_DIR$,指向 EWARM 安装目录,引用工具链自带的头文件时用它。顺序也有讲究:IAR 按列表从上往下找,同名头文件放两处时,排在前面的那个生效——我就被旧版本头文件盖住新版本坑过一次,找了半天以为是编译器玄学。
3.4 输出文件参数与 Flash 烧写格式
Linker → Output 页签有两件事要定。第一,勾上 Allow C-SPY-specific extra output file,这个名字不好记,作用是让链接器额外产出 C-SPY 调试器需要的输出文件,不勾的话下载调试阶段可能提示找不到可加载的映像。第二是 Format,它决定最终产物长什么样,按你的下载方式来选:
| 场景 | Format 选择 | 补充动作 |
|---|---|---|
| 用 IAR 自带调试器直接下载 | simple-code | 不用改后缀 |
| 生成 hex 给外部烧写工具 | intel-extended | 勾 Override default,后缀改成 hex |
| 只下到 RAM 里调试 | simple-code | 可跳过本步 |
选 intel-extended 而不勾 Override default,产出的文件后缀还是.d79之类,外面那些烧写工具按扩展名认格式,直接拒收。这一步我吃过亏,文件明明生成了,工具就是说格式不对,翻来覆去查了半天才发现是后缀没改。规则很简单:走 IAR 下载就 simple-code,走外部工具就 intel-extended 加改后缀。
4. 调试侧配置:两套 xcl、RDI Driver 和 H-JTAG.dll 路径
4.1 Linker Command File:RAM 和 Flash 各用各的
Linker → Config 页签,勾上 Override default,然后浏览选中第 2 章拷过来的那份.xcl。选哪份取决于你要把程序放哪跑:下到 RAM 调试选LPC2148_RAM.xcl,下到 Flash 调试选LPC2148_flash.xcl。
这两份文件不是随便替换的等价物。Flash 版把代码段定位到片内 Flash 的起始地址,中断向量表也放在那;RAM 版整体搬到 RAM 区,调试时断电即失,但下载速度快、擦写次数为零,反复改代码的阶段我更愿意用 RAM 调试。用错的表现很直接:Flash 版配了 RAM 的脚本,下载能过但一复位就跑飞;反过来则是链接阶段就报段溢出。
4.2 调试器驱动与 Use flash loader(s) 的勾选关系
Debugger → Setup 页签,Driver 选 RDI Driver。选它是因为要接第三方调试代理:这套组合里,IAR 通过 RDI 接口把命令交给 H-JTAG,H-JTAG 再去驱动并口转接头(SuperJTAG 或其它 Wiggler 兼容设备)。如果驱动选成默认的 J-Link/J-Trace 之类,点下载会直接报找不到硬件,其实硬件好好的,只是通道没对上。
Debugger → Download 页签里的 Use flash loader(s) 是另一个开关,它和上面的 xcl 必须成对:
| 目标 | Linker 脚本 | Use flash loader(s) | 输出格式 |
|---|---|---|---|
| 下载到 Flash 调试 | LPC2148_flash.xcl | 勾选 | simple-code |
| 下载到 RAM 调试 | LPC2148_RAM.xcl | 不勾 | simple-code |
| 生成 hex 外部烧写 | LPC2148_flash.xcl | 不影响 | intel-extended |
三列里任意一列走偏,症状都不一样:脚本错是链接或复位后跑飞,flash loader 错是下载阶段卡住,格式错是外部工具不认。排查时按这张表逐列对一遍,比盲猜快得多。
4.3 RDI 调试代理:H-JTAG.dll 的路径怎么填
Debugger 下面会有与 RDI 相关的设置项,核心只有一条:把 H-JTAG 安装目录下那个H-JTAG.dll的完整路径填进去。填目录不行,得指到文件;路径里带空格也没关系,但别手打,用浏览按钮选。
填完先别急着在 IAR 里点下载。单独打开 H-JTAG 这个小工具,让它去认一下目标芯片,能读出芯片 ID 和 Flash 型号,说明转接头、并口、供电这一串都是通的;认不到就是硬件侧的问题,在 IAR 里怎么调都没用。这一步相当于给调试链路做个黑匣子快照,通了再回 IAR,出问题时就能确定是软件配置还是硬件连接。
并口转接头的端口地址在 H-JTAG 那边设,IAR 这边只管 dll 路径,两边职责别搞混。
4.4 保存 Workspace 文件
配置到这里才算完整。走 File → Save Workspace,存成LPC2148_Demo.eww。注意是 Save Workspace 不是 Save Project——Options 里的改动保存在.ewp里,工作区里挂哪些工程、当前激活哪个 configuration 保存在.eww里,两个动作都要做一遍,否则下次打开会发现配置「回退」了,其实是只存了一半。
养成习惯:改完 Options 立刻 Ctrl+S 存工程,再 File → Save Workspace。半分钟的事,能省掉「明明配好了怎么又变了」的怀疑人生。
5. 排查:LPC2148 上五个反复翻车的配置点
5.1 编译阶段:能过但不对劲的三种情况
第一条,现象是编译报一堆cannot open source file "xxx.h",工程目录里明明有这个文件。原因是头文件路径写成了绝对路径,或者用了正斜杠和反斜杠混搭,换台机器路径失效。解决办法是把 Additional include directories 全部改成$PROJ_DIR$开头的相对路径,每条单独一行,别用分号串成一行——IAR 这个框是按行解析的,串行写只有第一条生效。
第二条,现象是编译零错误,但单步调试时变量显示<not available>,行号乱跳,断点停的位置和源码对不上。原因是编译器优化级别开到了 High 或 Size,变量被优化进寄存器或直接消掉。解决办法是把 C/C++ Compiler → Optimizations 的 Level 降到 Low,全量重建一遍;调试期间不要用 High,等要出正式版本再单独评估。
第三条,现象是 Debug 配置下一切正常,切到 Release 编译就报错或行为异常。原因是 Options 按 configuration 分开存,只改了 Debug 那一套。解决办法是切到 Release 再对一遍链接脚本、优化级别、输出格式,或者干脆删掉 Release 只留一套配置,减少变量。
5.2 下载与调试阶段:卡住和认不到设备
第四条,现象是点 Download and Debug 之后进度条停在 Flash loader 那一步,或者直接弹 flash loader 相关错误。原因通常是三项没对齐:链接脚本用了 RAM 版却勾了 Use flash loader(s),或者脚本用了 Flash 版却没勾,再或者输出格式选成了 intel-extended 但下载方式还是 IAR 直连。解决办法是照第 4 章那张对照表逐列核对,三项必须成组出现,改完记得 Save Workspace。
第五条,现象是 RDI 报找不到调试代理或找不到目标设备。原因分两层:软件层是H-JTAG.dll路径没填、填成目录、或者指向了旧版本残留的 dll;硬件层是转接头没插紧、目标板没供电、并口地址在 H-JTAG 里没配对。解决办法是先脱离 IAR,单独开 H-JTAG 读芯片 ID,读得到就回来重填 dll 路径并重启 IAR,读不到就先查供电和排线,别在 IAR 里反复点。
顺带说一个和版本有关的:用 KickStart 版(32K 限制)编大一点的工程,链接阶段会报代码段超出限制,这不是配置错,是授权版本的天花板。工程一旦超过这个体积,只能换完整版,改任何选项都救不回来。
6. 验证:Rebuild all 之后怎么确认这套环境真的通了
配置改完,走 Project → Rebuild all,先看输出窗口最后那行统计:0 error 是底线,warning 也要扫一眼。链接阶段的 warning 里藏着一类典型问题——某个段被放到了默认位置、某个符号未定义但被弱引用兜住,编译能过、下载能跑,跑起来行为却不对。
我的验证顺序是这样的,四步都过才算这套环境装好了:
| 步骤 | 动作 | 通过标准 |
|---|---|---|
| 1 | Rebuild all | 输出窗口 0 error,warning 逐条看过 |
| 2 | 单独打开 H-JTAG | 能读出芯片 ID 和 Flash 型号 |
| 3 | Download and Debug | 停在 main 或复位入口,不卡 flash loader |
| 4 | 全速运行 | 板上有可观察的输出(点灯、串口一行字) |
第 3 步停下来之后,先别急着按全速。看一眼 Disassembly 窗口里 PC 指向的位置,落在启动代码的复位入口或者 main 的第一行,说明向量表和链接脚本是对上的;如果 PC 停在一片空白地址,八成是 xcl 选错或者向量表没被放进工程。这一步比看任何日志都直接。
第 4 步我建议专门留一个最小验证工程:只做两件事,翻转一个 GPIO 让板载灯闪,串口打一行固定的字符串。每换一台机器、每换一块板子、每次重装工具链,先拿它跑一遍,通了再上正式工程。这个习惯救过我很多次——正式工程出问题时,你永远不知道是代码写错了还是环境又变了,而最小工程能立刻把变量锁定到一边。
退出调试走 Debug → Stop Debugging,别直接拔线,正在跑的调试会话被硬断,下次连接偶发认不到设备,得重启 H-JTAG 才能恢复。
从那以后我每次配完一套新环境,都强制走一遍「Rebuild all → 单开调试代理认芯片 → 停在 main → 灯闪一下」这条线,四步全绿才动正式代码。看着笨,但比在几百行工程里猜哪一项配错了快得多。希望帮到你。这份 IAR 使用手册把创建工程、添加代码、配置选项、编译链接、下载调试五段流程按顺序串了下来,配套的 LPC2148 例程和两份 xcl 都是能直接复现的实物,照着走一遍,上面这些坑基本都能提前绕开。
本文还有配套的精品资源,点击获取