STM32库
1、什么是 STM32 库
在 51单片机的程序开发中,我们直接配置 51单片机的寄存器,控制芯片的工作方式,如中断,定时器等。配置的时候,我们常常要查阅寄存器表,看用到哪些配置位,为了配置某功能,该置 1还是置 0。这些都是很琐碎的、机械的工作,因为 51单片机的软件相对来说较简单,而且资源很有限,所以可以直接配置寄存器的方式来开发。
STM32库是由 ST公司针对 STM32提供的函数接口,即 API(Application Program Interface),开发者可调用这些函数接口来配置STM32的寄存器,使开发人员得以脱离最底层的寄存器操作,有开发快速,易于阅读,维护成本低等优点。当我们调用库的 API的时候可以不用挖空心思去了解库底层的寄存器操作,就像当年我们学习 C语言的候,用 prinft()函数时只是学习它的使用格式,并没有去研究它的源码实现,如非必要,可以说是老死不相往来。实际上,库是架设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口。库开发方式与直接配置寄存器方式的区别。
2、为什么采用库来开发
对于 STM32,因为外设资源丰富,带来的必然是寄存器的数量和复杂度的增加,这时直接配置寄存器方式的缺陷就突显出来了:
(1)、开发速度慢
(2)、程序可读性差
这两个缺陷直接影响了开发效率,程序维护成本,交流成本。库开发方式则正好弥补了这两个缺陷。而坚持采用直接配置寄存器的方式开发的程序员,会列举以下原因:
(1)、 更直观
(2)、 程序运行占用资源少
初学 STM32的读者,普遍因为第一个原因而选择以直接配置寄存器的方法来学习。认为这种方法直观,能够了解到是配置了哪些寄存器,怎样配置寄存器。事实上,库函数的底层实现恰恰是直接配置寄存器方式的最佳例子,想深入了解芯片是如何工作的话,只要追踪到库的最底层实现就能理解,相信你会为它严谨、优美的实现方式而陶醉。
3、CMSIS标准
我们知道由 ST公司生产的STM32f407采用的是 Cortex-M4内核,内核是整个微控制器的 CPU。该内核是 ARM 公司设计的一个处理器体系架构。ARM公司并不生产芯片,而是出售其芯片技术授权。ST公司或其它芯片生产厂商如 TI,负责设计的是在内核之外的部件,被称为核外外设或片上外设、设备外设。如芯片内部的模数转换外设ADC、串口UART、定时器 TIM 等。内核与外设,如同 PC上的 CPU与主板、内存、显卡、硬盘的关系。
因为基于 Cortex的某系列芯片采用的内核都是相同的,区别主要为核外的片上外设的差异,这些差异却导致软件在同内核,不同外设的芯片上移植困难。为了解决不同的芯片厂商生产的 Cortex微控制器软件 的兼容性问题,ARM与芯片厂商建立了 CMSIS标准(Cortex MicroController Software InterfaceStandard)。所谓 CMSIS标准,实际是新建了一个软件抽象层。
CMSIS标准中最主要的为CMSIS核心层,它包括了:
(1)、内核函数层:其中包含用于访问内核寄存器的名称、地址定义,主要由ARM公司提供。
(2)、设备外设访问层:提供了片上的核外外设的地址和中断定义,主要由芯片生产商提供。
可见 CMSIS层位于硬件层与操作系统或用户层之间,提供了与芯片生产商无关的硬件抽象层,可以为接口外设、实时操作系统提供简单的处理器软件接口,屏蔽了硬件差异,这对软件的移植是有极大的好处的。STM32的库,就是按照 CMSIS标准建立的
4、库目录、文件简介
各文件夹内容说明见图
Libraries文件夹下是驱动库的源代码及启动文件。
Project文件夹下是用驱动库写的例子跟一个工程模板。
还有一个已经编译好的HTML文件,是库帮助文档,主要讲的是如何使用驱动库来编写自己的应用程序。
在使用库开发时,我们需要把 libraries目录下的库函数文件添加到工程中,并查阅库帮助文档来了解 ST提供的库函数,这个文档说明了每一个库函数的使用方法。
进入 Libraries文件夹看到,关于内核与外设的库文件分别存放在 CMSIS和STM32F10x_StdPeriph_Driver文件夹中。
core_cm3.c文件:内核功能的定义,比如NVIC相关寄存器的结构体
system_stm32f4xx.c:是由 ST 公司提供的,遵守 CMSIS标准。该文件的功能是设置系统时钟和总线时钟, M4比 51单片机复杂得多,并不是说我们外部给一个 8M的晶振,M4整个系统就以 8M为时钟协调整个处理器的工作。我们还要通过 M4核的核内寄存器来对8M的时钟进行倍频,分频,或者使用芯片内部的时钟。所有的外设都与时钟的频率有关,所以这个文件的时钟配置是很关键的。system_stm32f4xx.c在实现系统时钟的时候要用到 PLL(锁相环),这就需要操作寄存器,寄存器都是以存储器映射的方式来访问的,所以该文件中包含了 stm32f4xx.h这个头文件。
stm32f4xx.h:stm32f4xx.h文件stm32f4xx.h这个文件非常重要,是一个非常底层的文件。所有处理器厂商都会将对内存的操作封装成一个宏,即我们通常说的寄存器,并且把这些实现封装成一个系统文件,包含在相应的开发环境中。这样,我们在开发自己的应用程序的时候只要将这个文件包含进来就可以了
startup_stm32f4xx.s:启动文件是任何处理器在上点复位之后最先运行的一段汇编程序。在我们编写的 c语言代码运行之前,需要由汇编为 c语言的运行建立一个合适的环境,接下来才能运行我们的程序。所以我们也要把启动文件添加进我们的的工程中去。
总的来说,启动文件的作用是:
(1)、初始化堆栈指针 SP;
(2)、初始化程序计数器指针 PC;
(3)、 设置堆、栈的大小;
(4)、设置异常向量表的入口地址;
(5)、 配置外部 SRAM作为数据存储器(这个由用户配置,一般的开发板可没有外部 SRAM);
(6)、设置 C库的分支入口__main(最终用来调用 main 函数);
(7)、启动文件还调用了在 system_stm32f4xx.c文件中的SystemIni() 函数配置系统时钟