5.2 IAR EWARM介绍
IAR Embedded Workbench for ARM 是IAR Systems 公司为ARM 微处理器开发的一个集成开发环境(下面简称IAR EWARM)。比较其他的ARM 开发环境,IAR EWARM 具有入门容易、使用方便和代码紧凑等特点。故在这里介绍给打算学习使用或正在使用ARM 芯片的朋友们共同探讨。
IAR Systems 公司目前推出的最新版本是IAR Embedded Workbench for ARM version 5.10,并提供一个32k 代码限制免费评估版。有兴趣的朋友可以到IAR 公司的网站ww.iar.com去寻找和下载。
IAR EWARM 中包含一个全软件的模拟程序(simulator)。用户不需要任何硬件支持就可以模拟各种ARM内核、外部设备甚至中断的软件运行环境。从中可以了解和评估IAR EWARM 的功能和使用方法。
我们编译整理的这本快速用户指南采用评估版软件安装目录D:\Program Files\IAR Systems\Embedded Workbench 4.0 Kickstart\arm\examples\ST\STM32F10x\FWLib 下的教程为例,一步一步介绍 IAR EWARM 的使用方法。该教程采用了3个C语言程序,GPIO_Test.c 、stm32f10x_gpio.c和stm32f10x_rcc.c。在以后的章节里,我们将具体介绍EWARM 软件及配套硬件工具、如何使用EWARM 集成开发环境以及在EWARM 下烧写Flash 的方法。
5.2.1 EWARM集成开发环境及配套仿真器
IAR Embedded Workbench for ARM version 4.42是一个针对ARM处理器的集成开发环境,包含项目管理器、编辑器、编译连接工具和支持RTOS的调试工具,在该环境下可以使用C/C++和汇编语言方便地开发嵌入式应用程序。IAR EWARM的主要模块如下:
项目管理器
功能强大的编辑器
高度优化的IAR ARM C/C++ Compiler
IAR ARM Assembler
1个通用的IAR XLINK Linker
IAR XAR和XLIB建库程序和IAR DLIB C/C++运行库
IAR C-SPY调试器(先进的高级语言调试器)
命令行实用程序
2.IAR J-Link 仿真器简介
IAR J-Link是IAR为支持仿真ARM内核芯片推出的JTAG方式仿真器。配合IAR EWARM集成开发环境支持所有ARM7/ARM9内核芯片的仿真,无需安装任何驱动程序与EWARM集成开发环境无缝连接,操作方便、连接方便、简单易学是学习开发ARM最好最实用的开发工具。
① J-Link ARM 主要特点
IAR EWARM集成开发环境无缝连接的JTAG仿真器
支持所有ARM7/ARM9内核的芯片,包括Thumb模式
下载速度高达600 kB/s
最高JTAG速度12 MHz
目标板电压范围1.2V – 3.3V
自动速度识别功能
监测所有JTAG信号和目标板电压
完全即插即用
使用USB电源
带USB连接线和20芯扁平电缆
支持多JTAG器件串行连接
标准20芯JTAG仿真插头
选配14芯JTAG仿真插头
选配用于5V目标板的适配器
带J-Link TCP/IP server,允许通过TCP/ IP网络使用J-Link
② IAR J-Link 的物理连接
J-LINK一端通过USB口与PC连接,另一端通过标准20芯JTAG插头与目标板连接。建议首先连接J-LINK到PC,再连接J-LINK到目标系统,最后给目标系统供电(如果目标系统为独立供电、而非由J-TAG口供电的情况)。
③ IAR J-Link 主要技术指标如表5.1所示。

目标板5V电源适配器选件
当目标系统为5V电源系统时,必须使用J-LINK提供的5V电源适配器选件。对于1.2V~3.3V电源系统,可以直接使用J-Link。使用时将适配器的20④芯IDC插头插进J-Link的20芯插座,再将连接目标的20芯扁平电缆插进适配器的插座。

5V适配器选件由目标供电(3.3V~ 5V),电流<20mA,有一个LED指示电源状态。
⑤ JTAG插头定义
J-Link的JTAG 20芯的IDC插头与ARM公司的仿真器插头定义兼容,有关定义如表5.2所示:


⑥ JTAG速度
J-Link有两种速度设置,即固定JTAG速度、自动JTAG速度,该功能选项位于Project Options -> Debugger -> J-Link设置页面中。
固定JTAG速度
目标被锁定在固定时钟速度。目标能执行的最大JTAG速度取决于目标自身。一般来讲,不带JTAG同步逻辑的ARM内核(如ARM7-TDMI)能执行与CPU速度相当的JTAG速度。而带JTAG同步逻辑的ARM内核(例如ARM7-TDMI-S,ARM946E-S,ARM966EJ-S)能执行相当CPU速度1/6的JTAG速度。JTAG速度不应超过10 MHz。
自动JTAG速度
由TAP控制器选择最大的JTAG速度。要注意,不带同步逻辑的ARM内核可能会工作不稳定。因为CPU内核时钟可能慢于最大JTAG速度。
5.2.2 在EWARM中生成一个新项目
EWARM是按项目进行管理的,它提供了应用程序和库程序的项目模板。项目下面可以分级或分类管理源文件。允许为每个项目定义一个或多个编译连接(build)配置。在生成新项目之前,必须建立一个新的工作区(Workspace)。一个工作区中允许存放一个或多个项目。
另外用户最好建立一个专用的目录存放自己的项目文件。例如在本例中我们生成一个D:\Program Files\IAR Systems\Embedded Workbench 4.0\ Kickstart\arm\examples\ST
\STM32F10x\FWLib\My project目录。现在双击桌面上的IAR Embedded Workbench图标,出现IAR EWARM开发环境窗口。
1.生成新的工作区(Workspace)
选择主菜单 File > New > Workspace生成新工作区。
2. 生成新项目
① 选择主菜单 Project > Create New Project,弹出生成新项目窗口,见图5.31。
本例选择项目模板(Project template)中的Empty project。

② 在Tool chain栏中选择ARM,然后点击OK按钮。
③ 在弹出的另存为窗口中浏览和选择新建的My project目录,输入文件名project1,然后保存。这时在屏幕左边的Workspace窗口中将显示新建的项目名。见图5.32所示:

IAR EWARM提供两种缺省的项目生成配置,即Debug和Release。本例在Workspace窗口顶部的下拉菜单中选取Debug。现在My project目录下已生成一个project1.ewp文件。该文件中包含与project1项目设置有关的信息,如build选件等。项目名后缀上的*号表示该工作区有改变但还没有被保存。
④ 保存工作区
先选择主菜单 File > Save Workspace,浏览并选择My project目录,然将工作区取名为GPIO_Test输进File name输入框,按保存按钮退出。这时在My project目录下将生成一个GPIO_Test.eww文件,该文件中保存了用户添加到GPIO_Test工作区中的所有项目。窗口和断点放置等与当前操作有关的其他信息则被存储在My project\ settings目录下的文件中。
3. 给项目添加文件组
IAR EWARM允许生成若干个源文件组。用户可以根据项目需要来组织自己的源文件。
① 在Workspace中选择希望添加文件的目的地,可以是项目或源文件组。本例直接选project1。
② 选择主菜单 Project > Add Group打开标准浏览窗口,见图5.33。

本示例向project1中添加3个工作组Application(用户代码文件放在该组)、EWARM(Cortexm3内核指令文件放在该组)、FWLib(STM3F1XX的库文件),如图5.34所示。

③给文件组添加文件
由于接下来的几个文件中包含一个名为stm32f10x_conf.h的头文件,所以用户先将其拷贝到My project目录下。可以从\IAR Systems\Embedded Workbench 4.0 Kickstart\arm\examples\ST\STM32F10x\FWLib\project文件夹下找到该文件。
Application文件组
选择File > New > File,创建一个.c文件,默认为Untitled1.c,在GPIO_Test.c下编写代码,如图5.35所示:

选择主菜单File > Save或者单击工具栏上的保存按钮,将其改名为GPIO_Test.c,保存到My Project文件夹下,然后选择Application文件组,右键后选择Add > Add Files,将刚才保存的GPIO_Test.c文件添加进Application文件组,添加完后如图5.36所示:

EWARM文件组
需要往该文件组添加一个Cortex M3内核指令文件:用户可以从\IAR Systems\Embedded Workbench 4.0 Kickstart\arm\examples\ST\STM32F10x\FWLib\project\EWARM文件夹下找到一个名为cortexm3_macro.s的文件,将其拷贝到刚才创建的My Project文件夹下,然后选择EWARM文件组,右键后选择Add > AddFiles,将cortexm3_macro.s文件添加到EWARM文件组,添加完后如图5.37所示:

FWLib文件组
需要往该文件组添加我们所用到的一些库文件。我们在该示例中做一个简单的GPIO测试,所以需要将stm32f10x_gpio.c(定义了GPIO的操作函数)和stm32f10x_rcc.c(定义了关于时钟的操作函数)两个库文件添加进来,这两个文件在\IAR Systems\Embedded Workbench 4.0 Kickstart\arm\examples\ST\STM32F10x\FWLib\library\src文件夹下可以找到,添加完后如图5.38所示:

4. 设置项目选件
生成新项目和添加文件后就应该为项目设置选件。IAR EWARM允许为任何一级目录和文件单独设置选件,但是用户必须为整个项目设置通用的编译连接(build)选件。
① 选择通用选件
选中Workspace中的project1 – Debug,然后选择主菜单Project > Options。也可以先选择project1 – Debug,然后选择鼠标右键命令中的Options。
在打开的Options窗口左边的Category中选择General Options,如图5.39所示:

然后分别在:
- Target页面/Core条目下选择Cortex-M3, Device条目下选择ST STM32F10x
- Output页面中,Output file条目下选择Executable
- Library Configuration页面中,Library条目下选择Normal
② 选择编译器选件
在Options窗口的Category中选择C/C++ Compiler,见图5.40:

然后在:
- Language页面中,选择C,Allow IAR extensions等
- Output页面中,选择Generate debug informat
- List页面中,选择Output list file。并选择Assembler mnemonics和Diagnostics
- Preprocessor页面的Additional include directories: (one per line)文本框中输入我们用到的几个头文件的路径,如图5.41所示:

因为我们在前面已经将stm32f10x_conf.h放在了My project 下所以用“$PROJ_DIR$\”就可以将其包含进来,其余的两个文件stm32f10x_gpio.h和stm32f10x_rcc.h可以通过“$PROJ_DIR$\..\library\inc”找到,表示这两个头文件在当前工程的上一级目录下的library文件夹下的inc文件夹里面。
5.1.1 编译和连接应用程序
这一步编译和连接(build)项目程序,同时生成一个编译器列表文件(compiler list file)和一个连接器存储器分配文件(linker map file)。
1.编译源文件
① 选中workspace中GPIO_Test.c文件。
② 选择主菜单Project > Compile,或工具条中的Compile按钮,或按右键后选择Compile命令。编译结束后在消息窗口中出现如图5.42中的信息。
编译和连接应用程序

编译完成后在My project目录下将生成一批新子目录。因为我们在建立新项目时选择Debug配置,所以在My project目录下自动生成一个Debug子目录。Debug子目录下又包含另3个子目录,名字分别为List、Obj、Exe。它们的用途如下:
List目录存下放列表文件,列表文件的后缀是lst;
Obj目录下存放Compiler和Assembler生成的目标文件,这些文件的后缀为r79,可以用作IAR XLINK连接器的输入文件;
Exe目录下存放可执行文件,这些文件的后缀为d79,可以用作J-link仿真器的输入文件,注意在执行连接处理之前这个目录是空的。
点击project1 – Debug前面的+号将目录展开。你可以从自动生成的Output目录中看到所有生成的输出文件名以及反映相互依赖关系的头文件名,见图5.43。

2.连接应用程序
① 先选中Workspace窗口中的Project1 – Debug,然后选择主菜单Project > Options,弹出Options对话窗口,见图5.44。在左边的Category中选择Linker,显示IAR XLINK的各选件页面。

本例全部采用缺省的连接处理选件。但是仍需要强调一下输出文件格式和Linker命令行文件的选择方法:
输出格式
选择合适的输出格式十分重要。你可能需要将输出文件送给一个调试器进行调试,这时就要求输出格式带有调试信息。如果采用适合C-SPY调试器的缺省输出选件,则选择Debug information for C-SPY、With runtime control modules和With I/O emulation modules,指示需要连接将stdin和stdout指向C-SPY的I/O窗口的低级例程。
如果用户希望把应用下载到一个PROM或Flash编程器,则其输出格式不需要带调试信息,如Intel-hex或Motorola S-records。
EWARM在生成适合C-SPY调试器的缺省输出文件的同时,还可以生成第二个输出文件,供编程器或其他调试器使用。第二个输出文件的格式可以在Extra Output页面中选择。
在List页面中选择Generate linker listing和Segment map(见图5.45),允许生成存储器分配MAP文件。

连接器命令文件(Linker Command File)包含了连接器的各项命令行参数,主要用于控制代码段和数据段在存储器中如何分布。本例使用的连接命令文件lnkarm_flash.xcl可以在\IAR Systems\Embedded Workbench 4.0\Kickstart\ arm\examples\ST\STM32F10x\FWLib \project\EWARM文件夹下找到,我们将其拷贝到自己的文件夹My project中,然后在Category中选择Linker,然后选择Config选项,在Linker command file中添加lnkarm_flash.xcl的路径“$PROJ_DIR$\lnkarm_flash.xcl”。 请见图5.46中的Config页面。

② 点击OK按钮保存IAR XLINK选件
③ 选择主菜单Project > Make或鼠标右键Make命令,连接目标文件,生成可执行代码。
Build消息窗口中将显示连接处理的消息。
5.2.4 用J-link调试应用程序
在调试开始之前,请用J-link将STM32F103C开发板和PC机上的USB接口连接好,并且把开发板的电源接上。
硬件连接好以后还必须设置几个选件,具体操作如下:
①选择主菜单Project > Option,选择Category中的Debugger。在Setup页面,在Driver的下拉菜单中选择J-link/J-trace,同时选择Run to main,如图5.47所示,点击OK。

② 在Download页面中勾选User flash loader如图5.48所示:

③ 选择主菜单Project > Debug或工具条上的Debugger按钮。J-link将开始装载project1.d79。装载结束后的窗口如图5.49显示。

2.检查源语句
① 检查源语句,双击Workspace中的GPIO_Test.c;
② 在编辑器显示文件GPIO_Test.c 后,用Debug > Next Statement命令或工具栏的Next Statement 按钮步进到RCC_APB2PeriphClockCmd函数调用语句。
③ 用Debug > Step Into命令(或F11)进入函数RCC_APB2PeriphClockCmd;
注:Next Statement命令用来执行源程序中的一条语句,即使这条语句是一函数调用语句,还有Step Over命令用来源程序中的一条语句或一条指令。而Step Into命令则进入到函数或子程序调用的内部。
当执行Step Into后,活跃窗口已经切换到stm32f10x_rcc.c,因为RCC_APB2PeriphClockCmd函数在这个文件里。
④ 用Debug > Step Out命令(或者Shift+F11)可以跳出函数,回到GPIO_Test.c继续用Next Statement执行下一条语句。
如果用户想直接观看程序运行的结果,则用Debug > Go命令(或者F5),在STM32F103C
开发板上可以看到L3灯在不停的闪烁。
3.设置和监视断点
设置断点最简单的方法是将光标定位到某条语句,然后按鼠标右键选择Toggle Breakpoint命令(或者F9)。实验方法如下:
① 设置断点
例如如果需要在main( )函数的GPIO_WriteBit( )语句上设置断点,首先在编辑器窗口显示GPIO_Test.c,点击要设置断点的语句,选择主菜单Edit > Toggle Breakpoint。也可以按工具条上的Toggle Breakpoint按钮。这时该语句上将出现断点标记,如图5.50所示。

② 执行到断点
选择主菜单Debug > Go或者工具条上的Go按钮都可以让程序执行到断点。
③ 消除断点
可用主菜单Edit > Toggle Breakpoint或按鼠标右键选择Toggle Breakpoint。
4.在反汇编窗口上调试
通常,在C\C++程序上调试应该更快速和更直接。但是如果用户希望在反汇编程序上调试,也是可以的,反汇编程序的调试方法如下:
① 按Reset按钮复位应用程序。
② 调试时反汇编窗口通常是打开的。如果没打开可选择主菜单View > Disassembly打开反汇编窗口。

反汇编窗口如图5.51所示。可以看到汇编代码与C语句一一对应。用上面介绍的几种单步命令执行程序观察结果。
5.监视变量值
设置一个Watchpoint,利用Watch窗口查看变量。
选择View > Watch打开Watch窗口, 点击Watch窗口中的虚线框,在输入区输入变量i,然后按Enter键。利用上面介绍的几种单步命令,可以观察到i值的变化情况。

6.监视寄存器
寄存器窗口允许用户监视和修改CPU寄存器以及各外设寄存器的内容。具体方法如下:
① 选择主菜单View > Register打开寄存器窗口,见图5.53。

② 用Step Over命令执行下一条指令,观察寄存器窗口中的数据如何变化,发生了变化的寄
存器以及变化了位都会以红色字体显示。
③ 关闭寄存器窗口。
7.察看存储器
用户可以在存储器窗口监视所选择的存储器区域。下面是检查与变量GPIOC有关的存储器内容。
① 选择主菜单View >Memory打开存储器窗口,见图5.54(用8-bit显示数据)。
② 激活GPIO_Test.c窗口并双击变量GPIOC。用鼠标将其拖到存储器窗口。
③ 如果希望以16-bit显示数据,在存储器窗口顶部最右边的下拉菜单中选择2x Units命令。
执行单步,同时观察存储器的内容是如何修改的。用户可以在存储器窗口修改存储单元的内容。只需把插入点放在希望修改的地方,然后输入新值就可以了。
④ 关闭存储器窗口。



