【STM32】STM32固件库(标准外设库)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38410730/article/details/79810216

标准外设库概述

STM32标准外设库是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数库还包括每一个外设的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间API,通过使用固件函数库,无需深入掌握底层硬件细节,开发者就可以轻松应用每一个外设。

因此,使用固态函数库可以大大减少开发者开发使用片内外设的时间,进而降低开发成本。每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。每个器件的开发都由一个通用的标准化的API去驱动。这里介绍的是V3.5版本的外设库,也是迄今最新的版本。

 

STM32F10x标准外设库文件结构

库的下载处是在ST公司的官方网站,下载链接:ST公司官方网站

注意过程中需要下载者注册、登录账号。下载后得到如下压缩包:

解压后,整个标准库的目录结构如下:

下面介绍一下各个文件夹和它的作用:

  • _htmresc:图片文件,给Release_Notes.html文件显示用的,对我们没什么用处;
  • Project:标准外设库驱动的完整例程;
  • Utilities:用于STM32评估板的专用驱动;
  • stm32f10x_stdperiph_lib_um.chm:库函数使用的帮助文档;
  • Libraries:库函数的源文件,这个目录下的文件就是我们要使用的 。

ARM是一家做芯片标准的公司,他们负责的是芯片内核的架构设计,而像ST、三星他们则是根据ARM公司的提供的内核标准设计自己的芯片。所以,任何一个Cortex-M3芯片,其内核结构都是一样的,区别在于他们的存储器容量,片上外设,IO以及其他模块。ARM公司为了能让不同的芯片公司生产的Cortex-M3芯片能在软件上基本兼容,与芯片生产商共同提出CMSIS标准。当然,ST官方库也是根据这套标准设计的。基于CMSIS应用程序的结构体如下:

可见,CMSIS分为3个功能层:

  • 核内外设访问层: ARM公司提供,定义处理器内部寄存器地址以及功能函数 ;
  • 中间件访问层: ARM公司提供,定义访问中间件的API(CPU的调试功能集成于此) ;
  • 器件级外设访问层: 也称片内外设访问层,定义硬件寄存器的地址和外设访问函数 。

CMSIS向下负责与内核和各个外设直接打交道,向上提供实时操作系统用户程序调用的函数接口。若无CMSIS标准,那么各个公司设计的库函数就会不同。 

举个例子,使用STM32的时候首先需要进行初始化,CMSIS标准规定,系统初始化函数的函数名必须是SystemInit,CMSIS还对各个片内外设的驱动文件的文件名规范化、操作函数规范化等,如GPIO_ResetBits函数名。 

Libraries目录下有CMSIS和STM32F10x_StdPeriph_Driver两个目录,这两个目录是函数固件库的核心文件和片内外设操作文件,其中CMSIS目录下面主要存放启动文件,STM32F10x_StdPeriph_Driver放的是STM32的固件库源码文件,inc存放stm32f10x_xxx.h头文件,src目录下存放的是stm32f10x_xxx.c的源代码文件,每一个.c和.h文件对应称为一组文件,每组文件对应一个片内外设,如RCC、IIC。

 

关键目录文件介绍

关键文件位于Libraries目录下:

system_stm32f10x.c和system_stm32f10x.h

Libraries\CMSIS\CM3\CoreSupport下的core_cm3.c、core_cm3.h是CMSIS的核心文件,提供进入Crotex-M3内核的接口,这是由ARTM公司提供的,对所有M3内核的芯片都适用。和CoreSupport目录同级的还用DeviceSupport目录,DeviceSupport\ST\STM32F10x目录下主要存放一些启动文件以及基础的寄存器和中断向量的定义的文件。

system_stm32f10x.c对应的头文件时system_stm32f10x.h,这组文件的功能是设置系统和总线时钟,其间最重要的函数是SystemInit()函数,这个函数是在系统启动时调用的,用来设置整个系统的时钟。在system_stm32f10x.c文件中的开头注释,也明确指明这组文件的作用:

This file provides two functions and one global variable to be called from 
  *     user application:
  *      - SystemInit(): Setups the system clock (System clock source, PLL Multiplier
  *                      factors, AHB/APBx prescalers and Flash settings). 
  *                      This function is called at startup just after reset and 
  *                      before branch to main program. This call is made inside
  *                      the "startup_stm32f10x_xx.s" file.
  *
  *      - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
  *                                  by the user application to setup the SysTick 
  *                                  timer or configure other parameters.
  *                                     
  *      - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
  *                                 be called whenever the core clock is changed
  *                                 during program execution.

通过变量 SystemCoreClock 可以获取系统时钟值,如果系统是 72M 时钟,那么 SystemCoreClock=72000000。 
SystemCoreClockUpdate()用于改变系统时钟后让SystemCoreClock变量更新。

stm32f10x.h

stm32f10x.h这是个关键文件,其间有许多结构体和宏定义,这个文件里面主要是系统寄存器的定义申明以及包装对其的操作。 
如封装can总线相关寄存器的结构体:

typedef struct
{
  __IO uint32_t TIR;
  __IO uint32_t TDTR;
  __IO uint32_t TDLR;
  __IO uint32_t TDHR;
} CAN_TxMailBox_TypeDef;

封装GPIO相关寄存器的结构体:

typedef struct
{
  __IO uint32_t CRL;
  __IO uint32_t CRH;
  __IO uint32_t IDR;
  __IO uint32_t ODR;
  __IO uint32_t BSRR;
  __IO uint32_t BRR;
  __IO uint32_t LCKR;
} GPIO_TypeDef;

追溯__IO的具体类型,在Libraries\CMSIS\CM3\CoreSupport\core_cm3.h宏定义是关键字volatile

#define     __IO    volatile                  /*!< defines 'read / write' permissions */

startup

顾名思义,这个一个存放启动文件的目录:

在startup\arm目录下:

这8个startup打头的.s文件,是针对不同容量的芯片的启动文件,对于f103系列的STM32,主要是用到其中3个启动文件:

startup_stm32f10x_hd.s: 适用于小容量的STM32
startup_stm32f10x_ld.s: 适用于中等容量的STM32
startup_stm32f10x_md.s: 适用于大容量的STM32

这里所谓的容量是指片内Flash的大小,等级划分规则为:

小容量: <= 32K
中等容量: >= 64K && <= 128K
大容量: >= 256K

启动文件的作用在于进行堆栈等初始化,中断向量表以及对应的中断处理函数的定义,启动文件还要引导程序进入main函数。Reset_Handler是唯一实现了的中断处理函数(其他的中断处理函数都是不尽循环)。Reset_Handler是在系统启动时会被调用。

; Reset handler routine
Reset_Handler   PROC
        EXPORT  Reset_Handler   [WEAK]
    IMPORT  __main
    IMPORT  SystemInit
        LDR     R0, =SystemInit
        BLX     R0
        LDR     R0, =__main
        BX      R0
        ENDP

这段汇编代码是在引导进入main函数,同时进入main函数之前,首先调用SystemInit系统初始化函数。

 

展开阅读全文

没有更多推荐了,返回首页