简介:本资源是一份面向嵌入式开发初学者与高校电子类竞赛参赛者的IAR Embedded Workbench for ARM快速入门指南,聚焦ARM Cortex-M系列(如LPC2148)的工程搭建、代码管理、编译配置、Flash烧写及JTAG调试全流程。内容基于2007年NXP中国ARM MCU大学设计竞赛官方参考文档,涵盖5大核心环节:创建空工程并指定ARM工具链、添加C/汇编源码与头文件、精细化配置编译器优化级、头路径、Linker脚本(.xcl)、调试代理(H-JTAG)及下载模式、编译链接生成可执行文件、最终下载至目标板完成在线调试。资源为单个PPT文件(806KB),结构清晰、图文结合,含详细操作截图与目录导航,覆盖从软件启动到退出调试的完整工作流。目前已有512人学习下载,特别适合零基础接触IAR环境、需快速掌握ARM嵌入式开发标准流程的实践者。
1. IAR 是什么:一个嵌入式开发的“厨房工作台”,不是黑匣子
你刚拿到一块 LPC2148 开发板,上面密密麻麻全是焊点和芯片,心里想:“这玩意儿怎么让它亮个灯?写个 C 语言就能跑?”——别急,它不是单片机,是“裸机”,没有操作系统帮你打理内存、调度任务、收发串口。它像一台没装操作系统的老式收音机:电路是对的,但你得亲手调频、接天线、拧音量旋钮,少一步都出不来声。
IAR Embedded Workbench 就是你在这台收音机前摆开的那张“厨房工作台”:左边放着菜刀(C 编译器),中间是砧板(链接器),右边架着灶台(调试器),抽屉里还分门别类存着锅碗瓢盆(启动文件、寄存器定义、内存布局脚本)。它不替你炒菜,但把所有厨具擦得锃亮、排得整齐、连火候档位都标好了——你只要专注写“菜谱”(你的 C 代码),它就负责把菜谱翻译成灶台能懂的指令、装进锅里、点火、测温度、甚至帮你尝一口咸淡(断点调试)。
这份《IAR 使用手册》就是这张工作台的“新手组装说明书”,专为 2007 年那批刚摸到 ARM 芯片的大学生写的。它不讲编译原理,不聊指令集架构,只告诉你:第一步拧哪颗螺丝(创建工程)、第二步往哪个抽屉拿锅(添加 .xcl 文件)、第三步灶台开关在哪(配置 RDI 驱动)。它面向的是完全没碰过嵌入式开发、连 JTAG 接口长什么样都不知道的新手——你不需要懂“交叉编译”,只需要知道“点一下 Rebuild all,它就会给你一个能烧进芯片的文件”。今天,我们不翻旧账、不比新旧,就把它当一张泛黄但依然清晰的蓝图,带你从零搭起第一个能跑起来的 ARM 工程。
2. 先搞懂一个概念:IAR 不是 IDE,而是“工具链集成器”
很多新手第一次打开 IAR,看到满屏菜单和窗口,下意识觉得:“哦,又一个 VS Code 或者 PyCharm 那样的编辑器。” 这是个关键误会。IAR 的核心价值,从来不在“写代码多顺滑”,而在于它把一整套原本要手动拼接、到处找路径、改配置文件的底层工具,严丝合缝地“焊”在了一起。理解这一点,才能避开后面 80% 的翻车现场。
2.1 它到底集成了哪些“零件”?
你可以把 IAR 想象成一辆出厂即配齐的越野车,而不是一堆散件:
- 编译器(C/C++ Compiler):把你的
main.c翻译成 ARM 指令。它不是 GCC,是 IAR 自研的,对嵌入式场景做了大量优化(比如更小的代码体积、更确定的执行时间),但代价是——它不免费,且语法细节和 GCC 有微妙差别(比如某些内联汇编写法)。 - 汇编器(Assembler):处理
.s79这类汇编文件。ARM 启动时第一行代码必须是汇编(设置堆栈、跳转到 C 入口),这部分不能交给 C 编译器。 - 链接器(Linker):最关键的“空间规划师”。它读取你指定的
.xcl文件(比如LPC2148_flash.xcl),严格按你写的规则,把编译好的代码段(.text)、初始化数据(.data)、未初始化数据(.bss)塞进 LPC2148 芯片里指定的 RAM 或 Flash 地址。漏配一个地址,程序就可能跑飞——这不是玄学,是物理地址没对上。 - 调试器(C-SPY):你的“数字显微镜”。它通过 JTAG 接口(用 H-JTAG 软件做桥梁)和开发板通信,让你能暂停程序、看寄存器值、单步执行。它不生成代码,只观察和控制运行中的代码。
- 工程管理器(Project Manager):那个左侧 Workspace 窗口。它不编译也不调试,但它记住了:哪些文件属于这个工程、用哪个
.xcl链接、优化级别设几级、头文件在哪找……所有这些配置,最终都固化在.ewp(工程文件)和.eww(工作区文件)里。删掉它们,整个工程就“失忆”了。
提示:IAR 的“智能”体现在配置联动。比如你选了
LPC2148_flash.xcl,它会自动把输出格式设为simple-code;你选了RAM模式,它就悄悄关掉 Flash 烧写选项。这种联动不是魔法,是设计者把常见硬件约束(LPC2148 的 Flash 起始地址是0x00000000,RAM 是0x40000000)提前写进了模板。你照着做,就大概率不会错。
2.2 为什么非得用它?不用 Keil 或 GCC 行不行?
当然行。但这份手册的语境很具体:它是为 2007 年 NXP 大学竞赛准备的,目标芯片是 LPC2148,配套工具是 H-JTAG + SuperJTAG 硬件。当时 Keil MDK 对 NXP 芯片支持尚不完善,GCC 工具链需要手动配置arm-elf-gcc、arm-elf-ld、arm-elf-objcopy,还要自己写ldscript,对新手极其不友好。而 IAR v4.41A 已经内置了 LPC2148 的设备支持包(Device Support Pack),包含:
- 预定义的寄存器头文件(
LPC2148.h) - 标准外设驱动库(UART、GPIO 初始化函数)
- 适配该芯片的启动代码(
cstartup.s79) - 以及最关键的——
LPC2148_flash.xcl和LPC2148_RAM.xcl这两个内存布局脚本。
这意味着,你不用去查芯片手册第 32 页的 Flash 地址范围,不用手动计算堆栈大小,IAR 已经帮你填好了。这是“开箱即用”的真实含义:省下的不是时间,是避免因地址配错导致的“程序下载成功但死机”这类血泪经验。
2.3 新手最容易忽略的“隐形依赖”
IAR 本身是个 Windows 桌面程序,但它背后依赖三个外部组件,缺一不可:
- H-JTAG 软件:它不是 IAR 的一部分,是独立安装的“翻译官”。IAR 的 C-SPY 调试器只认识一种语言叫 “RDI”(Remote Debug Interface),而你的 SuperJTAG 硬件只说“JTAG 时序”。H-JTAG 就是那个把 RDI 指令翻译成 JTAG 电平信号的中间人。没有它,IAR 点“Download”按钮,开发板纹丝不动。
- SuperJTAG 硬件(或兼容 Wiggler 设备):这是物理桥梁。它一头插电脑并口(注意:是并口,不是 USB!2007 年的设备),另一头用 JTAG 线缆接开发板的 JTAG 接口(通常是 20 针插座)。如果现在你用的是 USB-JTAG 适配器,这份手册里的 H-JTAG 配置就完全不适用——这是时代差异,不是你错了。
- 芯片手册与开发板资料:IAR 不会告诉你
PINSEL0寄存器第 12 位控制 P0.2 的功能。它只提供LPC2148.h头文件,里面定义了PINSEL0 = 0x00000000;这样的宏。但你怎么知道该写0x00000001还是0x00000002?答案永远在LPC214x User’s Manual里。IAR 是工具,芯片手册才是“说明书”。
所以,当你卡在“下载失败”时,先别怀疑 IAR 设置,问问自己:H-JTAG 装了吗?并口线插紧了吗?开发板供电正常吗?这三个问题解决掉,80% 的“无法连接目标”问题就消失了。
3. 第一步:创建你的第一个工程,从点击“Empty project”开始
别被“Embedded Workbench”这么高大上的名字吓住。创建工程这件事,本质上就是告诉 IAR:“我要做一个项目,名字叫LPC2148_Demo,它用 ARM 指令,代码放在D:\MyProject\这个文件夹里。” 其余的,都是围绕这个核心信息展开的确认动作。我们一步步来,每一步都解释清楚“为什么是这个选项”。
3.1 启动软件并新建工程
首先,确保你已经成功安装了 IAR Embedded Workbench for ARM v4.41A(注意版本号,v4.41A 是手册指定的,新版可能界面不同)。安装完成后,在 Windows 开始菜单中找到:
Start → Programs → IAR Systems → IAR Embedded Workbench for ARM → IAR Embedded Workbench点击打开。你会看到一个干净的主界面,左侧是空的 Workspace 窗口,右侧是编辑区。
此时不要急着写代码!新手常犯的第一个错误,就是直接在编辑区敲
#include <stdio.h>,然后发现编译报错——因为工程还没建,IAR 根本不知道你要编译什么、用什么规则。
接下来,创建工程:
- 点击顶部菜单栏的
Project→Create New Project… - 弹出对话框后,第一件事是选择保存位置:点击
Browse,导航到你打算存放项目的文件夹,比如D:\MyIARProjects\,然后在File name输入框里输入LPC2148_Demo.ewp(.ewp是 IAR 工程文件的标准后缀)。注意:这里输入的是文件名,不是文件夹名。IAR 会自动在你选的文件夹里创建这个.ewp文件,并同时生成一个同名的子文件夹(如LPC2148_Demo)来存放源码。这是它的默认习惯,接受它。
3.2 选择工具链和模板:为什么必须选 ARM + Empty project?
点击OK后,会弹出一个关键选择窗口:
- Tool chain(工具链):下拉菜单里选
ARM。这是硬性要求,因为 LPC2148 是 ARM7TDMI 内核。如果你误选了AVR或MSP430,后面所有配置都会错位——就像给宝马车装拖拉机轮胎。 - Project templates(工程模板):这里有两个常见选项:
Empty project和Hello World。务必选Empty project。原因很简单:Hello World模板会自动生成一个带printf的示例,但 LPC2148 没有标准输出设备(没有屏幕、没有串口重定向),printf会直接导致链接失败或运行崩溃。Empty project则给你一张白纸,只包含最基础的框架,让你从最干净的状态开始添加自己的代码,这是学习原理的最佳起点。
选好后,点击OK。此时,Workspace 窗口左侧会出现一个名为LPC2148_Demo的工程节点,前面有个小齿轮图标,表示它已创建成功,但内部还是空的。
3.3 保存工作区:.eww文件的作用是什么?
工程创建后,IAR 还没“记住”这个工程。你需要手动保存工作区(Workspace):
- 点击顶部菜单
File→Save Workspace - 在弹出的对话框中,将文件名设为
LPC2148_Demo.eww(.eww是工作区文件后缀),保存到和.ewp相同的文件夹(如D:\MyIARProjects\)。
为什么需要
.eww?.ewp文件只记录单个工程的配置(比如用了哪个.xcl文件),而.eww文件记录的是“当前打开了哪些工程、它们的排列顺序、哪个是激活状态”。想象你同时开发 LED 控制和 UART 通信两个模块,.eww就是你的“项目总览图”。关闭 IAR 再打开,双击.eww文件,就能瞬间恢复上次的工作状态。这是新手建立秩序感的第一步:.ewp是工程的“身份证”,.eww是你的“工作台布局图”。
3.4 验证:检查工程是否真的“活”了
完成以上三步后,你的文件系统里应该有:
D:\MyIARProjects\ ├── LPC2148_Demo.ewp ← 工程文件(核心配置) ├── LPC2148_Demo.eww ← 工作区文件(工程列表) └── LPC2148_Demo\ ← IAR 自动创建的子文件夹(未来放源码)在 IAR 界面中,Workspace 窗口应显示:
Workspace └── LPC2148_Demo (Active)并且LPC2148_Demo节点是加粗的,表示它是当前激活工程。此时,右键点击LPC2148_Demo,能看到Options…、Add Files…等菜单项。如果这些菜单是灰色的,说明工程未激活,需要左键单击它一次。
注意:此时不要尝试
Rebuild all!因为工程里还没有任何源文件,编译必然失败。我们的目标不是立刻跑起来,而是确保“骨架”搭建正确。这就像盖房子,先打地基、立梁柱,再砌墙。下一步,我们才往这个骨架里“添砖加瓦”。
4. 添加代码:不是复制粘贴,而是“认领你的代码地盘”
很多新手以为“添加代码”就是把.c文件拖进 IAR 窗口。其实不然。IAR 的“添加”动作,本质是告诉链接器:“这些文件,是我这个工程的正式成员,请把它们编译后,按.xcl规则放进芯片内存。” 如果你只是把文件复制到文件夹,却不让 IAR “认领”,它就视而不见。这一步,我们重点解决“文件从哪来”和“怎么认领”两个问题。
4.1 准备源文件:从 IAR 自带例程里“借”关键脚本
手册明确指出:“从 IAR 自带的 LPC2148 例程中复制下列文件”。这不是可选项,是必选项。因为这些文件包含了芯片运行的“宪法”——内存布局规则。我们以LPC2148_flash.xcl为例,说明它为什么不可替代。
- 打开你的 IAR 安装目录(假设安装在
C:\Program Files\IAR Systems\Embedded Workbench 4.0\),导航到:\arm\examples\NXP\LPC214x\IAR-LPC-214X\Uart\Configuration\ - 你会看到两个关键文件:
LPC2148_flash.xcl:定义了当程序烧写到 Flash 时,代码、只读数据、可读写数据分别放在 Flash 的哪个地址段,RAM 的哪个地址段用于堆栈和全局变量。LPC2148_RAM.xcl:定义了当程序只在 RAM 中调试时(不烧写 Flash),所有内容都映射到 RAM 地址空间的规则。
为什么不能自己写?可以,但风险极高。比如 LPC2148 的 Flash 起始地址是
0x00000000,大小 512KB;内部 RAM 起始地址是0x40000000,大小 32KB。.xcl文件里有一行:define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; define symbol __ICFEDIT_region_ROM_size__ = 0x00080000;这就是在告诉链接器:“ROM 区域从 0x00000000 开始,占 0x00080000 字节(512KB)”。如果你写成
0x00000001,整个程序就偏移了一个字节,后果是启动失败。IAR 自带的.xcl文件,是经过芯片厂商验证的,抄它,是最稳妥的入门方式。
将这两个文件复制到你刚才创建的D:\MyIARProjects\LPC2148_Demo\文件夹中。现在,你的工程文件夹里有了“宪法”。
4.2 添加你的第一个 C 文件:从“点亮 LED”开始
现在,我们写一个最简单的main.c,目标:让 LPC2148 的 P0.2 引脚输出高电平(假设它接了一个 LED)。
在D:\MyIARProjects\LPC2148_Demo\文件夹里,用记事本新建一个文件,命名为main.c,内容如下:
#include "LPC2148.h" // 包含 IAR 自带的寄存器定义头文件 int main(void) { // 1. 配置 P0.2 为 GPIO 输出模式 PINSEL0 &= ~(0x03 << 4); // 清除 P0.2 的功能选择位(bit4-bit5) PINSEL0 |= (0x01 << 4); // 设置 P0.2 为 GPIO 模式(01) // 2. 配置 P0.2 为输出方向 FIO0DIR |= (1 << 2); // 设置 FIO0DIR 的 bit2 为 1,即 P0.2 输出 // 3. 输出高电平,点亮 LED FIO0SET = (1 << 2); // 设置 FIO0SET 的 bit2,P0.2 输出 1 while(1) { // 无限循环,保持状态 // do nothing } }这段代码的每一行都在操作 LPC2148 的特定寄存器。
LPC2148.h文件里,PINSEL0、FIO0DIR、FIO0SET都被定义为指向内存地址的指针(如#define PINSEL0 (*((volatile unsigned long *) 0xE002C000)))。所以PINSEL0 &= ~...实际上是在向地址0xE002C000写数据。这就是裸机编程的核心:用 C 语言直接读写硬件寄存器。
保存main.c后,回到 IAR 界面:
- 在 Workspace 窗口中,右键点击
LPC2148_Demo工程节点 - 选择
Add Files… - 在弹出的文件选择对话框中,定位到
D:\MyIARProjects\LPC2148_Demo\main.c,选中它,点击Open
此时,main.c会出现在 Workspace 窗口的工程节点下,前面有一个 C 语言图标。这表示 IAR 已经“认领”了它,后续编译时会处理这个文件。
4.3 添加启动代码:cstartup.s79是程序的“第一行”
main.c是你的逻辑,但芯片上电后,第一行执行的代码不是main(),而是一段汇编代码,负责:
- 初始化堆栈指针(SP)
- 初始化 C 运行环境(清零
.bss段) - 复制
.data段从 Flash 到 RAM - 最后跳转到
main()
这段代码就是cstartup.s79。IAR 安装目录里有现成的:
C:\Program Files\IAR Systems\Embedded Workbench 4.0\arm\src\lib\rt\iar\cstartup.s79将它复制到D:\MyIARProjects\LPC2148_Demo\文件夹,然后在 IAR 中右键工程 →Add Files…,添加这个.s79文件。
为什么必须加?如果不加,链接器会报错
Error[Li005]: no definition for "main"或Error[Li005]: no definition for "__vector_table"。因为cstartup.s79里定义了中断向量表(__vector_table)和_iar_program_start入口,这是 ARM 芯片启动的强制要求。它就像大楼的电梯井和消防通道,没有它,main()这个住户根本无法入住。
至此,你的工程里有了三样东西:
main.c:你的业务逻辑cstartup.s79:芯片启动的“管家”LPC2148_flash.xcl:内存布局的“建筑图纸”
骨架和血肉都有了,下一步,就是告诉 IAR 这三者如何协同工作。
5. 配置工程选项:避坑指南与关键参数详解
配置选项是 IAR 工程中最容易“点错一个就全盘皆输”的环节。它不像写代码那样有即时反馈,而像在黑暗中拧螺丝——拧对了,机器轰鸣;拧错了,一片死寂。这份手册的配置流程(3.1 到 3.11)看似琐碎,实则环环相扣。我们不罗列所有选项,只聚焦五个决定成败的关键点,并附上新手必踩的“避坑清单”。
5.1 进入配置界面:右键工程 → Options 是唯一入口
在 Workspace 窗口中,务必右键点击工程名LPC2148_Demo(不是工作区,不是文件,是工程节点),然后选择Options…。这是进入配置的唯一正道。如果误点了其他地方,配置将不生效。
弹出的Options对话框左侧是树状菜单,分为General Options、C/C++ Compiler、Linker、Debugger等大类。我们按手册顺序,只调整以下五处:
5.2 关键配置一:通用选项(General Options)里的“器件型号”
- 左侧树状菜单,点击
General Options - 右侧找到
Device下拉框,必须选择LPC2148(而不是LPC21xx或Generic ARM) - 为什么重要?IAR 会根据这个选择,自动加载对应的
LPC2148.h头文件、预定义宏(如__LPC2148__),并启用针对该芯片的优化。选错型号,#include "LPC2148.h"可能找不到,或者寄存器定义错位。
5.3 关键配置二:编译器优化级别(C/C++ Compiler → Optimization)
- 左侧点击
C/C++ Compiler→Optimization - 右侧
Level下拉菜单,推荐新手选Low(低) - 为什么不是
High?高优化会让编译器重排代码、内联函数、删除“无用”变量。这会导致调试时“单步执行”跳来跳去,变量值在 Watch 窗口里显示为<not accessible>。Low级别生成的代码最忠实于你的源码,方便你逐行验证逻辑,是学习阶段的“后悔药”。
5.4 关键配置三:头文件路径(C/C++ Compiler → Preprocessor)
- 左侧点击
C/C++ Compiler→Preprocessor - 右侧
Additional include directories输入框,添加你的工程文件夹路径:D:\MyIARProjects\LPC2148_Demo - 为什么?
main.c里写了#include "LPC2148.h",但LPC2148.h不在main.c同一目录,而在 IAR 安装目录的\arm\inc\下。IAR 默认会搜索安装目录,但为了保险,也为了以后添加自己的头文件(如led.h),把工程根目录加进去,是最简单直接的做法。
5.5 关键配置四:链接器脚本(Linker → Configuration)
- 左侧点击
Linker→Configuration - 右侧
Override default program勾选框,务必勾选 - 在下方
Configuration file输入框,点击Browse,找到并选择你之前复制的:D:\MyIARProjects\LPC2148_Demo\LPC2148_flash.xcl - 这是整个配置中最核心的一环。它告诉链接器:“请严格按照这个
.xcl文件里的地址规则,来安排我的代码和数据。” 漏掉这一步,链接器会用默认的通用脚本,程序大概率无法启动。
5.6 关键配置五:调试器驱动(Debugger → Driver)
- 左侧点击
Debugger→Driver - 右侧
Driver下拉菜单,选择RDI Driver - 然后点击下方
Configure按钮,弹出RDI Driver Configuration窗口 - 在
RDI DLL输入框,点击Browse,找到 H-JTAG 的安装目录(如C:\H-JTAG\),选择H-JTAG.dll - 在
Target interface下拉菜单,选择Wiggler(因为 SuperJTAG 是 Wiggler 协议兼容设备) - 点击
OK返回
这一步是连接物理世界的“握手协议”。
RDI Driver是 IAR 认识的“语言”,H-JTAG.dll是翻译官,Wiggler是翻译官要对接的“方言”。三者缺一不可。
5.7 常见问题排查:新手必踩的 5 个坑
提示:以下现象均基于手册所用的 H-JTAG + SuperJTAG 组合。如果你用的是其他调试器,请参考对应文档。
现象 1:点击Download and Debug后,提示 “No debug hardware found”
- 原因:H-JTAG 软件未运行,或并口线未插紧,或开发板未上电。
- 解决:先手动运行
H-JTAG.exe(桌面快捷方式),确保其状态栏显示Connected;检查并口线两端是否插牢;用万用表测开发板 VCC 是否为 3.3V。
现象 2:编译通过,但链接时报错Error[Li005]: no definition for "__vector_table"
- 原因:
cstartup.s79文件未添加到工程,或添加后未被识别(文件扩展名不是.s79)。 - 解决:在 Workspace 中确认
cstartup.s79存在;右键它 →Options→ 确认File type是Assembly file;若仍是文本文件,重命名后缀为.s79并重新添加。
现象 3:下载成功,但 LED 不亮,用示波器测 P0.2 无电平变化
- 原因:
main.c中PINSEL0配置错误。LPC2148 的 PINSEL 寄存器是 32 位,P0.2 对应 bit4-bit5,但新手常误写为PINSEL0 |= (0x01 << 2)(错把位号当引脚号)。 - 解决:对照
LPC214x User’s Manual第 178 页 PINSEL0 表格,确认 P0.2 的功能选择位是 bit4-bit5,代码应为<< 4。
现象 4:调试时单步执行,程序直接跳到0x00000000或0xFFFFFFFE
- 原因:
.xcl文件中 ROM 起始地址或中断向量表地址配置错误,导致复位向量指向了非法地址。 - 解决:打开
LPC2148_flash.xcl,查找define symbol __ICFEDIT_region_ROM_start__,确认其值为0x00000000;查找define symbol __ICFEDIT_intvec_start__,确认其值也为0x00000000。
现象 5:修改main.c后,点击Rebuild all,IAR 仍编译旧代码
- 原因:IAR 的增量编译机制有时会“缓存”旧文件,尤其当文件在外部编辑器(如记事本)中修改后未触发 IAR 重载。
- 解决:在 IAR 中,点击
Project→Clean,清空所有中间文件,再Rebuild all。养成习惯:代码修改后,先Clean再Rebuild。
6. 编译、下载与调试:跑通第一个例子,然后知道下一步学什么
现在,所有配置已完成,代码已添加,链接脚本已就位。是时候见证奇迹了。这个过程只有三步:编译链接、下载到板、调试验证。我们会把每一步的界面反馈、预期结果、失败时的自查点,全部拆解清楚。跑通之后,我会告诉你,从这个“点亮 LED”的起点,如何一步步走向 UART 通信、定时器中断、RTOS,而不至于迷失在庞杂的文档海洋里。
6.1 编译和链接:看懂 IAR 的输出窗口
在 IAR 主界面,点击顶部菜单Project→Rebuild all(或按快捷键Ctrl+Shift+B)。
- 预期现象:底部
Build窗口会滚动输出大量文字,最后以一行绿色文字结束:Information: Project successfully built. - 关键检查点:
- 查看
Build窗口最末尾几行,确认没有Error(红色)或Warning(黄色)。Warning如Warning[Pe188]: enumerated type mixed with another type可暂时忽略,但Error必须解决。 - 在
Build窗口上方,切换到Messages标签页,这里会列出所有警告和错误的详细位置(文件名、行号)。 - 成功后,在
D:\MyIARProjects\LPC2148_Demo\Debug\Exe\文件夹下,会生成一个LPC2148_Demo.bin(或.hex)文件,这就是能烧进芯片的“成品”。
- 查看
如果失败,不要慌。IAR 的错误信息非常精准。例如
Error[Li005]: no definition for "main",说明main()函数没被找到,立刻检查main.c是否添加、是否拼写为Main()(首字母大写);Error[Pa045]: undefined symbol "PINSEL0",说明LPC2148.h没被正确包含,检查头文件路径和#include语句。
6.2 下载程序到目标板:从 IAR 到物理世界
确保:
- H-JTAG 软件已运行,状态栏显示
Connected - SuperJTAG 硬件已通过并口连接电脑,JTAG 线缆已接好开发板,开发板已上电
- IAR 中
Debugger → Driver配置已正确指向H-JTAG.dll
点击顶部菜单Project→Download and Debug(或按Ctrl+D)。
- 预期现象:
Build窗口会再次滚动,显示Downloading...,然后出现Download successful。- IAR 界面会自动切换到调试视图,顶部工具栏出现
Go、Step Into、Break等按钮,左侧Register窗口显示当前 CPU 寄存器值(如PC=0x00000000,SP=0x40008000)。
- 验证成功:观察开发板,P0.2 对应的 LED 应该常亮。如果没亮,用万用表测 P0.2 对地电压,应为 3.3V。
如果提示
Failed to connect to target,立即检查 H-JTAG 状态、并口线、开发板供电。这是物理层问题,和代码无关。
6.3 代码调试:用“单步”看清每一行发生了什么
现在,程序已在芯片上运行,但while(1)让它停在了原地。我们用调试器“撬开”它,看看内部发生了什么。
- 在
main.c文件中,将光标放在FIO0SET = (1 << 2);这一行,按F9设置断点(行号左侧会出现红点)。 - 点击顶部工具栏的
Go按钮(绿色三角形),程序会运行到断点处暂停。 - 此时,
Register窗口中的FIO0SET寄存器值应为0x00000004(即 bit2 为 1)。 - 点击
Step Into(F7),进入下一行while(1),再点一次,程序会停在while(1)的大括号{上。 - 在
Watch窗口(View→Watch),右键 →Add watch,输入FIO0SET,即可实时监控该寄存
本文还有配套的精品资源,点击获取