1)实验平台:探索者 STM32F407 开发板
第三章 MDK5 软件入门
本章将向大家介绍 MDK5 软件的使用,通过本章的学习,我们最终将建立一个自己的基于
STM32F40X 系列的 MDK5 工程,同时本章还将向大家介绍 MDK5 软件的一些使用技巧,希望
大家在本章之后,能够对 MDK5 这个软件有个比较全面的了解。
本章分为如下个小结:
3.1,STM32F4 官方 HAL 库简介
3.2,MDK5 简介;
3.3,新建基于 STM32F4 HAL 库的 MDK5 工程;
3.4,程序下载与调试
3.5,MDK5 使用技巧;
3.1 STM32 官方 HAL 库简介
ST(意法半导体)为了方便用户开发程序,提供了一套丰富的 STM32F4 HAL 库。到底什么
是 HAL 库?它与直接操作寄存器开发有什么区别和联系?很多初学用户很是费解,这一节,
我们将讲解 HAL 库相关的基础知识,希望能够让大家对 STM32F4 HAL 库有一个初步的了解,
能做到“知其然知其所以然”,所以大家在学习 HAL 库函数的同时,别忘了要了解一下寄存器
大致配置过程。
很多用户都是从学 51 单片机开发转而想进一步学习 STM32 开发,他们习惯了 51 单片机
的寄存器开发方式,突然一个 HAL 库摆在面前会一头雾水,不知道从何下手。下面我们将通
过一个简单的例子来告诉 HAL 库到底是什么,和寄存器开发有什么关系?其实一句话就可以
概括:HAL 库就是函数的集合,HAL 库函数的作用是向下负责与寄存器直接打交道,向上提
供用户函数调用的接口(API)。
在 51 的开发中我们常常的作法是直接操作寄存器,比如要控制某些 IO 口的状态,我们直
接操作寄存器:
P0=0x11;
而在 STM32 的开发中,我们同样可以操作寄存器:
GPIOF->BSRR=0x00000001; //这里是针对 STM32F4 系列
这种方法当然可以,但是这种方法的劣势是你需要去掌握每个寄存器的用法,你才能正确使用
STM32,而对于 STM32 这种级别的 MCU,数百个寄存器记起来又是谈何容易。于是 ST(意法
半导体)推出了官方固件库,固件库将这些寄存器底层操作都封装起来,提供一整套接口(API)
供开发者调用,大多数场合下,你不需要去知道操作的是哪个寄存器,你只需要知道调用哪些
函数即可。而 HAL 库是在标准固件库之后推出的。
比如上面的控制 BSRRL 寄存器实现电平控制,官方 HAL 库封装了一个函数:
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState
PinState)
{
if(PinState != GPIO_PIN_RESET)
{
GPIOx->BSRR = GPIO_Pin;
}
else
{
GPIOx->BSRR = (uint32_t)GPIO_Pin << 16;
}
}
这个时候你不需要再直接去操作 BSRR 寄存器了,你只需要知道怎么使用 HAL_GPIO_WritePin
这个函数就可以了。在你对外设的工作原理有一定的了解之后,你再去看 HAL 库函数,基本
上函数名字能告诉你这个函数的功能是什么,该怎么使用,这样是不是开发会方便很多?
任何处理器,不管它有多么的高级,归根结底都是要对处理器的寄存器进行操作。但是 HAL
库不是万能的,您如果想要把 STM32 学透,光读 STM32HAL 库是远远不够的。你还是要了解
一下 STM32 的原理,了解 STM32 各个外设的运行机制。只有了解了这些原理,你在进行 HAL
库开发过程中才可能得心应手游刃有余。只有了解了原理,你才能做到“知其然知其所以然”,
所以大家在学习库函数的同时,别忘了要了解一下寄存器大致配置过程。
这一节我们就简要介绍到这里,后面我们会介绍怎样建立基于 V1.4 版本 HAL 库的工程模
板。
3.2 MDK5 简介
MDK 源自德国的 KEIL 公司,是 RealView MDK 的简称。在全球 MDK 被超过 10 万的嵌
入式开发工程师使用。目前最新版本为:MDK5.28,该版本使用 uVision5 IDE 集成开发环境,
是目前针对 ARM 处理器,尤其是 Cortex M 内核处理器的最佳开发工具。但是我们不采用最新
版本,因为会有一些小问题。
MDK5 向后兼容 MDK4 和 MDK3 等,以前的项目同样可以在 MDK5 上进行开发(但是头文
件方面得全部自己添加), MDK5 同时加强了针对 Cortex-M 微控制器开发的支持,并且对传统
的开发模式和界面进行升级,MDK5 由两个部分组成:MDK Core 和 Software Packs。其中,
Software Packs 可以独立于工具链进行新芯片支持和中间库的升级。如图 3.2.1 所示:
图 3.2.1 MDK5 组成
C/C++ Compiler(编译器),Pack Installer(包安装器),uVision Debugger with Trace(调试跟踪
器)。uVision IDE 从 MDK4.7 版本开始就加入了代码提示功能和语法动态检测等实用功能,相
对于以往的 IDE 改进很大。
Software Packs(包安装器)又分为:Device(芯片支持),CMSIS(ARM Cortex 微控制器
软件接口标准)和 Mdidleware(中间库)三个小部分,通过包安装器,我们可以安装最新的组
件,从而支持新的器件、提供新的设备驱动库以及最新例程等,加速产品开发进度。
同以往的 MDK 不同,以往的 MDK 把所有组件到包含到了一个安装包里面,显得十分“笨
重”,MDK5 则不一样,MDK Core 是一个独立的安装包,它并不包含器件支持、设备驱动、
CMSIS 等组件,大小才 300M 左右,相对于 MDK4.70A 的 500 多 M,瘦身明显,MDK5 安装
包可以在:
http://www.keil.com/demo/eval/arm.htm 下载到。而器件支持、设备驱动、CMSIS 等
组件,则可以点击 MDK5 的 Build Toolbar 的最后一个图标调出 Pack Installer,来进行各种组件
的安装。也可以在
http://www.keil.com/dd2/pack 这个地址下载,然后进行安装。
在 MDK5 安装完成后,要让 MDK5 支持 STM32F407 的开发,还要安装 STM32F4 的器件
支持包:
Keil.STM32F4xx_DFP.1.0.8.pack(STM32F4 的器件包)。这两个包以及 MDK5.14 的安
装软件,我们都已经在开发板光盘提供了,跟安装软件在同一级目录,大家在按照 3.3.1 小节
的步骤安装 MDK5 之后,点击这两个 pack 即可完成安装。
3.3 新建基于 HAL 库的工程模板
在前面的章节我们介绍了 STM32F4xx 官方 HAL 库包的一些知识,这些我们将着重讲解建
立基于 HAL 库的工程模板的详细步骤。实际上,我们可以使用 ST 官方的 STM32CubeMX 图
形工具生成一个工程模板,这里之所以我们还要手把手教大家新建一个模板,是为了让大家对
工程新建和运行过程有一个深入的理解,这样在日后的开发中遇到任何问题都可以得心应手的
解决。在新建模板之前之前,首先我们要准备如下资料:
1) HAL 库开发包:STM32Cube_FW_F4_V1.24.1 这是 ST 官 下载的 STM32CubeF4 包完
整版,我们光盘目录(压缩包):
“8,STM32 参考资料1,STM32CubeF4 固件包 en.stm32cubef4.zip”。
我们官方论坛开源电子 帖子
http://openedv.com/thread-76785-1-1.html 中也有下载。
2) MDK5.20 开发环境(我们的板子的开发环境目前是使用这个版本)。这在我们光盘
的软件目录下面有安装包:软件资料软件MDK5。
3.3.1 MDK5 安装步骤
MDK5 的安装,请参考光盘:“1,ALIENTEK 探索者 STM32F4 开发板入门资料MDK5.14
安装手册.pdf”,里面详细介绍了 MDK5 的安装方法,本节我们将教大家如何新建一个基于 HAL
库 STM32F4 的 MDK5 工程。这里需要特别说明一下,如果您使用过其他 mdk 或者 keil,请确
保新的 mdk5.14 的安装路径跟以前的版本的 mdk 或者 keil 的安装路径不一样,同时安装路径
不要包含中文,否则,就会出一些奇怪的错误。
3.3.2 新建工程模板
在新建之前,首先我们要说明一下,这一小节我们新建的工程放在光盘目录,路径为:“4,
程序源码标准例程-HAL 库版本实验 0-1 Template 工程模板-新建工程章节使用” 下面,大家
在学习新建工程过程中间遇到一些问题,可以直接打开这个模板,然后对比学习。
在建立工程之前,我们建议用户在电脑的某个目录下面建立一个文件夹,后面所建立的工
程都可以放在这个文件夹下面,这里我们建立一个文件夹为 Template。这是工程的根目录文件
夹。然后为了方便我们存放工程需要的一些其他文件,这里我们还新建下面 4 个子文件夹:
CORE ,HALLIB,OBJ 和 USER。至于这些文件夹名字,实际上是可以任取的,我们这样取
名只是为了方便识别。对于这些文件夹用来存放什么文件,我们后面的步骤会一一提到。新建
好的目录结构如下图 3.3.2.1.
图 3.3.2.1 新建文件夹
接下来,打开 MDK,点击菜单 Project –>New Uvision Project ,然后将目录定位到刚才建
立的文件夹 Template 之下的 USER 子目录,工程取名为 Template 之后点击保存,工程文件就都
保存到 USER 文件夹下面。 操作过程如下图 3.3.2.2 和 3.3.2.3 所示:
图 3.3.2.2 新建工程
图 3.3.2.3 定义工程名称
接下来会出现一个选择 Device 的界面,就是选择我们的芯片型 ,这里我们定位到
STMicroelectronics下面的STM32F407ZGT6 (针对我们的正点原子探索者STM32F4板子是这个
型 )。这里我们选择 STMicroelectronics→STM32F4 Series→STM32F407→STM32F07ZG(如果
使用的是其他系列的芯片,选择相应的型 就可以了,例如我们的精英 STM32 开发板是
STM32F103ZE。特别注意:一定要安装对应的器件 pack 才会显示这些内容)。
图 3.3.2.4 选择芯片型
点击 OK,MDK 会弹出 Manage Run-Time Environment 对话框,如图 3.3.2.5 所示:
图 3.3.2.5 Manage Run-Time Environment 界面
这是 MDK5 新增的一个功能,在这个界面,我们可以添加自己需要的组件,从而方便构建
开发环境,不过这里我们不做介绍。所以在图 3.3.2.5 所示界面,我们直接点击 Cancel,即可,
得到如图 3.3.2.6 所示界面:
图 3.3.2.6 工程初步建立
1) 现在我们看看 USER 目录下面内容,如下图 3.3.2.7:
图 3.3.2.7 工程 USER 目录文件
这里我们说明一下, Template.uvprojx 是工程文件,非常关键,不能轻易删除,MDK5.20
生成的工程文件是以.uvprojx 为后缀。DebugConfig,Listings 和 Objects 三个文件夹是 MDK 自
动生成的文件夹。其中 DebugConfig 文件夹用于存储一些调试配置文件,Listings 和 Objects 文
件夹用来存储 MDK 编译过程的一些中间文件。这里,我们把 Listings 和 Objects 文件夹删除,
我们会在下一步骤中新建一个 OBJ 文件夹,用来存放编译中间文件。当然,我们不删除这两个
文件夹也没有关系,只是我们不用它而已。
2) 接下来我们将从官方 stm32cubeF4 包里面复制一些我们新建工程需要的关键文件到我们的
工程目录中。首先,我们要将 STM32CubeF4 包里的源码文件复制到我们的工程目录文件夹下
面。打开官方 STM32CubeF4 包,定位到我们之前准备好的 HAL 库包的目录:
STM32Cube_FW_F4_V1.24.1DriversSTM32F4xx_HAL_Driver 下面,将目录下面的 Src,Inc 文
件夹复制到我们刚才建立的 HALLIB 文件夹下面。Src 存放的是 HAL 库的.c 文件,Inc 存放的
是对应的.h 文件,您不妨打开这两个文件目录过目一下里面的文件,每个外设对应一个.c 文件
和一个.h 头文件。操作完成后工程 HALLIB 目录内容如下图 3.3.2.8。
图 3.3.2.8 官方库源码文件夹
3) 接下来,我们要将 STM32CubeF4 包里面相关的启动文件以及一些关键头文件复制到我们的
工程目录 CORE 之下。打开 STM32CubeF4 包,定位到目录
STM32Cube_FW_F4_V1.24.1DriversCMSISDeviceSTSTM32F4xxSourceTemplatesarm 下面,
STM32Cube_FW_F4_V1.24.1DriversCMSISInclude,将里面的几个头文件:cmsis_armcc.h,
cmsis_armclang.h,cmsis_compiler.h,cmsis_version.h,mpu_armv7.h,core_cm4.h 同样复制
到 CORE 目录下面。现在看看我们的 CORE 文件夹下面的文件,如下图 3.3.2.9:
图 3.3.2.9 CORE 文件夹文件
4) 接下来我们要复制工程模板需要的一些其他头文件和源文件到我们工程。首先定位到目录:
STM32Cube_FW_F4_V1.24.1DriversCMSISDeviceSTSTM32F4xxInclude 将里面的 3 个文件
stm32f4xx.h,system_stm32f4xx.h 和 stm32f407xx.h 复制到 USER 目录之下。这三个头文件是
STM32F4 工程非常关键的头文件,前面我们介绍 STM32CubeF4 包的时候已经给大家介绍过。
然后进入目录STM32Cube_FW_F4_V1.24.1ProjectsSTM32F4-DiscoveryTemplates 目录下,这
个目录下面有好几个文件夹,如下图 3.3.2.10,我们需要从 Src 和 Inc 文件夹下面复制我们需要
的文件到 USER 目录。
图 3.3.2.10 HAL 库包 Template 目录下面文件一览
首先我们打开Inc目录,将目录下面的3个头文件stm32f4xx_it.h,stm32f4xx_hal_conf.h 和main.h
全部复制到USER 目录下面。然后我们打开 Src 目录,将下面的四个源文件 system_stm32f4xx.c,
stm32f4xx_it.c, stm32f4xx_hal_msp.c 和 main.c 同样全部复制到 USER 目录下面。相关文件复制
到 USER 目录之后 USER 目录文件如下图 3.3.2.11:
图 3.3.2.11 USER 目录文件浏览
5) 前面 6 个步骤,我们将需要的文件复制到了我们的工程目录下面了。接下来,我们还需要
复制 ALIENTEK 编写的 SYSTEM 文件夹内容到工程目录中。首先,我们需要解释一下,这个
SYSTEM 文件夹内容是 ALIENTEK 为开发板用户编写的一套非常实用的函数库,比如系统时
钟初始化,串口打印,延时函数等,这些函数被很多工程师运用到自己的工程项目中。当然,
大家也可以根据自己需求决定是否需要 SYSTEM 文件夹,对于 STM32F407 的工程模板,如果
没有加入 SYSTEM 文件夹,那么大家需要自己定义系统时钟初始化。SYSTEM 文件夹对于库
函数版本程序和寄存器版本程序是有所区别的,这里我们新建的是库函数工程模板,所以大家
从光盘程序源码目录之下的库函数版本的任何一个实验中复制过来即可。这里我们打开光盘的
“4,程序源码标准例程-HAL 库版本实验 0-1 Template 工程模板-新建工程章节使用”工程目
录,从里面复制 SYSTEM 文件夹到我们的 Template 工程模板根目录即可。操作过程如下图
3.3.2.12 和图 3.3.2.13 所示:
图 3.3.2.12 复制实验 0-1 的 SYSTEM 文件夹到工程根目录
图 3.3.2.13 复制 SYSTEM 文件夹之后的 Template 根目录文件夹结构
到这里,工程模板所需要的所有文件都已经复制进去。接下来,我们将在 MDK 中将这些文件
添加到工程。
6) 下面我们将前面复制过来的文件加入我们的工程中。右键点击 Target1,选择 Manage Project
Items,如下图 3.3.2.14 所示:
图 3.3.2.14 点击 Management Project Itmes
7) Project Targets 一栏,我们将 Target 名字修改为 Template,然后在 Groups 一栏删掉一个 Source
Group1,建立四个 Groups:USER,SYSTEM,CORE,和 HALLIB。然后点击 OK,可以看到
我们的 Target 名字以及 Groups 情况如下图 3.3.2.15 和图 3.3.2.16 所示:
图 3.3.2.15 新建 GROUP
图 3.3.2.16 查看工程 Group 情况
8) 下面我们往 Group 里面添加我们需要的文件。我们按照步骤 9 的方法, 右键点击点
击 Tempate,选择 Manage Project Items.然后选择需要添加文件的 Group,这里第一步我们选择
HALLIB,然后点击右边的 Add Files,定位到我们刚才建立的目录HALLIBSrc 下面,将里面所
有的文件选中(Ctrl+A),然后点击 Add,然后 Close.可以看到 Files 列表下面包含我们添加的文
件,如下图 3.3.2.17。这里需要说明一下,对于我们写代码,如果我们只用到了其中的某个外设,
我们就可以不用添加没有用到的外设的库文件。例如我只用 GPIO,我可以只用添加
stm32f4xx_gpio.c 而其他外设相关的可以不用添加。这里我们全部添加进来是为了后面方便,不
用每次添加,当然这样的坏处是工程太大,编译起来速度慢,用户可以自行选择。
图 3.3.2.17 添加文件到 HALLIB 分组
stm32f4xx_hal_msp_template.c 三个文件不需要引入工程。stm32f4xx_hal_dsc.c 是 mipi 接口相关
函数,STM32F407 没有这个接口,所以这个文件可以不用引入。stm32f4xx_hal_iptim.c 文件是
低 功 耗 定 时 器 相 关 函 数 , STM32F407 也 没 有 这 个 功 能 , 也 不 需 要 引 入 。
stm32f4xx_hal_msp_template.c 文件内容是一些空函数,一般也不需要引入。删除某个方法如下
图 3.3.2.18 所示:
图 3.3.2.18 删掉 HALLIB 分组中不需要的源文件
使用同样的方法删除文件 stm32f4xx_hal_iptim.c 和
stm32f4xx_hal_msp_template.c 即可。
9) 用上面同样的方法,将 Groups 定位到 CORE,USER 和 SYSTEM 分组之下,添加需要的
文件。CORE 分组下面需要添加的文件为一些头文件以及启动文件 startup_stm32f407xx.s(注意,
默认添加的时候文件类型为.c,添加.h 头文件和 startup_stm32f407xx.s 启动文件的时候,你需
要选择文件类型为 All files 才能看得到这些文件)。USER 分组下面需要添加的文件 USER 目录
下面所有的.c 文件:main.c,stm32f4xx_hal_msp.c,stm32f4xx_it.c 和 system_stm32f4xx.c 四个
文件。 SYSTEM 分组下面需要添加 SYSTEM 文件夹下所有子文件夹内的.c 文件,包括 sys.c,
usart.c 和 delay.c 三个源文件。添加完必要的文件到工程之后,最后点击 OK,回到工程主界面。
操作过程如下图 3.3.2.19~3.3.2.22:
图 3.3.2.19 添加文件到 USER 分组
图 3.3.2.20 文件添加到 USER 分组完成
使用同样的方法,选中 CORE 分组,点击 Add Files 按钮,添加需要的文件到 CORE 分组。
图 3.3.2.21 添加.h 头文件和启动文件到 CORE 分组
图 3.3.2.22 添加启动文件和头文件到 CORE 分组完成
最后添加文件到 SYSTEM 分组,这里需要注意,SYSTEM 文件夹包含三个子文件夹 sys,delay 和
usart。在添加文件的时候,需要分别定为到三个子文件夹内部,依次添加下面的.c 文件即可。
添加完成后如下图 3.3.2.23 所示:
图 3.3.2.23 添加文件到 SYSTEM 分组
添加完所有文件到工程中之后,我们点击 OK 按钮,回到 MDK 工程主界面,如下图 3.3.2.24
所示:
图 3.3.2.24 工程分组情况
10)
接下来我们要在 MDK 里面设置头文件存放路径。也就是告诉 MDK 到那些目录下面去
寻找包含了的头文件。这一步骤非常重要。如果没有设置头文件路径,那么工程会出现
错头文件路径找不到。具体操作如下图 3.3.2.25 和 3.3.2.26 所示,5 步之后添加相应的
头文件路径。
图 3.3.2.25 进入 PATH 配置界面
图 3.3.2.26 添加头文件路径到 PATH
这里大家需要注意,这里添加的路径必须添加到头文件所在目录的最后一级。比如在 SYSTEM
文件夹下面有三个子文件夹下面都有.h 头文件,这些头文件在工程中都需要使用到,所以我们
必须将这三个子目录都包含进来。这里我们需要添加的头文件路径包括:CORE, USER,
SYSTEMdelay ,SYSTEMusart,SYSTEMsys 以及HALLIBInc。这里还需要提醒大家,HAL
库存放头文件子目录是HALLIBInc,不是 HALLIBSrc,其次很多朋友都是这里弄错导致
很多奇怪的错误。添加完成之后如下图 3.3.2.27 所示。
图 3.3.2.27 添加头文件路径
11)
接下来对于 STM32F407 系列的工程,还需要添加全局宏定义标识符,所谓全局宏定义
标识符,就是在工程中任何地方都可见。添加方法是点击魔术棒之后,进入 C/C++选项卡,然
后在 Define 输入框连输入:USE_HAL_DRIVER,STM32F407xx。注意这里是两个标识符
USE_HAL_DRIVER 和 STM32F407xx,他们之间是用逗 隔开的,请大家注意。这个字符串大
家可以直接打开我们光盘的新建好的工程模板,从里面复制。模板存放目录为:4,程序源码
标准例程-HAL 库版本实验 0-1 Template 工程模板-新建工程章节使用。本步骤操作过程如下图
3.3.2.28 所示:
图 3.3.2.28 添加全局宏定义标识符
12)
接下来我们要编译工程,在编译之前我们首先要选择编译中间文件编译后存放目录。
前面我们讲过,MDK 默认编译后的中间文件存放目录为 USER 目录下面的 Listings 和 Objects
子目录,这里为了和我们 ALIENTEK 工程结构保持一致,我们重新选择存放到目录 OBJ 目录
之下。操作方法是点击魔术棒
,然后选择“Output”选项下面的“Select folder for objects…”
,
然后选择目录为我们上面新建的 OBJ 目录,然后依次点击 OK 即可。操作过程如下图 3.3.2.29
和 3.3.2.30 所示
图 3.3.2.29 点击按钮“Select Folder for Objects…”
图 3.3.2.30 选择 OBJ 目录为中间文件存放目录
选择完 OBJ 目录为编译中间文件存放目录之后,点击 OK 回到 Output 选项卡。这里我们还
要勾上“Create HEX File”选项。Create HEX File 选项选上是要求编译之后生成 HEX
文件。Browse Information 选项选上是方便我们查看工程中的一些函数变量定义等。但是
对于 HAL 库勾选之后编译速度极其慢,为了加快开发速度我们不勾选。具体操作方法如下
图 3.3.2.31 所示:
图 3.3.2.31 勾选上 Create HEX file 选项
13)
接下来在编译之前,我们先把 main.c 文件里面的内容替换为如下内容:
#include “sys.h”
#include “delay.h”
#include “usart.h”
/************************************************
ALIENTEK 探索者 STM32F407 开发板实验 0-1
Template 工程模板-新建工程章节使用-HAL 库版本
技术支持:www.openedv.com
淘宝店铺: http://eboard.taobao.com
广州市星翼电子科技有限公司
************************************************/
/***注意:本工程和教程中的新建工程 3.3 小节对应***/
void Delay(__IO uint32_t nCount);
void Delay(__IO uint32_t nCount)
{
while(nCount–){}
}
int main(void)
{
GPIO_InitTypeDef GPIO_Initure;
HAL_Init();
//初始化 HAL 库
Stm32_Clock_Init(336,8,2,7);
//设置时钟,168Mhz
__HAL_RCC_GPIOF_CLK_ENABLE(); //开启 GPIOF 时钟
GPIO_Initure.Pin=GPIO_PIN_9|GPIO_PIN_10;
//PF9,10
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP;
//上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH;
//高速
HAL_GPIO_Init(GPIOF,&GPIO_Initure);
while(1)
{
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_SET);
//PF9 置 1
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,GPIO_PIN_SET);
//PF10 置 1
Delay(0x7FFFFF);
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_RESET); //PF9 置 0
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,GPIO_PIN_RESET); //PF10 置 0
Delay(0x7FFFFF);
}
}
上面这段代码,大家如果不方便自己编写,可以直接打开我们光盘库函数源码目录“4,
程序源码标准例程-HAL 库版本实验 0-1 Template 工程模板-新建工程章节使用 ”找到我们已
经新建好的工程模板 USER 目录下面的 main.c 文件,直接复制过来即可。
14)
下面我们点击编译按钮
编译工程,可以看到工程编译通过没有任何错误和警告。
图 3.3.2.32 编译工程
这里大家可能会遇到编译之后会有一个警告,警告的内容是:“warning
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!