任务3 工程创建与调试
本任务重点学习IAR for ARM开发环境和在线调试,掌握STM32开发环境的搭建和调试。
3.1 开发场景:如何进行项目开发
要将STM32微处理器真正地使用起来,就必须编写程序并将程序烧录到芯片中。但芯片程序的编写与烧录涉及IDE开发环境的使用。STM32F407VET6微处理器使用的是IAR for ARM开发环境,用户可在这个开发环境下创建STM32F407VET6微处理器工程,通过下载器可将程序下载到单片机中,使用IAR for ARM开发环境的程序调试工具实现STM32F407VET6微处理器程序的在线调试。通过在线调试得到逻辑功能正确的代码后就可以将其固化到单片机中长期运行了。STM32F407VET6微处理器使用的J-Link仿真器如图3.1所示。
图3.1 J-Link仿真器
3.2 开发目标
(1)知识要点:IAR for ARM开发环境的工程建立;IAR for ARM开发环境的程序在线调试。
(2)技能要点:熟悉STM32F407VET6微处理器的工程创建;掌握STM32F407VET6微处理器的代码在线调试;掌握IAR for ARM开发环境中的开发工具。
(3)任务目标:通过使用IAR for ARM开发环境对STM32微处理器(STM32F407VET6)工程进行在线调试;通过使用IAR for ARM开发环境查看STM32微处理器寄存器参数。
3.3 原理学习:软件开发环境
3.3.1 IAR for ARM开发环境
1.IAR for ARM简介
IAR是一家公司的名称,也是一种开发环境的名称,我们平时所说的IAR主要是指开发环境。IAR公司的发展也是经历了一系列历史变化,从开始针对8051研制C编译器,逐渐发展至今,已经是一家庞大的、技术力量雄厚的公司。而IAR集成开发环境也是从单一的到现在针对不同的微处理器,拥有多种IAR版本的开发环境。
本任务主要讲述IAR for ARM开发环境,IAR拥有多个版本,支持的芯片达上万种,针对不同内核微处理器,IAR有不同的开发环境,IAR开发环境工具版本如图3.2所示。
图3.2 IAR开发环境工具版本
IAR for ARM其实是IAR Embedded Workbench for ARM,即嵌入式工作平台,在有些地方也会看见IAR EWARM,其实它们都是同一个开发环境工具软件,只是叫法不一样而已。与其他的ARM开发环境相比,IAR EWARM具有入门容易、使用方便和代码紧凑等特点。
IAR EWARM的主要组成包括:高度优化的IAR ARM C/C++ Compiler;IAR ARM Assembler;一个通用的IAR XLINK Linker;IAR XAR和XLIB建库程序,以及IAR DLIB C/C++运行库;功能强大的编辑器;项目管理器;命令行实用程序;IAR C-SPY调试器(先进的高级语言调试器)。
IAR for ARM支持的器件包含Cortex-A、Cortex-R、Cortex-M系列等多达几千种,具体可以到IAR官方网站查看。IAR支持的芯片厂家如图3.3所示。
图3.3 IAR支持的芯片厂家
2.IAR for ARM的安装
IAR for ARM集成开发环境的安装比较简单,按照安装向导即可完成安装操作,具体如下。
(1)解压。双击安装包,进入准备安装(解压)界面,如图3.4所示。
(2)进入安装就绪界面,如图3.5所示,选择“Install IAR Embedded Workbench”。
图3.4 准备安装(解压)界面
图3.5 安装就绪界面
(3)进入安装向导界面,如图3.6所示,按照提示单击“Next”按钮进行后续安装。
(4)IAR for ARM工具安装成功后,软件启动界面如图3.7所示。
图3.6 安装向导界面
图3.7 软件启动界面
3.3.2 STM32标准函数库
1.STM32标准外设库
学习STM32最好的方法是使用软件库,然后在软件库的基础上了解底层,学习寄存器。软件库是指“STM32标准函数库”,它是由ST公司针对STM32提供的应用程序(函数)接口(Application Program Interface,API),开发者可调用这些API来配置STM32的寄存器,使开发人员得以无须关心最底层的寄存器操作,具有开发快速、易于阅读、维护成本低等优点。
用户在调用软件库的API时不需要了解库底层的寄存器操作,实际上,库是架设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口。软件库开发方式与直接配置寄存器方式的区别如图3.8所示。
图3.8 开发方式的区别
在8位机时代的程序开发中,一般采用直接配置芯片寄存器的方式来控制芯片的工作方式,如中断、定时器等。在配置时,常常要查阅寄存器表,查用到的配置位,为了配置某功能,将相关配置位置1或清0,这些都是很琐碎的、机械的工作。因为8位机的软件相对来说比较简单,而且资源很有限,所以可以采用直接配置寄存器的方式来进行开发。
STM32微处理器的外设资源丰富,带来的必然是寄存器的数量和复杂度的增加,而且为开发者提供了非常方便的开发库(软件库)。到目前为止,有标准外设库(STD)、HAL库、LL库三种,前两者都是常用的库,LL库是ST公司最近才添加的。
标准外设库(Standard Peripherals Library,STD)是对STM32芯片的一个完整的封装,包括所有标准器件外设的驱动器,这是目前使用最多的软件库,几乎全部使用C语言实现。但是,标准外设库也是针对某一系列芯片而言的,没有可移植性。
相对于HAL库,标准外设库仍然接近于寄存器操作,主要任务是将一些基本的寄存器操作封装成了C函数。
ST公司为各系列微处理器提供的标准外设库稍微有些区别。例如,STM32F1x的标准外设库和STM32F3x的标准外设库在文件结构上就有些不同,此外,在内部的实现上也稍微有些区别,这个在具体使用(移植)时,需要特别注意。但是,不同系列之间的差别并不是很大,而且在设计上是相同的。
STM32微处理器标准外设库下载方式为:登录ST官网,根据芯片型号下载对应的标准外设库(如芯片为STM32F103ZE,则下载对应的STM32F10x_StdPeriph_Lib),如图3.9所示。
2.CMSIS标准
为了让不同的芯片公司生产的Cortex芯片能在软件上基本兼容,ARM公司和芯片生产商共同提出了CMSIS(Cortex Microcontroller Software Interface Standard),即ARM Cortex微处理器软件接口标准。基于CMSIS的应用程序基本结构如图3.10所示。
图3.9 STM32微处理器标准外设库的下载
图3.10 基于CMSIS的应用程序基本结构
CMSIS包括3个基本功能模块。
· 内核外设函数:由ARM公司提供,定义微处理器内部寄存器地址及功能函数。
· 中间件函数:定义访问中间件的通用API,由ARM提供,芯片厂商根据需要更新。
· 器件级外设函数:定义硬件寄存器的地址及外设的访问函数。
从图3.10可以看出,CMSIS层在整个应用程序基本结构中处于中间层,向下负责与内核和各个外设直接打交道,向上为实时操作系统用户提供程序调用的函数接口。如果没有CMSIS,芯片公司就会设计自己喜欢的风格的库函数,而CMSIS就是要强制规定,芯片生产公司的库函数必须按照CMSIS来设计。
3.库目录与文件
ST公司官方提供的STM32F4固件库包的结构如图3.11所示。
图3.11 STM32F4固件库包的结构
1)库目录
Libraries文件夹下面有CMSIS和STM32F4xx_StdPeriph_Driver两个目录,这两个目录包含固件库核心的所有子文件夹和文件。
CMSIS文件夹存放的是符合CMSIS的一些文件,包括STM32F4核内外设访问层代码、DSP软件库、RTOS API,以及STM32F4片上外设访问层代码等。新建工程时可从从这个文件夹中复制一些文件到工程。
STM32F4xx_StdPeriph_Driver存放的是STM32F4标准外设固件库源码文件和对应的头文件,inc目录存放的是stm32f4xx_ppp.h头文件,无须改动;src目录下面放的是stm32f4xx_ppp.c格式的固件库源文件。每一个.c文件(固件库源文件)和一个.h文件(头文件)相对应,这些文件也是外设固件库的关键文件,每个外设对应一组文件。
Libraries文件夹里面的文件在建立工程时都会使用到。
Project文件夹下面有两个文件夹:STM32F4xx_StdPeriph_Examples文件夹下面存放的是ST公司提供的固件实例源码,在以后的开发过程中,可参考修改这个由官方提供的实例来快速驱动自己的外设;STM32F4xx_StdPeriph_Templates文件夹下面存放的是工程模板。
Utilities文件夹存放的是官方评估板的一些对应源码。
根目录中还有一个STM32F4xx_dsp_StdPeriph_lib_um.chm文件,这是一个固件库的帮助文档。
2)关键文件
首先来看一个基于固件库的STM32F4工程需要哪些关键文件,文件之间有哪些关联关系。STM32F4固件库文件之间的关系如图3.12所示,其实这个可以从ST提供的英文版的STM32F4固件库说明里面找到。
图3.12 STM32F4固件库文件关系图
core_cm4.h文件位于“\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Include”目录下,是CMSIS的核心文件,提供Cortex-M4内核接口。
stm32f4xx.h和system_stm32f4xx.h文件存放在文件夹“\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Device\ST\STM32F4xx\Include”下面。
system_stm32f4xx.h是片上外设接入层系统头文件,主要用于声明设置系统及总线时钟相关的函数。与其对应的源文件system_stm32f4xx.c在目录“\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Project\STM32F4xx_StdPeriph_Templates”可以找到。这个文件里面有一个SystemInit()函数声明,在系统启动时会调用这个函数,用来设置整个系统和总线时钟。
stm32f4xx.h是STM32F4片上外设访问层头文件。在进行STM32F4开发时,几乎时刻都要查看这个文件相关的定义。打开这个文件可以看到,里面非常多的结构体及宏定义,这个文件主要是系统寄存器定义声明以及包装内存操作,同时该文件还包含了一些时钟相关的定义,如FPU和MPU单元开启定义、中断相关定义等。
stm32f4xx_it.c、stm32f4xx_it.h及stm32f4xx_conf.等文件可在“\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Project\STM32F4xx_StdPeriph_Templates”文件夹中找到,这几个文件在新建工程时也会用到。stm32f4xx_it.c和stm32f4xx_it.h用来编写中断服务函数,中断服务函数也可以随意编写在工程里面的任意一个文件里面。stm32f4xx_conf.h是外设驱动配置文件,打开该文件可以看到很多#include,在建立工程时可以注释掉一些不用的外设头文件。
misc.c、misc.h、stm32f4xx_ppp.c、stm32f4xx_ppp.h、stm32f4xx_rcc.c和stm32f4xx_rcc.h文件存放在目录“Libraries\STM32F4xx_StdPeriph_Driver”下,这些文件是STM32F4标准的外设库文件,其中misc.c和misc.h用于定义中断优先级分组以及Systick定时器相关的函数;stm32f3xx_rcc.c和stm32f4xx_rcc.h包含与RCC相关的一些操作函数,主要作用是一些时钟的配置和使能,在任何一个STM32工程中,RCC相关的源文件和头文件是必须添加的。
stm32f4xx_ppp.c和stm32f4xx_ppp.h文件是STM32F4标准外设固件库对应的源文件和头文件,包括一些常用外设GPIO、ADC、USART等。
Application.c文件实际就是应用层代码,工程中直接取名为main.c。
一个完整的STM32F4的工程光有上面这些文件还是不够的,还需要非常关键的启动文件。STM32F4的启动文件存放在目录“\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm”下。不同型号的STM32F4对应的启动文件也不一样,如果使用STM32F407微处理器,则选择的启动文件为startup_stm32f40_41xxx.s。
启动文件主要是进行堆栈之类的初始化,中断向量表和中断函数的定义。启动文件要引导进入main函数。Reset_Handler中断函数是唯一实现了的中断处理函数,其他的中断函数基本都是死循环。在系统启动时会调用Reset_handler,下面是调用Reset_handler的代码。
这段代码的作用是在系统复位之后引导进入main函数,在进入main函数之前首先要调用SystemInit系统初始化函数。
4.库函数简介
库函数是STM32的库文件中编写好的函数接口,开发时可以调用这些库函数对STM32进行配置,达到控制目的。用户可以不知道库函数是如何实现的,但必须要知道函数的功能、可传入的参数及其意义,以及函数的返回值,所以学会查阅库帮助文档是很有必要的,库帮助文档如图3.13所示。
层层打开文档的目录“Modules\STM32F4xx_StdPeriph_Driver\”,可看到STM32F4xx_StdPeriph_Driver标签下有很多外设驱动文件的名字,如MISC、ADC、BKP、CAN等。
如果要查看GPIO的位设置函数GPIO_SetBits,可以打开“Modules\STM32F4xx_StdPeriph_Driver\GPIO\Functions\GPIO_SetBits”,如图3.14所示。
图3.13 库帮助文档
图3.14 位设置函数GPIO_SetBits
GPIO_SetBits的函数原型为
它的功能是:输入一个类型为GPIO_TypeDef的指针GPIOx参数,选定要控制的GPIO端口;输入GPIO_Pin_x宏,其中x指端口的引脚号,指定要控制的引脚。其中输入的参数GPIOx为ST标准库中定义的自定义数据类型。
STM32F407有非常多的寄存器,配置起来会有些难度,为此ST公司提供了对STM32微处理器的寄存器进行操作的库函数。当需要配置寄存器或者读取寄存器时,只需要调用这些库函数就可以快速开发程序了。在调用库函数之前,需要将这些库函数添加到工程中。
5.创建工程文件
(1)新建一个文件夹Template,在此文件夹下新建三个文件夹Libraries、Project、Source,其中Libraries文件夹用于放置ST官方提供的STM32F407库文件,Project用于放置IAR for ARM集成开发环境产生的系统工程文件,Source文件夹下用于放置用户自己编辑的用户代码文件,同时用户代码功能的细分可在该文件夹下完成,如图3.15所示。
(2)在Libraries文件中添加库文件,找到STM32F407库文件包STM32F4xx_DSP_StdPeriph_Lib_V1.4.0,解压后打开如图3.16所示,其中_htmresc文件夹中放置的是意法半导体图标,Libraries文件夹中放置的是STM32的库文件,Project文件夹中放置的是官方提供的代码例程,Utilities文件夹中放置的是官方提供的系统工程样板,stm32f4xx_dsp_stdperiph_lib_um.chm为库函数手册。
打开Libraries文件夹,将文件夹下的CMSIS和STM32F4xx_StdPeriph_Driver复制到刚才新建的“Template/Libraries”文件加下。
打开Project文件夹,将STM32F4xx_StdPeriph_Templates文件夹下的stm32f4xx_conf.h、stm32f4xx_it.c、stm32f4xx_it.h复制到刚才新建的“Template/Libraries”文件夹下,如图3.7所示。
图3.15 新建文件夹
图3.16 STM32F407库文件包目录下的文件
图3.17 添加库文件到项目目录
经过上述步骤后就完成了基本的工程文件部署。
6.创建项目工程
(1)打开IAR for ARM,选择菜单“File→New→Workspace”即可新建一个工作空间,如图3.18所示。
(2)选择菜单“Project→Create New Project”,弹出“Create New Project”对话框,在“Tool chain”选项中选择“ARM”,单击“OK”按钮,如图3.19所示。
图3.18 新建一个工作空间
图3.19 选择微处理器架构类型
(3)输入文件名为template,保存到新建的“Template\Project”文件夹内。
(4)在工程中创建工程文件目录,单击鼠标右键选择“template→Debug”,在弹出的菜单中选择“Add→Add Group...”,在STM32F4工程中建立Libraries、Source两个文件夹,分别用于放置库文件和用户文件;在Libraries文件夹下分别建立CMSIS、FWLIB、STARTUP三个文件夹,用于放置库文件,如图3.20所示。
图3.20 工程中创建工程文件目录
(5)添加官方库文件到工程目录中。右键单击“CMSIS”,在弹出的菜单中选择“Add→Add Files”,进入创建的Template文件夹,将“Template\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates”下的system_stm32f4xx.c添加到工程目录CMSIS中;右键单击“FWILB”,在弹出的菜单中选择“Add→Add Files”,进入创建的Template文件夹,将“Template\Libraries\STM32F4xx_StdPeriph_Driver\src”下的所有.c添加到工程目录FWLIB中;右键单击“STARTUP”,在弹出的菜单中选择“Add→Add Files”,将“Template\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\iar”下的startup_ stm32f40xx.s添加到工程目录STARTUP中,如图3.21所示。
图3.21 添加官方库文件到工程目录
将FWLIB文件夹中的stm32f4xx_fmc.h禁止。右键单击“stm32f4xx_fmc.h”,在弹出的菜单中选择“Option”,勾选左上角的“Exclude from build”,单击“OK”按钮即可完成禁止设置,如图3.22所示。
禁止完成后,该文件将变为灰色,如图3.23所示。
(6)添加主函数,单击开发环境左上角的“”,选择菜单“File→Save As”,将文件保存到Source文件夹下,命名为main.c,然后单击“Save”按钮,即可将“Template\Source”内的main.c添加到工程目录Source中,添加完成的后工程文件目录如图3.24所示。
图3.22 禁止FWLIB文件夹中的stm32f4xx_fmc.h
图3.23 禁止设置完成效果
图3.24 添加main.c后的工程文件目录
(7)在main.c文件中添加有效代码段,在main.c文件中输入下列内容。
至此完成工程项目创建。
7.配置工程参数
(1)选择芯片型号。选择工程(选择菜单“Template→Debug”),单击鼠标右键后在弹出的菜单中选择“Options”,在“Target”标签下的“Device”处选择“ST STM32F407VE”,如图3.25所示。
(2)设置printf输出格式。将“Library Options”标签下的“Printf formatter”和“Scanf formatter”均配置为“Large”,如图3.26所示。
图3.25 选择芯片型号
图3.26 设置printf输出格式
(3)配置头文件位置。配置头文件的位置为“C/C++ Complier→Preprocessor”,如图3.27所示。
选择好地址后通过箭头选择文件目录为相对目录,如图3.28所示。
图3.27 配置头文件位置
图3.28 选择头文件目录
位置如下:
· Template\Source;
· Template\Libraries;
· Template\Libraries\STM32F4xx_StdPeriph_Driver\inc;
· Template\Libraries\CMSIS\Device\ST\STM32F4xx\Include;
· Template\Libraries\CMSIS\Include。
配置完成后的头文件目录如图3.29所示。
(4)配置项目宏。在“C/C++ Complier→Preprocessor”下的“Defined symbols”中添加库函数外设驱动宏定义“USE_STDPERIPH_DRIVER”和芯片内核宏定义“STM32F40XX”,如图3.30所示。
图3.29 配置完成后的头文件目录
图3.30 配置项目宏
(5)配置项目输出文件。在“Output Converter→Output”中配置输出为.Hex文件,如图3.31所示。
(6)配置系统链接文件。在“Linker→Config”中勾选“Override default”项,如图3.32所示。
图3.31 配置项目输出文件
图3.32 配置系统链接文件
(7)配置系统调试工具。在“Debugger→Steup”中配置“Driver”为“J-Link/J-Trace”工具,如图3.33所示。
配置程序下载过程中的相关操作:在“Debugger→Download”中勾选“Verify download”和“Use flash loader(s)”,如图3.34所示。
图3.33 配置系统调试工具
图3.34 配置程序下载选项
(8)配置J-Link下载器使用模式。在“J-Link/J-Trace”中将“Connection”中的“Interface”选项配置为“SWD”,单击“OK”按钮即可完成配置,如图3.35所示。
(9)配置验证。单击“”图标编译工程文件并将工作空间保存到“Template/Project”文件夹中,命名为template,保存完成后IAR将编译工程,编译成功后“Build”窗口中将显示无错误、无警告,如图3.36所示。
图3.35 配置J-Link下载器使用模式
图3.36 编译工程文件
将程序下载到开发平台中可以看到LED3和LED4点亮。
3.3.3 IAR ARM开发环境的使用
1.主窗口界面
IAR默认的主窗口界面如图3.37所示。
图3.37 IAR默认主窗口界面
(1)Menu Bar(菜单栏):该工具栏是IAR比较重要的一个部分,里面包含IAR的所有操作及内容,注意,在编辑模式和调试模式下存在一些不同。
(2)Tool Bar(工具栏):该工具栏是一些常见的快捷按钮,本书后面会讲述。
(3)Workspace Window(工作空间窗口):一个工作空间可以包含多个工程,该窗口主要显示工作空间下工程项目的内容。
(4)Edit Window(编辑窗口):代码编辑区域。
(5)Message Window(信息窗口):该窗口包括编译信息、调试信息、查找信息等窗口。
(6)Status Bar(状态栏):主要包含错误警告、光标行列等状态信息。
2.工具栏
工具栏其实就是在主菜单下面的快捷按钮,这些快捷按钮之所以放在工具栏里面,是因为它们的使用频率较高。例如,编译按钮在编程时使用的频率相当高。这些快捷按钮大部分也都有对应的快捷键。
工具栏共有两个:主(Main)工具栏和调试(Debug)工具栏。在编辑(默认)状态下只显示主工具栏,在进入调试模式后才会显示调试工具栏。
工具栏可以通过菜单“View→Toolbars”进行设置,如图3.38所示。
图3.38 设置工具栏
(1)主工具栏。在编辑(默认)状态下,只有主工具栏,这个工具栏里面内容也是在编辑状态下常用的快捷按钮,如图3.39所示。
图3.39 IAR主工具栏
这些快捷按钮的功能分别为:
· New Document:新建文件,快捷键为Ctrl+N。
· Open:打开文件,快捷键为Ctrl+O。
· Save:保存文件,快捷键为Ctrl+S。
· Save All:保存所有文件。
· Print:打印文件,快捷键为Ctrl+P。
· Cut:剪切,快捷键为Ctrl+X。
· Copy:复制,快捷键为Ctrl+C。
· Paste:粘贴,快捷键为Ctrl+V。
· Undo:撤销编辑,快捷键为Ctrl+Z。
· Redo:恢复编辑,快捷键为Ctrl+Y。
· Quick Search Text Box:快速搜索文本框。
· Find Previous:向前查找,快捷键为Shift+F3。
· Find Next:向后查找,快捷键为F3。
· Find:查找(增强),快捷键为Ctrl+F。
· Replace:替换,快捷键为Ctrl+H。
· Go To:前往行列,快捷键为Ctrl+G。
· Toggle Bookmark:标记/取消书签,快捷键为Ctrl+F2。
· Previous Bookmark:跳转到上一个书签,快捷键为Shift+F2。
· Next Bookmark:跳转到下一个书签,快捷键为F2。
· Navigate Backward:跳转到上一步,快捷键为Alt+左箭头。
· Navigate Forward:跳转到下一步,快捷键为Alt+右箭头。
· Compile:编译当前(文件、组),快捷键为Ctrl+F7。
· Make:编译工程(构建),快捷键为F7。
· Stop Build:停止编译,快捷键为Ctrl+Break。
· Toggle Breakpoint:编辑/取消断点,快捷键为Ctrl+F9。
· Download and Debug:下载并调试,快捷键为Ctrl+D。
· Debug without Downloading:调试(不下载)。
(2)调试工具栏。调试工具栏上的快捷按钮在程序调试时候才有效,在编辑状态下,这些快捷按钮是无效的。调试工具栏如图3.40所示。
图3.40 调试工具栏
这些快捷按钮的功能分别为:
· Reset:复位。
· Break:停止运行。
· Step Over:逐行运行,快捷键为F10。
· Step Into:跳入运行,快捷键为F11。
· Step Out:跳出运行,快捷键为F11。
· Next Statement:运行到下一语句。
· Run to Cursor:运行到光标行。
· Go:全速运行,快捷键为F5。
· Stop Debugging:停止调试,快捷键为Ctrl+Shift+D。
逐行运行也称为逐步运行,跳入运行也称为单步运行,运行到下一语句和逐行运行类似。
3.3.4 IAR ARM程序的开发及在线调试
工程配置完成后,就可以编译下载并调试程序了,下面依次介绍程序的下载、调试等功能。编译工程的方法为:选择菜单“Project→Rebuild All”,或者直接单击工具栏中的“Make”按钮。
单步调试按钮为“”,在调试页面下单击此按钮可实现代码的单步调试,如图3.41所示。
1.STM32代码的单步调试
图3.41 单步调试
2.STM32代码的断点调试
断点调试是指在有效代码段前通过单击左键添加断点,当程序运行到断点处时程序会停止,并可以查看断点附近的参数数值,如图3.42所示。
图3.42 断点调试
3.在Watch窗口查看STM32代码变量
通过将变量添加到Watch窗口并配合断点可以实现对相关数据的观察。在菜单栏中选择“View→Watch”即可打开Watch窗口,如图3.43所示。
图3.43 打开Watch窗口
在Watch窗口中单击要查看的变量名就可将变量添加到窗口中,如图3.44所示。
图3.44 将变量添加到Watch窗口
在要查看的变量名附近添加断点就可以实现对变量的监控,本例设置了4个断点,如图3.45所示。
图3.45 设置断点查看变量
断点1处的参数值如图3.46所示。
图3.46 断点1处的参数值
断点2的参数值如图3.47所示。
4.在Register窗口查看STM32寄存器值
在程序调试过程中,在菜单栏选择“View→Register”即可打开寄存器(Register)窗口,在默认情况下,寄存器窗口显示的是基础寄存器的值,选择寄存器下拉框选项可以看到不同设备的寄存器,如图3.48所示。
通过寄存器窗口的下拉框可选择芯片的外设寄存器,如图3.49所示。
图3.47 断点2处的参数值
图3.48 寄存器窗口
图3.49 选择芯片的外设寄存器
此次程序主要是配置GPIOE的相关寄存器,所以选择GPIOE的寄存器选项。在GPIOE寄存器进行操作的代码段设置断点,即可实现对GPIOE相关寄存器数值的观察,如图3.50所示。
图3.50 GPIOE寄存器
5.IAR程序的下载
下面介绍如何利用J-Flash ARM仿真软件将hex文件下载到开发设备中。
(1)正确连接J-Link仿真器到PC和开发设备,打开开发设备电源(上电)。
(2)运行J-Flash ARM仿真软件,运行界面如图3.51所示。
(3)选择菜单“Options→Project settings”可进入工程设置(Project settings)界面,如图3.52所示。
图3.51 仿真软件显示界面
图3.52 工程设置界面
单击“CPU”标签,选择正确的CPU型号如图3.53所示。
(4)选择菜单“File→Open data file…”,选择编译生成的hex文件,如图3.54所示。
图3.53 选择正确的CPU型号
图3.54 选择编译生成的hex文件
(5)选择好需要的hex文件之后,选择菜单“Target→Program”就可以开始下载程序了,如图3.55所示,下载完成后就会出现如图3.56所示的提示信息。
图3.55 下载程序过程
图3.56 程序下载完成后的提示信息
3.4 任务实践
3.4.1 开发设计
在物联网项目开发的过程中,微处理器的开发和编程是不可忽略的重要环节。微处理器的开发涉及程序的开发与调试,程序的开发与调试又需要集成开发环境的支持。STM32F407使用的开发环境是IAR for ARM,要使用IAR for ARM开发,首先需要安装IAR for ARM,本任务的目的就是完成IAR for ARM的安装,并实现STM32F407的工程创建与在线调试。
3.4.2 功能实现
IAR for ARM的安装,STM32F407微处理器在IAR for ARM上的工程建立与代码调试的实现参考本任务的原理学习点。
3.5 任务小结
通过本任务的学习和实践,读者可以掌握在IAR for ARM中建立STM32微处理器工程,通过使用IAR for ARM可以实现对STM32微处理器代码的在线调试,学会使用IAR for ARM的调试工具,可以更为深入地了解STM32微处理器代码的运行原理以及STM32微处理器程序在运行时微处理器内部寄存器数值的变化。
3.6 思考与拓展
(1)使用IAR for ARM建立STM32微处理器工程时需要配置哪些参数?
(2)IAR for ARM调试窗口的各个按键都有什么功能?
(3)如何将STM32微处理器代码中的变量加载到Watch窗口中?
(4)如何打开IAR for ARM寄存器的Watch窗口?