第2章 开发环境
当我们还没有掌控一个微控制器时,它就好像摆在我们面前的一个魔盒,让人无从下手,打开这个魔盒需要两把“钥匙”,即软、硬件开发工具。让人欣喜的是,为STM32F0系列微控制器开发应用程序所需要的开发工具都非常廉价,甚至低于开发绝大多数8位微控制器的投入,这也在一定程度上促进了STM32F0系列微控制器的普及和推广。本章从介绍程序开发所需要的软、硬件资源入手,教你如何使用STM32CubeMX软件快速生成开发项目。
2.1 软件开发工具
STM32F0系列微控制器的软件开发工具种类非常丰富,且以第三方软件厂商提供的软件居多,常用的软件开发工具有KEIL公司的MDK-ARM、IAR公司的EWARM集成开发环境等。其中MDK-ARM软件与开发8051系列单片机的集成开发环境C51同样出自KEIL公司,会让从51单片机过渡到ARM的开发者有一种似曾相识的感觉,这也许是很多ARM用户坚持使用MDK-ARM软件的原因之一。
在使用第三方厂商提供的集成开发环境为STM32F0系列微控制器开发应用程序时,一方面需要对集成开发环境做出必要的设置,使其能与目标芯片的特性相匹配。另一方面,基于ARM内核的芯片内部功能均较为复杂,为了降低开发难度、增加代码的可移植性,往往使用集成的函数库来为微控制器开发应用程序,所以在设置集成开发环境时,还需要考虑将适合的函数库添加到集成开发环境中来。以上两方面看似简单,实则会让大多数的ARM初学者就此止步。
作为STM32系列微控制器的生产商,意法公司比任何一家第三方的软件厂商都更了解自己的产品。为了简化设置并降低开发难度,意法公司专门针对旗下不同系列的微控制器产品推出了一款全新的开发软件——STM32CubeMX,该软件允许用户使用图形化界面简单直观地对目标微控制器的引脚、时钟和外设等进行初始化设置,并能针对不同的集成开发环境,如MDK-ARM、EWARM、TrueSTUDIO等快速生成开发项目,之后在相应的集成开发环境中调用生成的项目即可对程序进行进一步的开发。
本书介绍的STM32F0系列微控制器的软件开发就是应用上述方法,即首先使用STM32CubeMX软件生成开发项目,之后将开发项目转移至MDK-ARM软件中,对项目代码进行进一步的编写、编译直至生成相应的HEX文件并烧写至目标微控制器中。以下,我们将围绕MDK-ARM和STM32CubeMX这两个开发软件进行介绍。
2.1.1 MDK-ARM集成开发环境
使用集成开发环境为微控制器开发应用程序已经是行业的标准做法,各大芯片厂商也都通过各种方式开发或完善适合自己产品的集成开发环境。集成开发环境通常是将微控制器软件开发的全过程整合到一个软件中,从项目的建立、源代码的编写、编译、仿真调试直至程序的烧写都由一个软件来完成,这样做能让用户更加专注于产品的设计和开发。
如果你曾经是8051系列单片机的用户,那么你一定对大名鼎鼎的KEIL C51有所了解,应当说使用KEIL C51开发8051系列单片机是用户的不二之选。其实作为一家业界领先的微控制器软件开发工具供应商,KEIL公司的软件产品也涵盖了基于ARM内核的微控制器产品的开发。特别是自2005年被ARM公司收购之后,KEIL公司更加集中精力为高速发展的32位微控制器市场提供完整的解决方案。
KEIL公司的集成开发环境(IDE)通常冠以μVision的名称,支持包括工程管理、源代码编辑、编译、下载调试和模拟仿真等多种功能。按照推出时间的不同,μVision有μVision2、μVision3、μVision4和μVision5四个版本,目前最新的版本是μVision5。确切地说,μVision只是提供了一个环境,让开发者易于操作,要完成具体的开发过程还需要相关的开发工具配合才行。目前在μVision5开发环境下,支持以下四种开发工具:
1)MDK-ARM(Microcontroller Development Kit-ARM):专为32位微控制器定制的开发工具,支持ARM和Cortex等微控制器内核。
2)KEIL C51:KEIL公司开发的支持绝大部分8051内核微控制器的开发工具。
3)KEIL C166:KEIL公司开发的支持C166、XC166和XC2000系列微控制器的开发工具。
4)KEIL C251:KEIL公司开发的支持基于80251内核微控制器的开发工具。
自2013年以来,KEIL公司正式推出了MDK-ARM V5版本。该版本使用μVision5集成开发环境,是目前针对ARM微控制器,尤其是ARM Cortex-M内核的微控制器的最佳集成开发工具之一。MDK-ARM V5加强了针对Cortex-M微控制器开发的支持,并且对传统的开发模式和界面进行了升级。MDK-ARM软件目前的最新版本是V5.20,其内部框架结构如图2-1所示。
图2-1 MDK-ARM框架结构
从软件的框架结构图中可以看出,MDK-ARM V5将编译器与器件分离,细分成MDK Core和Software Packs两部分,其中Software Packs部分可以独立于工具链进行新芯片支持和中间件的升级。
❑ MDK Core(MDK核心)
MDK Core包含微控制器开发的所有组件,包括IDE(μVision5)、编辑器、C/C++编译器、μVision调试跟踪器和安装包管理器(Pack Installer)等,用于完成程序的编写、编译、仿真调试和代码烧写等任务。
❑ Software Packs(软件安装包)
Software Packs分为Device、CMSIS、MDK Professional Middleware三部分,包含了各类可用的设备驱动。软件安装包支持完整的微控制器系列,如ARM7、ARM9、Cortex-M0/M0+/M1/M3/M4等ARM内核芯片,另外也提供了对CMSIS库、中间件、开发板、示例代码和工程样板的支持,并可以随时将新增器件添加至MDK内核中。
按照授权的不同,MDK-ARM软件有四个不同级别的版本,分别是MDK-Lite、MDK-Basic、MDK-Standard和MDK-Professional。其中MDK-Lite(32KB)版可免费下载使用,不需要序列号或授权许可密钥。MDK-ARM软件具体下载方法如下:
1)在浏览器中输入网址“http://www.keil.com/”,访问KEIL公司网站,单击“Product Downloads”项,如图2-2所示。
图2-2 下载MDK-ARM软件(一)
2)浏览器的“Download Products”窗口中列出了KEIL公司的四种软件开发工具,单击“MDK-ARM”项,如图2-3所示。
图2-3 下载MDK-ARM软件(二)
3)单击“MDK520.EXE”项即可启动下载任务,如图2-4所示。
图2-4 下载MDK-ARM软件(三)
4)在MDK-ARM软件下载完成后,还需要下载STM32F0系列微控制器的软件安装包,方法是在浏览器中输入网址“http://www.keil.com/dd2/Pack/”,即可进入软件安装包下载页面,如图2-5所示。
图2-5 下载软件安装包(一)
5)在“MDK5 Software Packs”页面下找到目标器件所在的系列,如开发STM32F072VB微控制器则需要安装“STM32F0”系列,单击该系列后面的下载按钮,即可将该系列的安装包下载到你的PC中,如图2-6所示。
图2-6 下载软件安装包(二)
2.1.2 安装MDK-ARM软件
MDK-ARM V5.20软件和相应的软件安装包成功下载后,即可将其安装在PC上,具体方法如下。
1)双击MDK-ARM V5.20软件的安装文件即可启动安装过程,如图2-7所示。
图2-7 安装MDK-ARM软件(一)
2)在弹出的窗口中勾选“I agree to all …”选项,并单击“Next”按钮,如图2-8所示。
图2-8 安装MDK-ARM软件(二)
3)软件安装时需要用户指定安装路径,这里需要注意的是V5.20版本的MDK-ARM软件的安装路径分为“Core”和“Pack”两个部分,此处保持默认的设置并单击“Next”按钮,如图2-9所示。
图2-9 安装MDK-ARM软件(三)
4)在弹出的窗口中依次输入用户的基本信息,并单击“Next”按钮,如图2-10所示。
图2-10 安装MDK-ARM软件(四)
5)软件自动进入文件拷贝过程,这一过程大约需要几分钟,如图2-11所示。
图2-11 安装MDK-ARM软件(五)
6)文件拷贝结束后会提示安装设备驱动程序,单击“安装”按钮,如图2-12所示。
图2-12 安装MDK-ARM软件(六)
7)单击“Finish”按钮结束安装,如图2-13所示。
图2-13 安装MDK-ARM软件(七)
8)MDK-ARM软件安装完成后会自动弹出软件安装包的欢迎窗口,单击“OK”按钮关闭此窗口,如图2-14所示。
图2-14 安装MDK-ARM软件(八)
9)MDK-ARM软件会自动连接互联网并开始下载软件安装包。这里需要说明的是,使用此方法下载和安装软件安装包需要耗费较长时间,此时可以单击窗口右上方的“×”按钮,中止本次安装包的下载和安装进程,而改用其他方式来下载和安装软件安装包,如图2-15所示。
图2-15 安装MDK-ARM软件(九)
10)双击桌面上MDK-ARM软件的快捷方式图标,运行MDK-ARM软件,如图2-16所示。
图2-16 运行MDK-ARM软件
11)MDK-ARM软件运行后,界面如图2-17所示。单击工具栏上的“Pack Installer”按钮,即可启动安装包管理器。
图2-17 安装软件安装包(一)
12)在安装包管理器的“File”菜单中选择“Import”项,如图2-18所示。
图2-18 安装软件安装包(二)
13)指定软件安装包的存储路径,并选中安装包文件“Keil.STM32F0xx_DFP.1.5.0”,单击“打开”按钮,即可启动安装包的安装过程,如图2-19所示。
图2-19 安装软件安装包(三)
14)安装包安装完成后,在“Pack Installer”窗口的器件列表中会出现“STMicro-electronics”项,单击前面的“+”号可以展开所支持的器件列表,我们需要的目标器件“STM32F072VB”就包含在其中,如图2-20所示。
图2-20 安装软件安装包(四)
2.1.3 STM32CubeMX软件
STM32CubeMX软件是意法公司推出的一个具有划时代意义的软件开发工具,它是意法公司STM32Cube计划中的一部分。该软件是一个图形化开发工具,用于配置和初始化其旗下全系列基于ARM Cortex内核的32位微控制器,并可以根据不同的集成开发环境,如IAR、KEIL和GCC等,生成相应的软件开发项目和C代码。简单地说,STM32CubeMX软件就是一款初始化C代码生成器。
STM32CubeMX软件可以选择性地安装配套的固件包以支持意法公司不同系列的微控制器产品。不仅如此,STM32CubeMX软件的固件包内部还提供了意法公司更加先进的HAL(hardware abstraction layer)库,支持芯片内的所有外设操作。准确地说,HAL库就是用来取代之前的标准外设固件库(Standard Peripherals Firmware Library)的。相比标准外设固件库,HAL库具有更高的抽象整合水平和更好的可移植性,可以轻松地实现从一个STM32产品移植到另一个不同系列的产品中。
本书将使用STM32CubeMX软件为STM32F072VBT6微控制器生成基本的开发项目和相关的初始化C代码,之后在MDK-ARM集成开发环境中完成程序代码的进一步编写、编译直至将生成的HEX文件烧写至微控制器中。STM32CubeMX软件可以从意法公司的官网上免费下载得到,具体方法如下。
1)在浏览器中输入网址“http://www.st.com/content/st_com/zh.html”,访问意法公司网站,如图2-21所示。
图2-21 下载STM32CubeMX软件(一)
2)单击“工具与软件”项,并在出现的菜单中选择“Software Development Tools”项,如图2-22所示。
图2-22 下载STM32CubeMX软件(二)
3)在“Software Development Tools”页面中,单击“产品列表”项,如图2-23所示。
图2-23 下载STM32CubeMX软件(三)
4)在“产品列表”项中,单击“STM32 Software Development Tools(42)”项后面的加号,展开折叠的项目列表,如图2-24所示。
图2-24 下载STM32CubeMX软件(四)
5)在“STM32 Software Development Tools(42)”项目列表中,单击“STM32 Conf igurators and Code Generators(8)”项,如图2-25所示。
图2-25 下载STM32CubeMX软件(五)
6)在“STM32 Conf igurators and Code Generators”软件列表中,单击“STM32CubeMX”软件,如图2-26所示。
图2-26 下载STM32CubeMX软件(六)
7)在“SOFTWARE DEVELOPMENT TOOLS”窗口中,单击“获取软件”按钮,如图2-27所示。
图2-27 下载STM32CubeMX软件(七)
8)在“许可协议”窗口中单击“ACCEPT”按钮,如图2-28所示。
图2-28 下载STM32CubeMX软件(八)
9)在“获取软件”窗口中填写用户信息,完成后单击“下载”按钮,如图2-29所示。
图2-29 下载STM32CubeMX软件(九)
10)软件会提示你的注册信息已提交,并将软件的下载地址链接发送至你刚刚填写的邮箱中。访问邮箱中的软件下载地址,即可将STM32CubeMX软件下载至你的PC,如图2-30所示。
图2-30 下载STM32CubeMX软件(十)
要使用STM32CubeMX软件生成STM32F072VBT6微控制器的开发项目,还需要下载支持STM32F0系列微控制器的固件包,即“STM32CubeF0”包。该固件包内有开发STM32F0系列微控制器所需的HAL库、中间件(USB、STMTouch、FreeRTOS及FatFS)及相应例程等。下载STM32CubeF0固件包的方法如下。
1)在意法公司网站主页上,单击“工具与软件”项,在出现的菜单中选择“微控制器软件”项,如图2-31所示。
图2-31 下载STM32CubeF0固件包(一)
2)在“STM32微控制器软件(256)”选项下,鼠标单击“STM32Cube Embedded Software(13)”项,如图2-32所示。
图2-32 下载STM32CubeF0固件包(二)
3)在软件列表中,单击“STM32CubeF0”软件并开始下载过程,具体方法与下载STM32CubeMX软件类似,如图2-33所示。
图2-33 下载STM32CubeF0固件包(三)
2.1.4 安装STM32CubeMX软件
通过以上下载步骤,我们得到了两个软件,分别是STM32CubeMX软件和STM32CubeF0固件包。两个软件都是以压缩包的形式保存在PC中的,如图2-34所示。
图2-34 STM32CubeMX软件及F0固件包
在获得了这两个软件的压缩包文件后,我们就可以着手安装了,具体方法如下。
1)将名为“en.stm32cubemx”的软件压缩包解压后,双击其中的“SetupSTM32CubeMX-4.16.0”文件,即可启动STM32CubeMX软件的安装,如图2-35所示。
图2-35 安装STM32CubeMX软件(一)
2)安装程序启动后,首先提示需要下载Java软件,用于对STM32CubeMX软件的支持,单击“确定”按钮继续软件的安装过程,如图2-36所示。
图2-36 安装STM32CubeMX软件(二)
3)安装程序会自动打开浏览器下载Java软件,在浏览器窗口中单击“免费Java下载”按钮,如图2-37所示。
图2-37 安装STM32CubeMX软件(三)
4)在浏览器窗口中,单击“同意并开始免费下载”按钮,如图2-38所示。
图2-38 安装STM32CubeMX软件(四)
5)在弹出的新建下载任务窗口中,单击“下载”按钮,如图2-39所示。
图2-39 安装STM32CubeMX软件(五)
6)在下载管理器窗口中,双击“JavaSetup8u101.exe”文件,即可启动Java软件的安装,如图2-40所示。
图2-40 安装STM32CubeMX软件(六)
7)在Java安装程序的欢迎使用界面中,单击“安装”按钮,如图2-41所示。
图2-41 安装STM32CubeMX软件(七)
8)Java安装程序需要下载所需的文件,如图2-42所示。
图2-42 安装STM32CubeMX软件(八)
9)下载完成后,在弹出的窗口中单击“下一步”按钮,如图2-43所示。
图2-43 安装STM32CubeMX软件(九)
10)安装过程需要几分钟的时间,如图2-44所示。
图2-44 安装STM32CubeMX软件(十)
11)Java软件安装完成后,会弹出“您已成功安装Java”的提示,单击“关闭”按钮,如图2-45所示。
图2-45 安装STM32CubeMX软件(十一)
12)在完成了Java软件的安装后,需要对软件的版本进行验证,单击“验证Java版本”按钮,如图2-46所示。
图2-46 安装STM32CubeMX软件(十二)
13)在弹出的“是否要运行此应用程序?”对话框中,单击“运行”按钮,如图2-47所示。
图2-47 安装STM32CubeMX软件(十三)
14)在完成了版本验证后,浏览器窗口中会有“已验证Java版本”的提示信息,如图2-48所示。
图2-48 安装STM32CubeMX软件(十四)
15)再次双击压缩包中的“SetupSTM32 CubeMX-4.16.0”文件,启动STM32CubeMX软件的安装,如图2-49所示。
图2-49 安装STM32CubeMX软件(十五)
16)在STM32CubeMX软件的欢迎窗口中单击“Next”按钮,继续安装过程,如图2-50所示。
图2-50 安装STM32CubeMX软件(十六)
17)在“STM32CubeMX Licensing agreement”窗口中,选择“I accept the terms …”选项,单击“Next”按钮继续安装过程,如图2-51所示。
图2-51 安装STM32CubeMX软件(十七)
18)在“STM32CubeMX Installation path”窗口中,使用默认的安装路径,并单击“Next”按钮,如图2-52所示。
图2-52 安装STM32CubeMX软件(十八)
19)在“Message”窗口中单击“确定”按钮,如图2-53所示。
图2-53 安装STM32CubeMX软件(十九)
20)在“STM32CubeMX Shortcuts Setup”窗口中,使用默认的安装选项并单击“Next”按钮,如图2-54所示。
图2-54 安装STM32CubeMX软件(二十)
21)在“STM32CubeMX Package installation”窗口中,进度条会提示软件的安装过程,如图2-55所示。
图2-55 安装STM32CubeMX软件(二十一)
22)软件安装过程结束后会弹出“STM32CubeMX Installation done”窗口,单击“Done”按钮,如图2-56所示。
图2-56 安装STM32CubeMX软件(二十二)
23)软件安装完成后,在桌面上会出现“STM32 CubeMX”快捷方式图标,如图2-57所示。
图2-57 STM32CubeMX快捷方式图标
24)鼠标双击“STM32CubeMX”快捷方式图标,打开“STM32CubeMX”软件,可以看到该软件的界面非常简洁,如图2-58所示。
图2-58 首次运行STM32CubeMX软件
接下来,我们要开始安装STM32CubeF0固件包,具体步骤如下。
1)在“Help”菜单下选择“Install New Libraries”项,如图2-59所示。
图2-59 安装STM32CubeF0固件包(一)
2)在弹出的“New Libraries Manager”窗口中,单击“From Local…”按钮,选择从本地安装固件包,如图2-60所示。
图2-60 安装STM32CubeF0固件包(二)
3)在弹出的“Select a STM32Cube Package File”窗口中,选择已经下载好的固件压缩包文件“en.stm32cubef0.zip”,单击“Open”按钮打开,如图2-61所示。
图2-61 安装STM32CubeF0固件包(三)
4)软件会自动加载所选择的压缩文件,并将其解压至STM32CubeMX软件中,如图2-62所示。
图2-62 安装STM32CubeF0固件包(四)
5)固件包安装完成后,查看“New Libraries Manager”窗口,在“STM32CubeF0 Releases”项中会显示已安装的固件包及版本号,如图2-63所示。
图2-63 安装STM32CubeF0固件包(五)
2.2 硬件开发工具
嵌入式产品的应用程序开发是建立在硬件基础上的,程序代码与硬件电路的结构密不可分。因此,在开始学习开发STM32F0系列微控制器时,你需要一点硬件投资来支撑你完成后续的学习任务。
2.2.1 仿真/编程器
开发STM32F0系列微控制器可供使用的编程/仿真器种类很多,本书使用的是由意法公司推出的ST-LINK/V2在线仿真/编程器。该仿真/编程器是意法半导体专门为初学者学习、评估、开发STM8和STM32系列微控制器设计的低成本开发工具,可以完成STM8和STM32全系列微控制器的在线调试与编程任务,ST-LINK/V2在线仿真/编程器外观如图2-64所示。
图2-64 ST-LINK/V2在线仿真/编程器(源自产品手册)
ST-LINK/V2在线仿真/编程器是STM8/32系列初学者入门、编程和调试的最具性价比的开发工具之一,它可以使用单线接口模块(SWIM)和JTAG/串行线调试接口(SWD)与目标板上的STM8或STM32单片机通信,用于对目标器件进行硬件联机调试和编程。在使用ST-LINK/V2对STM32F0系列单片机进行调试或编程时,使用SWD接口将在线仿真/编程器与目标板进行连接。
在ST-LINK/V2在线仿真/编程器上有两种类型的接口:一种是SWIM接口,用于对STM8系列微控制器的在线调试与编程;另一种是JTAG/SWD接口,用于对STM32系列微控制器的开发。JTAG/SWD接口引脚排列如图2-65所示,其引脚定义详见表2-1。
图2-65 JTAG/SWD接口
表2-1 JTAG/SWD接口引脚定义
ST-LINK/V2在线仿真/编程器使用SWD方式与目标板连接的方法是:使用杜邦线将20针的JTAG接口中的VAPP、TMS_SWDIO、TCK_SWCLK和GND引脚与目标板单片机的VDD、SWDIO、SWCLK和GND引脚连接即可。这里需要注意的是,在线仿真/编程器不能对外供电,其VAPP引脚是目标板供电电源的反馈引脚,只有当目标板有独立的供电电源时仿真/编程操作才能正常进行。ST-LINK/V2在线仿真/编程器与目标板的连接方法如图2-66所示。
图2-66 JTAG接口与目标板的连接(SWD方式)
将ST-LINK/V2在线仿真/编程器与目标板正确连接后,即可将编程器的USB接口与PC相连,并且安装相应的驱动程序,具体步骤如下。
1)首次将ST-LINK/V2在线仿真/编程器连接至计算机时会出现提示安装设备驱动程序的信息,如图2-67所示。
图2-67 安装ST-LINK/V2驱动(一)
2)当提示安装设备驱动程序的信息出现后,在PC设备管理器的“其他设备”中有“STM32 STLink”项出现。该项前面标有黄色的叹号,表明该驱动程序没有正确安装,如图2-68所示。
图2-68 安装ST-LINK/V2驱动(二)
3)右击“STM32 STLink”项,在弹出的对话框中选择“更新驱动程序软件”项,如图2-69所示。
图2-69 安装ST-LINK/V2驱动(三)
4)在弹出的对话框中选择“浏览计算机以查找驱动程序软件”项,如图2-70所示。
图2-70 安装ST-LINK/V2驱动(四)
5)在更新驱动程序软件窗口中,指定驱动程序的保存路径并单击“下一步”按钮,如图2-71所示。
图2-71 安装ST-LINK/V2驱动(五)
6)启动安装程序并等待驱动的安装完成,如图2-72所示。
图2-72 安装ST-LINK/V2驱动(六)
7)驱动程序正确安装完成后,会有“Windows已经完成安装此设备的驱动程序软件”的提示,如图2-73所示。
图2-73 安装ST-LINK/V2驱动(七)
8)再次查看设备管理器,发现“STM32 STLink”项已经出现在“通用串行总线设备”中,且前面黄色的叹号已经消失,如图2-74所示。
图2-74 安装ST-LINK/V2驱动(八)
2.2.2 STM32系统板
STM32F072VBT6微控制器采用LQFP100封装,引脚间距仅为0.5mm,这样的封装很难用手工的方法搭建系统板,所以建议使用成品的系统板或者全功能开发板来完成本书的代码测试任务。STM32F072VBT6系统板的外观如图2-75所示,系统板电路原理可以参考本书附录A,全功能开发板外观详见本书附录B。另外,也可以使用核心板配合显示模块来完成系统搭建,具体详见本书附录C。
图2-75 STM32F072VBT6系统板
2.3 项目建立
我们已经为开发STM32F072VBT6微控制器准备好了软件和硬件资源,现在是时候建立一个专属于它的开发项目了。这里使用的软件就是刚刚安装好的微控制器初始化和代码生成器——STM32CubeMX。
2.3.1 新建开发项目
在开始使用STM32CubeMX软件建立开发项目之前,首先需要建立项目保存的路径,在PC的“D:\STM32F072VB_REG”路径下,新建一个子文件夹,命名为“chapter02”,用于保存本章所建立的开发项目,本书以后的开发项目也是按此方法,以章节为顺序保存到该路径下。使用STM32CubeMX软件建立开发项目的步骤如下。
1)双击STM32CubeMX软件的快捷方式图标,打开STM32CubeMX软件,如图2-76所示。
图2-76 建立开发项目(一)
2)单击“New Project”按钮,会弹出“New Project”窗口,在此窗口“MCUs List”列表中选择微控制器的型号为“STM32F072VBTx”,之后单击“OK”按钮,如图2-77所示。
图2-77 建立开发项目(二)
3)器件选择完成后,会显示STM32CubeMX软件的主窗口。在主窗口中最上面的部分是软件的菜单栏,其次是工具栏,工具栏的下方是四个视图选项卡,如图2-78所示。
图2-78 建立开发项目(三)
4)四个视图选项卡是STM32CubeMX软件的主要操作区域,其中“Pinout”视图为引脚配置视图,用于配置外设、引脚和中间件的工作模式,具体如图2-79所示。
图2-79 建立开发项目(四)
5)“Clock Conf iguration”视图是时钟配置视图,用于配置时钟树的运行参数,如图2-80所示。
图2-80 建立开发项目(五)
6)“Conf iguration”视图是配置视图,用于配置引脚、外设等的初始化参数,如图2-81所示。
图2-81 建立开发项目(六)
7)“Power Consumption Calculator”视图是电源功耗计算器视图,用于计算微控制器的电流消耗和电池的寿命等,如图2-82所示。
图2-82 建立开发项目(七)
到目前为止,我们对STM32F072VBT6这个芯片的内部结构还并不熟悉,但我们还是要尝试使用STM32CubeMX软件来建立第一个开发项目,将STM32F072VBT6微控制器的PC13引脚置为低电平,用于点亮DEMO板上与该引脚相连的LED灯。
8)在主窗口中单击“Pinout”视图标签,打开引脚配置视图。在该视图的右侧,将鼠标指向出现的微控制器图形,按住键盘上的“Ctrl”键,上下拨动鼠标滚轮,可以调整“Pinout”视图中微控制器图形的大小。单击微控制器图形的“PC13”引脚,在弹出的下拉列表中将“PC13”引脚的工作模式设置为“GPIO_Output”,即将PC13引脚配置为I/O接口,并将其方向设置为输出,如图2-83所示。
图2-83 建立开发项目(八)
9)为了使用微控制器外接的8MHz晶体振荡器,我们还需配置晶体振荡器的两个驱动端,方法是单击微控制器图形的“PF0”引脚,在弹出的下拉列表中将“PF0”引脚的工作模式设置为“RCC_OSC_IN”,如图2-84所示。
图2-84 建立开发项目(九)
10)同理,将“PF1”引脚的工作模式设置为“RCC_OSC_OUT”,引脚模式设置完成后的状态如图2-85所示,这时我们会发现更改了设置的引脚会用高亮的绿色来显示,且引脚上出现了图钉图标。
图2-85 建立开发项目(十)
11)在轻松地完成了对STM32F072VBT6微控制器的引脚配置之后,我们再来配置时钟树。单击“Clock Conf iguration”视图标签,打开时钟配置视图。在时钟树图形中首先将“PLL Source Mux”锁相环多路选择的输入时钟设置为“HSE”,即将外部晶体振荡器作为锁相环时钟的输入;其次将“PLL”锁相环的“PLLMul”倍频设置为“×6”,即将锁相环输入时钟6倍频;最后将“System Clock Mux”系统时钟多路选择的输入端设置为“PLLCLK”,即将锁相环时钟作为系统时钟。时钟的具体设置如图2-86所示。
图2-86 建立开发项目(十一)
12)仅需三个步骤,复杂的时钟配置在“Clock Conf iguration”视图中通过轻点鼠标即可轻松完成,这正是STM32CubeMX软件的优势所在。接下来我们需要对引脚PC13的输出电平做进一步设置。单击“Conf iguration”视图标签,打开配置视图,在该视图右侧“System”项中单击“GPIO”按钮,如图2-87所示。
图2-87 建立开发项目(十二)
13)在弹出的“Pin Conf iguration”窗口中,选择“GPIO”选项卡,单击配置列表中的“PC13”项,打开“PC13 Conf iguration”列表,将“GPIO output level”设置为“Low”,将“GPIO mode”设置为“Output Push Pull”,将“GPIO Pull-up/Pull-down”设置为“no pull-up and no pull-down”等,设置完成后单击“Apply”按钮并单击“OK”按钮,如图2-88所示。
图2-88 建立开发项目(十三)
14)基本设置完成后,在正式生成项目之前,需要先设置项目选项。在“Project”菜单中选择“Settings…”项,如图2-89所示。
图2-89 建立开发项目(十四)
15)在弹出的“Project Settings”窗口中,单击“Project”选项卡,在“Project Name”项中输入要生成项目的名称,在“Project Location”项中输入项目的保存位置,在“Toolchain/IDE”下拉列表中选择“MDK-ARM V5”,将开发工具设置成与我们后期使用的一致,如图2-90所示。
图2-90 建立开发项目(十五)
16)单击“Code Generator”选项卡,在“STM32Cube Firmware Library Package”项中选择“Copy all used libraries into the project folder”,即在生成项目时,将库文件也一并拷贝至项目文件夹中;在“Generated f iles”项中,勾选“Keep User Code when re-generating”和“Delete previously generated f iles when not re-generated”两项,即在重新生成项目时保留用户代码并删除以前生成的文件,如图2-91所示。
图2-91 建立开发项目(十六)
17)在“Advanced Settings”选项卡中,使用默认的选项,单击“Ok”按钮保存上述设置,如图2-92所示。
图2-92 建立开发项目(十七)
18)单击工具栏上齿轮形的“Generate source code based on user settings”按钮,开始生成项目及C代码,如图2-93所示。
图2-93 建立开发项目(十八)
19)在项目生成期间,STM32CubeMX软件会将已安装的固件包中的文件拷贝至所生成的项目中,以确保该项目可以在集成开发环境中被正确编译,如图2-94所示。
图2-94 建立开发项目(十九)
20)项目生成后,会弹出“Code Generation”窗口,如图2-95所示。单击“Open Project”按钮可以在MDK-ARM集成开发环境下打开所生成的项目,这里我们先单击“Close”按钮关闭该窗口。至此,一个基于STM32F072VBT6微控制器的开发项目已经生成完毕。
图2-95 建立开发项目(二十)
2.3.2 查看项目文件
在“D:\STM32F072VB_REG\chapter02”路径下,STM32CubeMX软件生成的文件结构如图2-96所示。
图2-96 查看项目文件
STM32CubeMX软件生成的文件内容如下。
1)ONE_LED.ioc文件是项目文件,保存在所生成项目的根目录下。该文件包含了通过STM32CubeMX软件的用户界面保存的项目用户配置和代码生成设置。
2)“Drivers”文件夹保存的是固件库副本,其中:“CMSIS”文件夹内的文件提供了对Cortex-M处理器内核的支持,而“STM32F0xx_HAL_Driver”文件夹则包含了所有外设的驱动源文件和头文件,即我们所说的HAL库的主要部分。“Drivers”文件夹内的文件结构如图2-97所示。
图2-97 Driver文件夹的文件结构
3)“MDK-ARM”文件夹是STM32CubeMX软件针对MDK-ARM集成开发环境生成的项目开发和调试的文件,如图2-98所示。双击“One_LED”, μVision5项目文件可以打开所生成的项目。
图2-98 MDK-ARM文件夹的文件结构
4)项目根目录下的“Inc”和“Src”文件夹包含了STM32CubeMX软件为外设、GPIO或中间件生成的文件。在“Inc”文件夹中,“mxconstants.h”文件保存了用户应用程序中基本宏定义部分,比如我们在STM32CubeMX软件中定义的常量或对引脚的定义描述;“stm32f0xx_hal_conf.h”文件定义了在HAL驱动下所使用的外设模块、时钟频率和系统配置参数等,而“stm32f0xx_it.h”文件则是中断处理的头文件。“Inc”文件夹内的文件结构如图2-99所示。
图2-99 Inc文件夹的文件结构
“Src”文件夹内的文件结构如图2-100所示。其中“main.c”文件是主程序文件,保存用户定义的应用程序代码。另外,在“main.c”中通过调用“HAL_init()”函数可以将微控制器复位到一个已知的状态,同时复位所有外设,初始化Flash存储器接口和系统节拍器,配置及初始化时钟及I/O口等;“stm32f0xx_hal_msp.c”文件可以按照用户配置定义引脚分配、时钟使能、配置DMA和中断等初始化代码。“stm32f0xx_it.c”文件内部包含了由用户编写的Cortex-M0处理器及外设的中断处理程序。
图2-100 Src文件夹的文件结构
2.3.3 打开项目
我们已经使用STM32CubeMX软件为STM32F072VBT6微控制器生成了开发项目,并将开发项目保存在“D:\STM32F072VB_REG\chapter02”路径下,以下我们将使用MDK-ARM集成开发环境对项目进行修改和编译,直至生成HEX文件并烧写至微控制器中,从而完成全部的项目开发过程。
1)双击桌面上的KEIL μVision5快捷方式图标启动MDK-ARM软件。熟悉KEIL C51的用户对MDK-ARM软件界面会有似曾相识的感觉,相信这也是许多开发者选择MDK-ARM软件的原因之一。MDK-ARM软件的主窗口分为四个区域:主窗口的上方是菜单栏和工具按钮,主窗口中部是项目工作区,下方是编译输出窗口。MDK-ARM软件界面如图2-101所示。
图2-101 启动MDK-ARM软件
2)我们已经使用STM32CubeMX软件建立了开发项目,所以在此只要将其打开即可,在“Project”菜单下选择“Open Project”项,如图2-102所示。
图2-102 打开已有的项目(一)
3)在“D:\STM32F072VB_REG\chapter02\One_LED\MDK-ARM”路径下找到使用STM32CubeMX软件建立的开发项目文件“One_LED”,单击“打开”按钮,如图2-103所示。
图2-103 打开已有的项目(二)
4)在项目工作区,我们可以查看由STM32CubeMX软件建立的项目组,分别是“Application/MDK-ARM”“Application/User”“Drivers/STM32F0xx_HAL_Driver”和“Drivers/CMSIS”组。这里我们不难发现所生成的项目组的名称与“D:\STM32F072VB_REG\chapter02”路径下的文件结构是有一定关联的,例如:“Drivers/STM32F0xx_HAL_Driver”项目组与“D:\STM32F072VB_REG\chapter02\ONE_LED\Drivers\STM32F0xx_HAL_Driver”的文件存储位置是相对应的,如图2-104所示。
图2-104 查看项目组(一)
5)单击项目组前面的“+”号可以打开项目组并查看该项目组中添加的文件,如图2-105所示。
图2-105 查看项目组(二)
6)为了查看项目组,我们也可以在“Project”菜单下选择“Manage”→“Project Items”项,打开“Manage Project Items”对话框,如图2-106所示。
图2-106 查看项目组(三)
7)在“Manage Project Items”对话框中,可以查看这些项目组以及该项目组下所添加的文件,如图2-107所示。这里需要注意的是,项目组管理器的功能较多,可以对项目组进行新建、删除、移动以及添加文件的操作。在此我们不要对项目组的结构做任何改动。
图2-107 查看项目组(四)
8)建立项目组并添加相应文件的目的是把这些文件分门别类,将来在项目编译时这些文件会自动加入程序中,用于实现相应的功能。项目组及添加的文件具体如下。
❑ Application/MDK-ARM组:添加有“startup_stm32f 072xb.s”文件。该文件提供了STM32F072VBT6微控制器的中断矢量列表,供MDK-ARM工具链调用。该文件在微控制器启动后会被调用,用于初始化SP和PC寄存器,设置中断向量入口并最终调用主函数。在该文件中,可以找到不同的中断服务函数的名称列表,如外设“USART1”的中断服务函数的名称为“USART1_IRQHandler”。
❑ Application/User组:添加有“main.c”“stm32f0xx_it.c”和“stm32f0xx_hal_msp.c”源文件。关于这三个文件的功能在本章的前面已经有所叙述,这里需要说明的是,我们可以对“main.c”和“stm32f0xx_it.c”两个文件进行修改,将自行定义的程序代码添加到其中。例如,要修改主程序文件,在项目组中双击“main.c”文件即可将其打开,该文件的内容详见代码清单2-1。
❑ Drivers/STM32F0xx_HAL_Driver组:根据使用需要添加相应的外设驱动源文件。例如,当使用I/O口驱动外围电路时,就需要在此添加“stm32f0xx_hal_gpio.c”源文件。另外在使用GPIO时,必须使能GPIO的时钟,所以在此处还需要添加“stm32f0xx_hal_rcc.c”源文件。
❑ Drivers/CMSIS组:添加有“system_stm32f0xx.c”源文件。该文件是Cortex-M0器件外设访问层系统源文件,用于系统时钟配置,主要用于定义系统时钟源以及低速、高速时钟总线的频率等,具体的配置情况详见表2-2。在“system_stm32f0xx.c”源文件中,提供了可以被用户应用程序调用的两个函数和一个全局变量,其中SystemInit()函数在系统启动时用于初始化时钟,该函数在复位后和转向主程序之前被调用;在程序运行期间,每当内核时钟改变时,会调用SystemCoreClockUpdate()函数,用于更新SystemCoreClock变量;而SystemCoreClock变量用于定义Cortex-M0内核时钟频率(HCLK),该变量可供用户应用程序使用,用于设置系统节拍定时器或配置其他参数。
表2-2 系统初始化时钟配置
每当系统复位后,内部高速时钟HSI(8MHz)将作为系统默认时钟源,之后“startup_stm32f0xx.s”文件被执行。通过该文件调用SystemInit()函数,用于在转向执行主程序之前配置系统时钟。
2.3.4 查看项目属性
使用STM32CubeMX软件的优点不仅在于可以快速建立开发项目,还在于可以同步地完成项目的相关设置,要知道这些设置是使用MDK-ARM软件新建开发项目所必需的。以下我们就通过查看项目属性的方法来感受一下STM32CubeMX软件在生成开发项目时都自动完成了哪些设置。
1)单击工具栏上的“Option For Target”按钮或在“Project”菜单中选择“Option For Group”项,如图2-108所示。
图2-108 查看项目属性(一)
2)在弹出的“Option For Target‘One_LED'”对话框中,单击“Device”选项卡可以查看所选择的目标器件,如图2-109所示。
图2-109 查看项目属性(二)
3)在“Target”选项卡中,时钟频率“Xtal(MHz)”默认为48.0MHz,这也是STM32F0系列微控制器允许的最高系统时钟,如图2-110所示。
图2-110 查看项目属性(三)
4)在“Output”选项卡中,需要勾选“Create HEX File”项,目的是在项目成功编译后能生成HEX文件,该文件可用于对微控制器的烧写,如图2-111所示。
图2-111 查看项目属性(四)
5)保持“Output”、“Listing”和“User”选项卡的默认设置不变,在“C/C++”选项卡下可以看到,在“Preprocessor Symbols”项中软件自动添加了两个非常重要的宏,即:“USE_HAL_DRIVER”和“STM32F072xB”,二者之间使用逗号进行分隔。其中“USE_HAL_DRIVER”定义的是使用HAL库用于项目开发,项目的开发可以使用标准外设固件库,定义了这个宏之后,与外设相关的函数才允许包含到项目中来;另一个宏“STM32F072xB”用于指定目标MCU的类型和容量。这两个宏对于程序的正确编译是非常重要的,如图2-112所示。
图2-112 查看项目属性(五)
除了设定以上两个宏之外,软件在生成项目时还在“Include Paths”项中定义了如下路径:../Inc; ../Drivers/STM32F0xx_HAL_Driver/Inc; ../Drivers/STM32F0xx_HAL_Driver/Inc/Legacy; ../Drivers/CMSIS/Include; ../Drivers/CMSIS/Device/ST/STM32F0xx/Include。该路径指定了与项目相关的源文件和头文件的保存位置,以便MDK-ARM集成开发环境在编译链接这些文件时能正确地找到它们。
6)保持“Asm”“Linker”和“Utilities”选项卡的默认设置不变。在“Debug”选项卡下可以发现,“Use”项中的调试器已经设置为“ST-Link Debugger”,并在“Run to main()”项上打钩,如图2-113所示。
图2-113 查看项目属性(六)
7)同样在“Debug”选项卡下,单击“ST-Link Debugger”项右侧的“Settings”按钮会弹出“Cortex-M Target Driver Setup”对话框,在该对话框的“Debug”选项卡中,软件已经将“Port”项中的编程模式设置为“SW”模式,如图2-114所示。
图2-114 查看项目属性(七)
8)在该对话框中的“Flash Download”选项卡中勾选“Reset and Run”项,该项设置用于烧写结束后使微控制器复位并开始运行程序。以上设置完成后,单击“确定”按钮,并在“Option For Target‘ONE_LED'”对话框中单击“OK”按钮保存我们上述更改的设置,如图2-115所示。
图2-115 查看项目属性(八)
以上,我们查看并部分修改了由STM32CubeMX软件所生成开发项目的属性。令人欣慰的是,软件已经自动完成了大多数烦琐的设置,需要用户手动干预的部分并不多。明确项目属性设置对于理解MDK-ARM软件至关重要,正确的项目设置也是程序正确编译的基础,这些都值得初学者花时间好好研读。
2.3.5 编译项目
对于STM32CubeMX软件生成的项目基本上都可以一次编译通过,本章的程序也不例外。虽然到目前为止我们对程序代码的具体情况还一无所知,但非常确定的是,我们在初始化目标微控制器时已经将PC13引脚设置为输出,并将其初始化为低电平。以下我们就要开始对上述程序进行编译。
1)单击工具栏上的“Rebuild”按钮,重新编译所有的目标文件,即可对项目进行编译,如图2-116所示。
图2-116 编译项目(一)
2)编译完成后,在MDK-ARM软件的编译输出窗口中会有相应的提示如下:
*** Using Compiler 'V5.06 update 2 (build 183)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin' Rebuild target 'One_LED' assembling startup_stm32f072xb.s... compiling stm32f0xx_hal_pwr.c... …… compiling stm32f0xx_it.c... compiling main.c... compiling stm32f0xx_hal_msp.c... linking... Program Size: Code=2600 RO-data=240 RW-data=8 ZI-data=1024 FromELF: creating hex file... "One_LED\One_LED.axf" -0 Error(s), 0 Warning(s). Build Time Elapsed: 00:00:23
上述提示告诉我们程序已经通过了编译,并已经生成了可供烧写至微控制器的HEX文件,如图2-117所示。
图2-117 编译项目(二)
3)将ST-LINK/V2在线仿真/编程器及STM32F072VBT6系统板连接至PC,单击工具栏上的“Download”按钮,启动程序的烧写过程,烧写完成后在编译输出窗口中会有如下提示:
Load "One_LED\\One_LED.axf" Erase Done. Programming Done. Verify OK. Application running ... Flash Load finished at 21:49:00
MDK-ARM软件的烧写过程如图2-118所示。烧写完成后,目标板上与PC13相连接的LED灯会亮起。
图2-118 编译项目(三)
上述由STM32CubeMX软件所生成的主程序源代码详见代码清单2-1。
代码清单2-1 点亮与PC13连接的LED(main.c)(在附录J中指定的网站链接下载源代码)
回顾本章,我们已经将开发STM32F0系列微控制器所需要的集成开发环境MDK-ARM、STM32CubeMX软件及相应的固件库全部安装至PC中,为程序的开发做好了软件和硬件的准备。不仅如此,通过使用STM32CubeMX软件,我们在对微控制器内部结构并不了解的情况下成功地操控了I/O口,并将与之相连的LED灯点亮。从这一点上看,使用STM32CubeMX软件开发应用程序的确会让开发者更多地脱离硬件,从而更加专注于程序本身。