STM32固件库详解
最近考试较多,教材编写暂停了一下,之前写了很多,只是每一章都感觉不是特别完整,
最近把其中的部分内容贴出来一下,欢迎指正。本文内容基于我对固件库的理解,按照便于理解的顺序进行整理介绍,部分参考了固件库的说明,但是也基本上重新表述并按照我理解的顺序进行重新编写。我的目的很简单,很多人写教程只是告诉你怎么做,不会告诉你为什么这么做,我就尽量吧前因后果都说清楚,这是我的出发点,水平所限,难免有很大的局限性,具体不足欢迎指正。
1.1基于标准外设库的软件开发
1.1.1 STM32标准外设库概述
STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数库还包括每一个外设
的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间API,通过使用固件函数库,
无需深入掌握底层硬件细节,开发者就可以轻松应用每一个外设。因此,使用固态函数库可
以大大减少用户的程序编写时间,进而降低开发成本。每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。每个器件的开发都由一个通用API (applicati on programmi ng
in terface应用编程界面)驱动,API对该驱动程序的结构,函数和参数名称都进行了标准化。
ST公司2007年10月发布了V1.0版本的固件库,MDK ARM3.22之前的版本均支持该库。2008 年6月发布了V2.0版的固件库,从2008年9月推出的MDK ARM3.23版本至今均使用V2.0 版本的固件库。V3.0以后的版本相对之前的版本改动较大,本书使用目前较新的V3.4版本。
1.1.2使用标准外设库开发的优势
简单的说,使用标准外设库进行开发最大的优势就在于可以使开发者不用深入了解底层硬件细节就可以灵活规范的使用每一个外设。标准外设库覆盖了从GPIO到定时器,再到CAN、I2C、SP、UART和ADC等等的所有标准外设。对应的C源代码只是用了最基本的C编程的知识,所有代码经过严格测试,易于理解和使用,并且配有完整的文档,非常方便进行二次
开发和应用。
1.1.3 STM32F10XXX标准外设库结构与文件描述
1.标准外设库的文件结构在上一小节中已经介绍了使用标准外设库的开发的优势,因此对标准外设库的熟悉程度直接
影响到程序的编写,下面让我们来认识一下STM32F10XXX的标准外设库。STM32F10XXX的标准外设库经历众多的更新目前已经更新到最新的 3.5版本,开发环境中自带的标准外设库
为2.0.3版本,本书中以比较稳定而且较新的V3.4版本为基础介绍标准外设库的结构。
可以从ST的官方网站下载到各种版本的标准外设库,首先看一下 3.4版本标准外设库的文
件结构,如图5-3所示。3.0以上版本的文件结构大致相同,每个版本可能略有调整。
首上STM 32F 10x.£ldPe6ph,U b,U3A0
!. _htmr Libraries. ;! e A CMSIS I a-1 cm! ardSvpRrf OtviceSuppor^ & ST -, p j.卡rm gcc_nde7 ,.TrueSHJDlO D&eum?nt>!ion 9 拙IT M 10x_$td t>en p h .Driver j., tnc T Pvojeci t J、STK132f lOw^&td^riph^E ■: jmples * $T M )2f l(hc_Std Pie-rip h_T trnpi^te 亠:” UtflitiM ? “ STMJ2.EVAL Common .STM521O& EVAL 卜STM321DC.EVAL ? STM3210E.EVAL i. STM321W&.EVAL _ L?艙斑《嶄戒戸「母客 图5-3 STM32F10XXX V3.4标准外设库文件结构表5-4中介绍了每个文件夹所包含的主要内容。 Cortex-M处理器系列硬件抽象层,为芯片厂商和中间件供应商提供了简单的处理器软件接 口,简化了软件复用工作,降低了Cortex-M上操作系统的移植难度,并减少了新入门的微 控制器开发者的学习曲线和新产品的上市时间。STM32F10x_StdPeriph_Driver则包括了分别对应包括了所有外设对应驱动函数,这些驱动函数均使用C语言编写,并提供了统一的易于 调用的函数接口,供开发者使用。Project文件夹中则包括了ST官方的所有例程和基于不同 编译器的项目模板,这些例程是学习和使用STM32的重要参考。Utilities包含了相关评估板的示例程序和驱动函数,供使用官方评估板的开发者使用,很多驱动函数同样可以作为学习的重要参考。 STM32F10xxx标准外设库体系结构如图5-4所示。图中很好的展示了各层以及具体文件之间 的联系,各文件的具体功能说明如表5-5所示。 P㈣YK治1 by ARM ■ on WE" ◎誣典命m应才毎自 图5-4 STM32F10xxx标准外设库体系结构 2.基于CMSIS标准的软件架构 根据调查研究,软件开发已经被嵌入式行业公认为最主要的开发成本。对于ARM公司来说, 一个ARM内核往往会授权给多个厂家,生产种类繁多的产品,如果没有一个通用的软件接口标准,那么当开发者在使用不同厂家的芯片时将极大的增加了软件开发成本,因此,ARM 与Atmel、IAR、Keil、hami-nary Micro、Micrium、NXP、SEGGEF和ST等诸多芯片和软件厂商合作,将所有Cortex芯片厂商产品的软件接口标准化,制定了CMSIS标准。此举意在降 低软件开发成本,尤其针对新设备项目开发,或者将已有软件移植到其他芯片厂商提供的基 于Cortex处理器的微控制器的情况。有了该标准,芯片厂商就能够将他们的资源专注于产品外设特性的差异化,并且消除对微控制器进行编程时需要维持的不同的、互相不兼容的标 准的需求,从而达到降低开发成本的目的。 如图5-5所示,基于CMSIS标准的软件架构主要分为以下4层:用户应用层、操作系统及 中间件接口层、CMSIS层、硬件寄存器层。其中CMSIS层起着承上启下的作用:一方面该层对硬件寄存器层进行统一实现,屏蔽了不同厂商对Cortex-M系列微处理器核内外设寄存器 的不同定义;另一方面又向上层的操作系统及中间件接口层和应用层提供接口,简化了应用 程序开发难度,使开发人员能够在完全透明的情况下进行应用程序开发。也正是如此,CMSIS 层的实现相对复杂。 图5-5 CMSIS 标准的软件架构 层主要分为以下3个部分: (1)核内外设访问层(CPAL Core Peripheral Access Layer ):该层由 ARM 负责实现。包括对 寄存器名称、地址的定义,对核寄存器、 NVIC 、调试子系统的访问接口定义以及对特殊用途 寄存器的访问接口(例如: CONTROL xPSR)定义。由于对特殊寄存器的访问以内联方式定 义,所以针对不同的编译器 ARM 统一用来屏蔽差异。该层定义的接口函数均是可重入的。 ⑵片上外设访问层(DPAL, Device Peripheral Access Layer ):该层由芯片厂商负责实现。该 层的实现 与 CPAL 类似,负责对硬件寄存器地址以及外设访问接口进行定义。该层可调用 CPAL 层提供的接口函数同时根据设备特性对异常向量表进行扩展,以处理相应外设的中断 请求。 ⑶ 外设访问函数 (AFR Access Functions for Peripherals ):该层也由芯片厂商负责实现, 主要 是提供访问片上外设的访问函数,这一部分是可选的。 对一个Cortex-M 微控制系统而言,CMSIS 通过以上三个部分实现了: I 定义了访问外设寄存器和异常向量的通用方法; I 定义了核内外设的寄存器名称和核异常向量的名称; I 为RTOS 核定义了与设备独立的接口,包括 Debug 通道。 这样芯片厂商就能专注于对其产品的外设特性进行差异化,并且消除他们对微控制器进 行编程时需要维持的不同的、互相不兼容的标准需求,以达到低成本开发的目的。 CMSIS 中 的具体文件结构如表 5-6所示。 表 5-6 CMSIS 文件夹结构 CMSIS Core Docume ntati on CMSIS 文 档 应用堆f? 州户 本文件夹包含STMFIOxxx CMSIS文件:微控制器外设访问层和内核设备访问 层: core_cm3.h : CMSIS 的 Cortex-M3内核设备访问 层头文件 core_cm3.c : CMSIS 的 Cortex-M3内核设备访问 层源文件 stm32f10x.h : CMSIS 的 Cortex-M3 STM32f10xxx 微 控制器外设访问层头文件 system_stm32f10x.h : CMSIS 的Cortex-M3 STM32f10xxx微控制器外 设访问层头文件 system_stm32f10x.c CMSIS 的Cortex-M3 STM32f10xxx微控制器外 设访问层源文件 在实际开发过程中,根据应用程序的需要,可以采取2种方法使用标准外设库(StdPeriph_Lib): (1) 使用外设驱动:这时应用程序开发基于外设驱动的API应用编程接口)。用户只需要配置文件” stm32f10x_conf.h,"并使用相应的文件” stm32f10x_ppp.h/.c 即可。 (2) 不使用外设驱动:这时应用程序开发基于外设的寄存器结构和位定义文件。 这两种方法的优缺点在使用标准外设库开发的优势”小节中已经有了具体的介绍,这里仍要说明的是,使用使用标准外设库进行开发可以极大的减小软件开发的工作量,也是目前嵌入 式系统开发的一个趋势。 标准外设库(StdPeriph_Lib)支持STM32F10xxx系列全部成员:大容量,中容量和小容量产品。 从表5-6中也可以看出,启动文件已经对不同的系列进行了划分,实际开发中根据使用的 STM32产品具体型号,用户可以通过文件” stm32f10x.h中的预处理define或者通过开发环境中的全局设置来配置标准外设库(StdPeriph_Lib),一个define对应一个产品系列。 下面列出支持的产品系列 STM32F10x_LD STM32 小容量产品 STM32F10x_MD: STM32 中容量产品 STM32F10x_HD: STM32 大容量产品 在库文件中这些define的具体作用范围是: l文件“ stm3210f.h中的中断IRQ定义 l启动文件中的向量表,小容量,中容量,大容量产品各有一个启动文件 l外设存储器映像和寄存器物理地址 l产品设置:外部晶振(HSE的值等 l系统配置函数 因此通过宏定义这种方式,可以使标准外设库适用于不同系列的产品,同时也方便与不同产 品之间的软件移植,极大的方便了软件的开发。 1.1.4 STM32F10XXX标准外设库的使用 标准外设库中包含了众多的变量定义和功能函数,如果不能了解他们的命名规范和使用规律 将会给编程带来很大的麻烦,本节将主要叙述标准外设库中的相关规范,通过这些规范的学 习可以更加灵活的使用固件库,同时也将极大增强程序的规范性和易读性,同时标准外设库 中的这种规范也值得我们在进行其他相关的开发时使用和借鉴。 1.缩写定义 标准外设库中的主要外设均采用了缩写的形式,通过这些缩写可以很容易的辨认对应的外设。