在本任务中,我们先从ST官网下载标准固件库“STM32F4xx_DSP_StdPeriph_Lib_V1.8.0”,然后介绍标准固件库的相关内容,最后建立工程模板。
解压缩下载的标准固件库,可以看到标准固件库中包含的内容,如图2-7所示。
图2-7 标准固件库中包含的内容
标准固件库文件夹下的内容分别为:
➲ _htmresc:该文件夹下存放的是一些图标。
➲ Libraries:该文件夹下存放的是标准固件库的源代码及启动文件。
➲ Project:该文件夹下存放的是标准固件库的示例和工程模板。
➲ Utilities:该文件夹下存放的是基于ST官方实验板的例程,以及第三方软件库,如emWIN图形软件库、FATFS文件系统。
➲ MCD-ST Liberty SW License Agreement V2:该文件是标准固件库的许可(License)说明。
➲ Release_Notes:该文件是标准固件库的版本更新说明。
➲ stm32f4xx_dsp_stdperiph_lib_um:该文件是标准固件库的帮助文件,这是一个已经编译好的HTML文件,主要介绍如何使用标准固件库函数来编写自己的应用程序。
在使用标准固件库函数进行嵌入式系统的开发时,需要把Libraries目录下的标准固件库函数添加到工程中,并查阅标准固件库的帮助文件来了解ST公司提供的标准固件库函数。标准固件库的帮助文件对每一个库函数的使用方法都进行了说明。
进入Libraries文件夹后可以发现,关于内核与外设的库文件分别存放在CMSIS文件夹和STM32F4xx_StdPeriph_Driver文件夹中。
1.CMSIS文件夹
CMSIS文件夹的内容如图2-8所示,其中Device和Include中的文件需要重点学习。
图2-8 CMSIS文件夹
(1)Device文件夹。Device文件夹下存放的是与具体芯片相关的文件,包含启动文件、芯片外设寄存器定义、系统时钟初始化功能等文件,这是由ST公司提供的。Device文件夹中的主要文件如下:
①系统时钟初始化功能文件system_stm32f4xx.c。该文件的路径为“\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates”,该文件包含了STM32系列微控制器在上电后初始化系统时钟、扩展外部存储器时使用的函数,如SystemInit()函数用于上电后初始化时钟,该函数的定义就存储在system_stm32f4xx.c文件中。当STM32F407微控制器在上电后调用SystemInit()函数时,系统时钟将被初始化为168 MHz。如果需要设置为自己所需的时钟频率,则需要修改system_stm32f4xx.c文件的内容。
②启动文件startup_stm32f40_41xxx.s。该文件的路径为“Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm”。Templates文件夹下有很多子文件夹,如“arm”“gcc_ride7”“iar”等,这些子文件夹下包含了对应编译平台的启动文件,在实际使用中需要根据编译平台来选择不同的启动文件。本书使用的MDK启动文件在arm文件夹中,其中的startup_stm32f40_41xxx.s文件就是STM32F407微控制器的启动文件。
③芯片外设寄存器定义文件stm32f4xx.h。该文件的路径是“Libraries\CMSIS\Device\ST\STM32F4xx\Include”。stm32f4xx.h是一个非常重要的文件,它是与STM32系列微控制器底层相关的文件,包含了STM32系列微控制器中的所有外设寄存器地址和结构体类型定义,在使用STM32系列微控制器的标准固件库的地方都要包含这个文件。
(2)Include文件夹。Include文件夹中存放的主要是Cortex-M4内核的通用头文件,这些头文件的作用是为采用Cortex-M内核的芯片外设提供一个内核接口,定义了一些与内核相关的寄存器。至于这些功能是怎样用源码实现的,读者可以不用管它,只需要把这些头文件加入工程文件中即可。
STM32F4的工程必须使用core_cm4.h、core_cmFunc.h、corecmInstr.h和core_cmSimd.h这4个文件,其他的文件是属于其他内核的,还有几个文件是供DSP函数库使用的头文件。
core_cm4.h中有一些与编译器相关的条件编译语句,包含了一些与编译器相关的信息,用于屏蔽不同编译器的差异。例如,__CC_ARM(本书采用的是RVMDK、KEIL)、__GNUC__(GNU编译器)、ICC Compiler(IAR编译器),这些编译器对于在C程序中嵌入汇编程序或内联函数关键字的语法不一样,因此条件编译语句需要使用__ASM、__INLINE宏来定义,从而在不同的编译器中,由宏自动更改到相应的值,实现差异屏蔽。相关的条件编译语句如下:
这里需要说明的是,core_cm4.h中包含了stdint.h。stdint.h是一个ANSI C文件,该文件提供了一些类型定义。在有些程序中,读者可能会看到诸如uint8_t、uint16_t、uint32_t之类的类型,它们通常表示无符号的8位、16位、32位整型数据。但在这里要强调的是,在ANSI C中整型数据是16位的还是32位的,取决于编译器的定义;而在stdint.h中定义了具体的8位、16位、32位、64位整型数据,因此在编程中尽量使用uint8_t、uint16_t等类型。
2.STM32F4xx_StdPeriph_Driver文件夹
STM32F4xx_StdPeriph_Driver文件夹的内容如图2-9所示,其中包括2个文件夹和1个HTML文件。
两个文件夹分别为inc和src,src中存放的是每个外设的驱动,inc中存放的是外设的驱动头文件。src及inc文件夹是STM32系列微控制器标准固件库的主要内容,非常重要。
文件夹src和inc中存放的内容是ST公司针对外设而编写的库函数文件,如图2-10所示。例如,对于I2C总线,在src文件夹下有一个stm32f4xx_i2c.c源文件,在inc文件夹下有一个stm32f4xx_i2c.h头文件,当开发中用到了STM32系列微控制器的I2C总线,则必须把这两个文件包含到工程里。
图2-9 STM32F4xx_StdPeriph_Driver文件夹
图2-10 src和inc文件夹中的主要文件
在文件夹src和inc中,还有一个很特别的文件,即misc.c,这个文件提供了外设对内核NVIC(Nested Vectored Interrupt Controller,内嵌向量中断控制器)的访问函数,在配置中断时,必须把这个文件添加到工程中。
3.Project文件夹
Project文件夹中存放的是ST官方的一个库工程模板,我们在使用标准固件库建立一个完整的工程时,还需要添加该文件夹下的stm32f4xx_it.c、stm32f4xx_it.h和stm32f4xx_conf.h。
stm32f4xx_it.c:该文件是专门用来编写中断服务函数的,这个文件已经定义了一些系统异常(特殊中断)的中断服务函数,其他的中断服务函数需要用户编写。但我们应该怎么编写中断服务函数呢?是不是可以自定义?答案当然是的,这些都可以在汇编启动文件中找到,本书在介绍中断和启动文件时将介绍中断服务函数的编写。
stm32f4xx_conf.h:该文件通常会包含到stm32f4xx.h中。STM32系列微控制器的标准固件库支持STM32F4系列的所有微控制器,但有的微控制器外设比较多,在使用stm32f4xx_conf.h文件时应根据微控制器的型号增加或减少标准固件库的外设文件。通过宏可以指定微控制器的型号。通过stm32f4xx_conf.h文件配置标准固件库外设文件的代码如下:
4.标准固件库中各文件的关系
标准固件库中各文件的关系如图2-11所示,将标准固件库中的文件对应到CMSIS标准架构上,可以帮助读者从整体上把握标准固件库中各文件在工程中的层次或关系。
图2-11 标准固件库中各文件的关系
标准固件库的帮助文件是stm32f4xx_dsp_stdperiph_lib_um.chm,该文件位于“Modules\STM32F4xx_StdPeriph_Driver\”。在STM32F4xx_StdPeriph_Driver中有很多外设驱动文件,如MISC、ADC、CAN、CRC等。标准固件库帮助文件的界面如图2-12所示。
图2-12 标准固件库帮助文件的界面
这里以GPIO接口的位清除函数GPIO_ResetBits()为例进行说明。在标准固件库帮助文件的界面中,选择“GPIO”→“GPIO_Private_Functions”→“GPIO Read and Write”→“Functions”→“GPIO_ResetBits”,即可打开GPIO_ResetBits()函数的说明,如图2-13所示。
图2-13 GPIO_ResetBits()函数的说明
通过帮助文件,我们可以看到GPIO_ResetBits()函数的原型为:
该函数的功能清除选择的接口位数据。该函数的参数有GPIOx和GPIO_Pin,其中,GPIOx表示要控制的GPIO接口;GPIO_Pin表示接口的引脚号,用于指定要控制的引脚。
通过标准固件库的帮助,我们可以初步了解标准固件库函数。标准固件库中的每个函数和变量类型都符合“见名知义”的原则。这样的名称写起来特别长,很容易出错。在开发软件时,可以直接从帮助文件或源文件中复制函数和变量,也可以使用MDK软件中的代码自动补全功能,减少输入量。
工程模板的建立
1.STM32工程管理
要进行工程模板的创建,就要按照一些约定俗成的规定建立工程目录,如图2-14所示。
图2-14 工程目录
➲ CORE:用于存放内核文件,即微控制器的软件接口标准文件。在某些工程模板中,该文件夹有时候会用CMSIS文件夹代替。
➲ FWLIB:用于存放标准固件库函数。
➲ HARDWARE:用于存放外设文件。
➲ SYSTEM:用于存放系统文件。
➲ USR:用于存放用户文件。
……
在创建工程模板时,需要首先建立一个文件夹并命名为工程的名字(如first-template);然后在该文件夹下建立5个子文件夹,分别命名为CORE、FWLIB、HARDWARE、SYSTEM、USR;最后在ST的官网下载并解压缩最新的标准固件库(STM32F4xx_DSP_StdPeriph_Lib_V1.8.0),从标准固件库中选择所需的文件并复制到相应的文件夹中。
(1)在USR文件夹中复制如图2-15所示的文件。
图2-15 在USR文件夹中要复制的文件
➲ main.c:主源文件。
➲ main.h:主库函数。
➲ stm32f4xx_it.c:相关中断的源文件。
➲ stm32f4xx_it.h:相关中断的头文件。
➲ system_stm32f4xx.c:系统的源文件。
➲ system_stm32f4xx.h:系统的头文件。
➲ stm32f4xx_conf.h:外设驱动的配置文件。
(2)SYSTEM文件夹中通常包含以下文件,但这些文件不在标准固件库中,需要用户后续创建。
➲ delay文件:包括delay.c(延时源文件)和delay.h(延时头文件)。
➲ usart文件:包括usart.c(串口源文件)和usart.h(串口头文件)。
……
(3)在CORE(微控制器的软件接口标准文件)文件夹中复制如图2-16所示的文件。
图2-16 在CORE文件夹中要复制的文件
➲ core_cm4.h:内核功能的定义。
➲ core_cmFunc.h:内核核心功能接口头文件。
➲ core_cmInstr.h:包含内核核心专用指令的库文件。
➲ core_cmSimd.h:包含与编译器相关的处理的库文件。
➲ startup_stm32f40_41xxx.s:启动文件。
➲ stm32f4xx.h:头文件。
(4)HARDWARE文件夹中通常包括以下文件,这些文件也是用户后续创建的。
➲ led.c、led.h:外设LED的源文件和头文件。
➲ key.c、key.h:外设KEY的源文件和头文件。
➲ lcd.c、lcd.h:外设LCD的源文件和头文件。
……
(5)在FWLIB文件夹中复制以下内容,如图2-17所示。
图2-17 在FWLIB文件夹中要复制的文件
➲ inc文件夹:标准固件库函数的头文件。
➲ src文件夹:标准固件库函数的源文件。
2.STM32库函数工程模板的建立
打开KEILμVision5,新建工程,命名为first-template,保存在USR文件夹中,如图2-18所示。
图2-18 新建工程
单击“保存”按钮,在弹出的“Select Device for Target”对话框中选择“STM32F407ZGTx”,如图2-19所示。
图2-19 选择“STM32F407ZGTx”
单击“OK”按钮后,在“Manage Run-Time Environment”对话框中跳过固件选择,如图2-20所示。
图2-20 跳过固件选择
单击“OK”按钮后即可完成工程的建立,如图2-21所示。
图2-21 建立好的工程
单击工具条中的“ ”按钮,在弹出的“Manage Project Items”对话框中可以向新建的工程添加文件,如图2-22所示。
图2-22 管理工程
这里在工程中添加USR、CORE、SYSTEM、HARDWARE、FWLIB等文件夹,如图2-23所示。
图2-23 在工程中添加文件夹
单击“Add Files”按钮可以向左边的文件夹添加文件,为每个文件夹添加完文件后单击“OK”按钮,如图2-24所示。
图2-24 在文件夹中添加文件
添加所需文件后的工程如图2-25所示。
图2-25 添加所需文件后的工程
至此,我们就建好了工程,下面对工程进行配置。单击工具条中魔法棒按钮(见图2-26中的方框),即可在弹出的“Options for Target”对话框中配置工程,如图2-26所示。
图2-26 “Options for Target”对话框
选择“Output”选项卡,勾选“Create HEX File”后可以创建hex文件,如图2-27所示。
图2-27 勾选“Create HEX File”
选择“C/C++”选项卡,首先在“Define”中输入“STM32F40_41xxx,USE_STDPERIPH_DRIVER”,这样就可以进行工程的选择性编译;然后在“Include Paths”中添加所有文件夹,以便选择编译路径。工程的选择性编译设置及编译路径设置如图2-28所示。
图2-28 工程的选择性编译设置及编译路径设置
在“Debug”选项卡中选择“ST-Link Debugger”进行下载,如图2-29所示。
图2-29 工程的Debug设置
配置好的工程如图2-30所示。
图2-30 配置好的工程
请自行建立工程,并将具体步骤写在下面的横线上。
步骤:
__________________________________________________
__________________________________________________
__________________________________________________
__________________________________________________