> 文章列表 > 零死角玩转stm32初级篇4-初识 STM32 库

零死角玩转stm32初级篇4-初识 STM32 库

零死角玩转stm32初级篇4-初识 STM32 库

本篇博文目录:

      • 一.STM32库开发的相关概念知识
        • 1.什么是 STM32 库?
        • 2.CMSIS 标准
      • 二.STM32 结构及库层次关系
        • 1.库目录,文件简介
        • 2.CMSIS
        • 3.STM32F10x_StdPeriph_Driver
        • 4.STM32F10x_StdPeriph_Template
        • 5.库各文件间的关系
      • 三.使用库帮助文档
        • 1.常用官方资料
        • 2.官网手册的使用

一.STM32库开发的相关概念知识

1.什么是 STM32 库?

STM32 库是由 ST 公司针对 STM32 提供的函数接口即 API(Application Program Interface) ,开发者可调用这些函数接口来配置STM32 的寄存器,使开发人员得以脱离最底层的寄存器操作,有开发快速,易于阅读,维护成本低等优点。实际上, 库是架设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口。库开发方式与直接配置寄存器方式的区别如下图所示。

零死角玩转stm32初级篇4-初识 STM32 库

直接配置寄存器方式的开发速度慢,程序可读性差这二个缺陷往往会影响开发效率,程序维护成本和交流成本,当然在一些特殊场景下我们还是会第一时间选择使用寄存器方式,因为库函数方式通过增加函数层的方式来简化代码,这样的方式会影响执行的速度和占用的资源,所以在一些比较看重执行速度,看重资源占用大小的场景下还是优先使用寄存器方式。

零死角玩转stm32初级篇4-初识 STM32 库

零死角玩转stm32初级篇4-初识 STM32 库

2.CMSIS 标准

我们知道由 ST 公司生产的 STM32 采用的是 Cortex-M3 内核 ,内核是整个微控制器的 CPU。该内核是 ARM 公司设计的一个处理器体系架构。ARM 公司并不生产芯片,而是出售其芯片技术授权。ST 公司或其它芯片生产厂商如 TI,负责设计的是在内核之外的部件,被称为 核外外设 或 片上外设、设备外设 。如芯片内部的模数转换外设 ADC、串口 UART、定时器 TIM 等。内核与外设,如同 PC 上的 CPU 与主板、内存、显卡、硬盘的关系。因为基于 Cortex 的某系列芯片采用的内核都是相同的,区别主要为核外的片上外设的差异,这些差异却导致软件在同内核,不同外设的芯片上移植困难。为了解决不同的芯片厂商生产的 Cortex 微控制器 软件 的兼容性问题,ARM 与芯片厂商建立了 CMSIS 标准(Cortex MicroController Software InterfaceStandard)。

零死角玩转stm32初级篇4-初识 STM32 库

CMSIS 标准中最主要的为 CMSIS 核心层,它包括了:

  • 内核函数层:其中包含用于访问内核寄存器的名称、地址定义,主要由ARM 公司提供。
  • 设备外设访问层:提供了片上的核外外设的地址和中断定义,主要由芯片生产商提供。

零死角玩转stm32初级篇4-初识 STM32 库

可见 CMSIS 层位于硬件层与操作系统或用户层之间,提供了与芯片生产商无关的硬件抽象层,可以为接口外设、实时操作系统提供简单的处理器软件接口,屏蔽了硬件差异,这对软件的移植是有极大的好处的。STM32 的库,就是按照 CMSIS 标准建立的。

二.STM32 结构及库层次关系

1.库目录,文件简介

在这篇博文中我们介绍了如何下载官方的标准库( 零死角玩转stm32初级篇3-从零创建STM32工程模板 ),这里我们以该标准库为例,对标准库进行介绍。

零死角玩转stm32初级篇4-初识 STM32 库

进行解压的标准库文件中,该标准库的所有文件如下:

零死角玩转stm32初级篇4-初识 STM32 库

对于上面的文件,在这篇博文(零死角玩转stm32初级篇3-从零创建STM32工程模板)中进行了简单介绍,如下:

零死角玩转stm32初级篇4-初识 STM32 库

  • Libraries 文件夹下是驱动库的源代码及启动文件

零死角玩转stm32初级篇4-初识 STM32 库

  • CMSIS框架下CM3的二个支持包

零死角玩转stm32初级篇4-初识 STM32 库

  • Project 文件夹下是用驱动库写的例子跟一个工程模板

零死角玩转stm32初级篇4-初识 STM32 库

2.CMSIS

CMSIS文件夹下有多个文件,重点在于CM3这个文件,该文件下有CoreSupport和DeviceSupport这二个文件。

零死角玩转stm32初级篇4-初识 STM32 库

零死角玩转stm32初级篇4-初识 STM32 库

  • CoreSupport

源文件 core_cm3.c 和头文件 core_cm3.h 位于CM3的CoreSupport文件下,它们的作用是为那些采用Cortex-M3 核设计 SOC 的芯片商设计的芯片外设提供一个进入 M3 内核的接口(这两个文件在其它公司的 M3 系列芯片也是相同的,遵守 CMSIS 标准,软件在不同的CM3 芯片的移植工作会变得简单)。

零死角玩转stm32初级篇4-初识 STM32 库

core_cm3.c 文件还有一些与编译器相关条件编译语句,用于屏蔽不同编译器的差异,我们在开发时不用管这部分,有兴趣可以了解一下。里面包含了一些跟编译器相关的信息,如:RealView Compiler (RVMDK),ICC Compiler(IAR),GNU Compiler。

零死角玩转stm32初级篇4-初识 STM32 库

较重要的是在 core_cm3.c 文件中包含了 stdin.h 这个头文件,这是一个ANSI C 文件,是独立于处理器之外的,就像我们熟知的 C 语言头文件 stdio.h文件一样。位于 RVMDK 这个软件的安装目录下,主要作用是 提供一些新类型定义,如:

零死角玩转stm32初级篇4-初识 STM32 库

这些新类型定义屏蔽了在不同芯片平台时,出现的诸如 int 的大小是 16位,还是 32 位的差异。所以在我们以后的程序中,都将使用新类型如int8_t 、int16_t …在稍旧版的程序中还可能会出现如 u8 、u16 、u32 这样的类型,请尽量避免这样使用在这里提出来是因为初学时如果碰到这样的旧类型让人一头雾水,而且在以新的库建立的工程中是无法追踪到 u8 、u16 、u32 这些的定义
的。

  • DeviceSupport

在 DeviceSupport 文件夹下的是启动文件、 外设寄存器定义& 中断向量定义层 的一些文件,这是由 ST 公司提供的。

零死角玩转stm32初级篇4-初识 STM32 库

  • system_stm32f10x.c

system_stm32f10x.c ,是由 ST 公司提供的,遵守 CMSIS 标准。该文件的功能是设置系统时钟和总线时钟, M3 比 51 单片机复杂得多,并不是说我们外部给一个 8M 的晶振,M3 整个系统就以 8M 为时钟协调整个处理器的工作。我们还要通过 M3 核的核内寄存器来对 8M 的时钟进行倍频,分频,或者使用芯片内部的时钟。所有的外设都与时钟的频率有关,所以这个文件的时钟配置是很关键的。system_stm32f10x.c 在实现系统时钟的时候要用到 PLL(锁相环),这就需要操作寄存器,寄存器都是以存储器映射的方式来访问的,所以该文件中包含了 stm32f10x.h 这个头文件。

  • stm32f10x.h

stm32f10x.h 这个文件非常重要,是一个非常底层的文件。所有处理器厂商都会将对内存的操作封装成一个宏,即我们通常说的寄存器,并且把这些实现封装成一个系统文件,包含在相应的开发环境中。这样,我们在开发自己的应用程序的时候只要将这个文件包含进来就可以了。

  • startup 启动文件

零死角玩转stm32初级篇4-初识 STM32 库

arm 文件夹下是由汇编编写的系统启动文件,不同的文件对应不同的芯片型号,在使用时要注意。

零死角玩转stm32初级篇4-初识 STM32 库

arm文件夹下文件名的英文缩写的意义如下(进行选择的时候,要根据自己的芯片进行选择,比如我使用的STM32F103C8T6的FLASH=64K所以应该选择startup_stm32f10x_md.s):

零死角玩转stm32初级篇4-初识 STM32 库

启动文件是任何处理器在上点复位之后最先运行的一段汇编程序。在我们编写的 c 语言代码运行之前,需要由汇编为 c 语言的运行建立一个合适的环境,接下来才能运行我们的程序。所以我们也要把启动文件添加进我们的的工程中去;启动文件的作用如下。

零死角玩转stm32初级篇4-初识 STM32 库

3.STM32F10x_StdPeriph_Driver

STM32F10x_StdPeriph_Driver 文件夹下有 inc (include 的缩写)跟 src (source 的简写)这两个文件夹,这都属于 CMSIS 的 设备外设函数 数 部分。 src 里面是每个设备外设的驱动程序,这些外设是芯片制造商在Cortex-M3 核外加进去的。

零死角玩转stm32初级篇4-初识 STM32 库

在 src 和 inc 文件夹里的就是 ST 公司针对每个 STM32 外设而编写的库函数文件,每个外设对应一个 .c 和 .h 后缀的文件。我们把这类外设文件统称为: stm32f10x_ppp.c 或 stm32f10x_ppp.h 文件,PPP 表示外设名称。如针对模数转换(ADC)外设,在 src 文件夹下有一个 stm32f10x_adc.c源文件,在 inc 文件夹下有一个 stm32f10x_adc.h 头文件,若我们开发的工程中用到了 STM32 内部的 ADC,则至少要把这两个文件包含到工程里。

零死角玩转stm32初级篇4-初识 STM32 库

这两个文件夹中,还有一个很特别的 misc.c 文件,这个文件提供了外设对内核中的 NVIC(中断向量控制器)的访问函数,在配置中断时,我们必须把这个文件添加到工程中。

零死角玩转stm32初级篇4-初识 STM32 库

4.STM32F10x_StdPeriph_Template

STM32F10x_StdPeriph_Template 目录下,存放了官方的一个库工程模板,我们在用库建立一个完整的工程时,还需要添加这个目录下的 stm32f10x_it.c 、stm32f10x_it.h 、stm32f10x_conf.h 这三个文件

零死角玩转stm32初级篇4-初识 STM32 库

  • stm32f10x_it.c

stm32f10x_it.c ,是专门用来编写中断服务函数的,在我们修改前,这个文件已经定义了一些 系统异常 的接口,其它普通中断服务函数由我们自己添加。但是我们怎么知道这些中断服务函数的接口如何写呢?是不是可以自定义呢?答案当然不是的,这些都有可以在汇编启动文件中找到,具体的大家自个看库的启动文件的源码去吧。

  • stm32f10x_conf.h

stm32f10x_conf.h ,这个文件被包含进 stm32f10x.h 文件。是用来配置使用了什么外设的头文件,用这个头文件我们可以很方便地增加或删除上面driver 目录下的外设驱动函数库。如下面的代码配置表示使用了 gpio、rcc、spi、usart 的外设库函数,其它的注释掉的部分,表示没有用到。

零死角玩转stm32初级篇4-初识 STM32 库

stm32f10x_conf.h 这个文件还可配置是否使用 “断言” 编译选项,在开发时使用断言可由编译器检查库函数传入的参数是否正确,软件编写成功后,去掉 “断言” 编译选项可使程序全速运行。可通过定义 USE_FULL_ASSERT或取消定义来配置是否使用断言。

5.库各文件间的关系

下图描述了 STM32 库各文件之间的调用关系,这个图省略了 DSP 核(Cortex-M3 没有 DSP 核)和实时系统层部分的文件关系。在实际的使用库开发工程的过程中,我们把位于 CMSIS 层的文件包含进工程,丝毫不用修改,也不建议修改。对于位于用户层的几个文件,就是我们在使用库的时候,针对不同的应用对库文件进行增删(用条件编译的方法增删)和改动的文件。

零死角玩转stm32初级篇4-初识 STM32 库

三.使用库帮助文档

1.常用官方资料

  • 《stm32f10x_stdperiph_lib_um.chm》

这个就是前面提到的库的帮助文档,在使用库函数时,我们最好通过查阅此文件来了解库函数原型,或库函数的 调用 的方法。也可以直接阅读源码里面的函数的函数说明。

零死角玩转stm32初级篇4-初识 STM32 库

  • 《STM32 参考手册.pdf 》

这个文件相当于 STM32 的 datasheet,它把 STM32 的时钟、存储器架构、及各种外设、寄存器都描述得清清楚楚。当我们对 STM32的库函数的 实现方式 感到困惑时,可查阅这个文件,以直接配置寄存器方式开发的话查阅这个文档的频率会更高。但你会累死。下载链接:https://www.stmcu.com.cn/Designresource/detail/localization_document%20/710001?auto_download=1

零死角玩转stm32初级篇4-初识 STM32 库

  • 《Cortex-M3 权威指南》 宋岩译

该手册详细讲解了 Cortex 内核的架构和特性,要深入了解 Cortex-M3 内核,这是首选,经典中的经典呀。百度网盘下载链接:https://pan.baidu.com/s/1hqEcfEs,内容来源于https://www.jb51.net/books/261914.html。

零死角玩转stm32初级篇4-初识 STM32 库

2.官网手册的使用

所谓库函数,就是 STM32 的库文件中为我们编写好的函数接口,我们只要调用这些库函数,就可以对 STM32 进行配置,达到控制目的。我们可以不知道库函数是如何实现的,但我们调用函数必须要知道 函数的功能 、 可传入的参数及其意义 、和 函数的返回值 ( 类似于Java语言的API帮助文档 ) 。

  • 打开官网手册stm32f10x_stdperiph_lib_um.chm

零死角玩转stm32初级篇4-初识 STM32 库

  • 层层打开文档的目录标签 Modules\\STM32F10x_StdPeriph_Driver,可看到STM32F10x_StdPeriph_Driver 标签下有很多外设驱动文件的名字 MISC、ADC、BKP、CAN 等标签。我们试着查看 ADC 的 初始化库函数(ADC_Init) 看看,继续打开标签\\ADC\\ADC_Exported_Functions\\Functions\\ADC_Init 如下图所示。

零死角玩转stm32初级篇4-初识 STM32 库

利用这个文档,我们即使没有去看它的具体代码,也知道要怎么利用它了。如它的功能是:以 ADC_InitStruct 参数配置 ADC,进行初始化。原型为 voidADC_Init( ADC_TypeDef * ADCx , ADC_Init_TypeDef * ADC_InitStruct)其中输入的参数 ADCx 和 ADC_InitSturct 均为库文档中定义的 自定义数据 类型 ,这两个传入参数均为结构体指针。

  • ADC_TypeDef 这样的类型是什么意思,可以点击函数原型中带下划线的ADC_TypeDef 就可以查看这是什么类型了。

零死角玩转stm32初级篇4-初识 STM32 库