STM32中文参考手册
第三章 MDK5软件入门
1.介绍MDK5软件的使用
2.ST官方固件库介绍
3.介绍怎样建立一个基于STM32官方固件库的工程模板
固件库就是函数的集合,固件库的作用就是向下负责与寄存器直接打交道,向上提供用户函数调用的接口(API)。
51开发中我们常常直接操作寄存器,比如要直接控制某些IO口的状态,直接操作寄存器
劣势是需要掌握每个寄存器的用法,才能正确使用STM32,固件库将这些寄存器操作都封装起来,提供一整套接口(API)供开发者调用,大多数场合下,不需要知道操作的是哪个寄存器 ,你只需要知道调用那些函数即可
比如上面的控制 BRR 寄存器实现电平控制,官方库封装了一个函数:
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
GPIOx->BRR = GPIO_Pin;
}
这个时候不需要直接去操作BRR寄存器了,只需要知道怎么使用GPIO_ReseBits()这个函数就可以了,在对外设的工作原理有一定的了解之后,你再去看固件库函数,基本上函数名字能告诉你这个函数的功能是什么,该怎么使用。
任何处理器不论多么高级,归根结底都是要对处理器的寄存器进行操作,但固件库不是万能的,还要了解STM32的原理,了解后,开发才能游刃有余。
3.1.2 STM32固件库与CMSIS标准讲解
STM32就是函数的集合,对这些函数有什么要求?涉及到CMSIS标准的基础知识:
STM32 ARM ARM7是什么关系:ARM 是一个做芯片标准的公司,负责的是芯片内核的架构设计,而TI ST 这样的公司,是芯片公司,根据ARN公司提供的芯片内核标准设计自己的芯片,所以,任何一个做Cortex-M3芯片,他们的内核结构都是一样的,不同的是他们的存储器的容量,片上外设,IO以及其他外设的区别,所以不同公司设计的Cortex-M3芯片他们的端口数量,串口数量,控制方法这些都是有区别的,这些资源他们可以根据自己的需求理念来设计
上图可以看出,芯片是芯片公司设计的,但是内核却要服从ARM公司提出的Crotex-M3内核标准,理所当然,芯片公司每卖出一片芯片,需要向ARM公司交一定的专利费。
都使用Cortex-M3内核,本质上都是一样的,ARM公司为了能让不同芯片公司生产的Cortex-M3芯片在软件上基本兼容,和芯片生产商共同提出了一套CMSIS标准,ARM Coetex-tm微控制器软件接口标准,ST官方库就是根据这套标准设计的, 基于CMSIS应用程序基本结构:
CMSIS分为3个基本功能层:
1.核内外设访问层:ARM公司提供的访问,定义处理器内部寄存器地址以及功能函数
2.中间件访问层:定义访问中间件的通用API,也是ARM公司提供
3.外设访问层:定义硬件寄存器的地址以及外设的访问函数。
CMSIS在图中处于中间层,向下负责与内核和各个外设直接打交道,向上提供实时操作系统用户程序调用的函数接口。如果没有CMSIS标准,那么各个芯片公司就会设计设计自己喜欢的分格的库函数,CMSIS标准就是要强制规定,芯片生产公司设计的库函数必须按照CMSIS这套标准来设计。
举例
在使用STM32芯片的时候首先要进行系统初始化,CMSIS规范就规定,系统初始化函数名字必须为SystemInit,所以各个芯片公司写自己的库函数的时候就必须用SystemInit对系统进行初始化。CMSIS还对各个外设驱动文件的文件名字进行规范化,以及函数名字规范化等等一系列规定。
3.1.3STM32官方库包介绍
讲解ST官方提供的STM32固件库包的结构
3…1.3.1 文件夹介绍
Libraries文件夹下面有CMSIS和STM32F10x_StdPeriph_Driverl两个目录,这两个目录包含固件库核心的所有子文件夹和文件。其中CMSIS目录下面是启动文件,STM32F10x_StdPeriph_Driver放的是STM32固件库源码文件。源文件目录下面的inc目录存放的是stm32f10x_xxx.h头文件,无需改动。src目录下面放的是stm32f10x_xxx.c格式的固件库源码文件。每一个.c文件和一个相应的.h文件对应。这里的文件也是固件库的核心文件,每个外设对应一组文件。
Libraries文件夹里面的文件在我们建立工程的时候都会用到
Project 文件夹下面有两个文件夹,STM32F10x_StdPeriph_Example文件夹下面存放的ST官方提供的固件实例源码,在以后的开发过程中,可以参考修改这个官方提供的实例来快速驱动自己的外设,很多开发板的实例都参考了官方提供的例程源码,这些源码对以后的学习非常重要。STM32F10x_StdPeriph_Template文件夹下存放的是工程模板。
UtiLities文件下就是官方评估板的一些对应源码,这个可以忽略不看‘
根目录中还有一个stm32f10x_stdperiph_lib_um.chm文件,直接打开可以知道,这是一个固件库的帮助文档,这个文档非常有用,在开发过程中,文档会被经常用到。
3.1.3.2 关键文件介绍
着重介绍Libraries目录下面几个重要的文件
core cm3.c 和 core_cm3.h文件位于\CMSIS\CM3\CoreSupport目录下面的,这就是CMSIS的核心文件,提供进入M3内核接口,这是ARM公司提供,对所有CM3内核的芯片都一样,你永远都不需要这个文件。
Coresupport同一级还有一个DeviceSupport文件夹。DeviceSupport\ST\STM32F10xt文件夹下面主要存放一些启动文件以及比较基础的寄存器定义以及中断向量定义的文件。
这个目录下有三个文件:system_stm32f10x.c, system_stm32f10x.h 以及 stm32f10x.h文件,其中:systen_stm32f10x.c和对应的头文件 system_stm32f10x.h文件的功能是设置系统以及总线时钟,这个里面有一个非常重要的SystemInit()函数,这个函数在我们系统启动的时候都会调用,用来设置系统的整个时钟系统。
stm3210x.h这个文件就相当重要了,只要做STM32开发,几乎时刻都要查看这个文件的相关定义,这个文件打开可以看到,里面非常多的结构体以及宏定义。这个文件里面主要是系统寄存器定义声明以及包装内存操作,对于是怎样呢声明怎样将内存操作封装起来,在后面的章节MDK中寄存器地址名称映射分析中会讲到。
在Devicesupport\ST\STM32F10x同一级还有一个startup文件夹,这个文件夹里面放的文件顾明思义是启动文件。在\startup\arm目录下,可以看到8个startup开头的.s文件
之所以有8个启动文件,是因为对于不同容量的芯片启动文件不一样。对于103系列,主要是用其中3个启动文件:
startup_stm32f10x_ld.s: 适用于小容量 产品
startup_stm32f10x_md.s : 适用于中等容量产品
startup_stm32f10x_hd.s: 适用于大容量产品
这里的容量是指FLASH的大小,判断方法如下:
小容量:FLASH<=32K
中容量:FLASH<=128K
大容量:256K《=FLASH
我们ALIENTEK STM32战舰板,精英板以及mini板采用的STM32F103ZET6和stm32F103RCT6
芯片都属于大容量产品,所以我们的启动文件选择 startup_stm32f10x_hd.s,对于中等容量芯片请
选择 startup_stm32f10x_md.s 启动文件,小容量芯片请选择 startup_stm32f10x_ld.s。
启动文件作用,启动文件主要是进行堆栈之类的初始化,中断向量表以及中断函数定义。启动文件要引导进入main函数。Rest_handler中断函数是唯一实现了的中断函数,其他的中断函数基本都是死循环Reset_handler在我们系统启动的时候会调用
Reset_handler的代码:
意思是引导进入main 函数,同时在进入mian函数之前。首先要调用SyatemInit系统初始化函数
还有其他几个文件 stm32f10x_it.c,stm32f10x_it.h 以及 stm32f10x_conf.h 等文件,这里就不
一一介绍。stm32f10x_it.c 里面是用来编写中断服务函数,中断服务函数也可以随意编写在工程
里面的任意一个文件里面,个人觉得这个文件没太大意义。
stm32f10x_conf.h 文件打开可以看到一堆的#include,这里你建立工程的时候,可以注释掉一
些你不用的外设头文件。这里相信大家一看就明白。
3.2 MDK5简介
MDK5由两个部分组成:MDK Core 和 Software Packs.其中,Software Packs 可以独立于工具链进行新芯片支持和中间库的升级
从上图可以看出,MDK Core 又分成四个部分:uVision IDE with Editor(编辑器),ARM
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 组件,大小 350M 左右,相对于 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 这个地址下载,然后进行安装。
3.3 新建基于固件库的MDK5工程模板
这里我们说明一下,Template.uvprojx 是工程文件,非常关键,不能轻易删除。Listings 和 Objects
文件夹是 MDK 自动生成的文件夹,用于存放编译过程产生的中间文件。这里,为了跟 MDK5.1
之前版本工程兼容,我们把两个文件夹删除,我们会在下一步骤中新建一个 OBJ 文件夹,用来
存放编译中间文件。当然,我们不删除这两个文件夹也是没有关系的,只是我们不用它而已。
5) 接下来,我们在 Template 工程目录下面,新建 3 个文件夹 CORE, OBJ 以及
STM32F10x_FWLib。CORE 用来存放核心文件和启动文件,OBJ 是用来存放编译过程文件以及
hex 文件,STM32F10x_FWLib 文件夹顾名思义用来存放 ST 官方提供的库函数源码文件。已有
的 USER 目录除了用来放工程文件外,还用来存放主函数文件 main.c,以及其他包括
system_stm32f10x.c 等等
新建工程模板步骤:1:在桌面新建一个文件夹(位置自定,名称自定)
2。打开KEIL5 Project –>New Uvision Project 然后将目录定位到刚才新建的文件夹下,在这个目录下建立子文件夹USER 然后定位到USER下了文件夹目录下,我们的工程文件就都保存在USER ,工程命名自己定,
3.选择CPU型号
4.,Template.uvprojx 是工程文件,非常关键,不能轻易删除
Listings 和 Objects
文件夹是 MDK 自动生成的文件夹,用于存放编译过程产生的中间文件。这里,为了跟 MDK5.1
之前版本工程兼容,我们把两个文件夹删除,
5. 在工程目录下,新建3个文件夹CORE OBJ FWLIB
CORE是用来存放核心文件和启动文件,OBJ是用来存放编译过程文件以及hex文件,FWLIB是用来存放ST官方提供的库函数源码文件。已有的USER目录除了用来存放工程文件外,还用来存放主函数文件main.c以及其他包括system_stm32f10x.c等等。
6.将官方固件库包里的源码文件复制到工程目录文件夹下 STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver 下面,
将目录下面的 src,inc 文件夹 copy 到我们刚才建立的 STM32F10x_FWLib 文件夹下面
7.固件库包里面相关的启动文件复制到我们的工程目录下 STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport 下面,将文件 core_cm3.c和 文 件 core_cm3.h 复 制 到 CORE 下 面 去
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm 下面,将里面 startup_stm32f10x_hd.s 文件复制到 CORE 下面。这里我们我之前已经解释了不同容量的芯片使用不同的启动文件,我们的芯片 STM32F103ZET6 是大容量芯片
8.复制到USER下 STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x 下面
将里面的三个文件 stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h,复制到我们的 USER目录之下。
STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template 下 面 的 4 个 文 件main.c,stm32f10x_conf.h,stm32f10x_it.c,stm32f10x_it.h 复制到 USER 目录下面。
9.复制完需要的库函数文件后,将这些文件加入到项目中去
CTRL+A是全选快捷键
写代码,如果我们只用到了其中的某个外设,我们就可以不
用添加没有用到的外设的库文件。例如我只用 GPIO,我可以只用添加 stm32f10x_gpio.c 而
其他的可以不用添加。这里我们全部添加进来是为了后面方便,不用每次添加,当然这样
的坏处是工程太大,编译起来速度慢,用户可以自行选择
10.其他具体看中文参考手册和固件库下的创建工程模板很详细