STM32——STM32库结构详解

       STM32库是由ST公司针对STM32提供的函数接口,即API(application program interface),开发者可以调用这些函数接口来配置STM32的寄存器,脱离最底层的寄存器操作,使开发高效、阅读方便、维护成本低。

       实际上,库是架设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口。

123
库开发与直接配置寄存器方式的区别

1.为什么使用库开发

       因为STM32外设资源丰富,带来的必然是寄存器数量和复杂程度的增加,这是直接配置寄存器就会有如下缺点:

(1)开发速度慢

(2)程序可读性差

       这两个缺点直接影响了开发效率,程序维护成本,交流成本。采用寄存器开发能够让开发更直观,程勋运行占用资源少。库函数的底层实现恰恰是直接配置寄存器方式的最佳例子,想深入了解芯片是如何工作的,只需要追踪到库的最底就能理解。

       库就是建立了一个新的软件抽象层,库的优点就是分层的优点,库的缺点,也是软件分层带来的缺点。

C语言与汇编语言、库与寄存器开发的区别
C语言与汇编语言、库与寄存器开发的区别

2.寄存器结构及库层次关系

2.1CMSIS标准

       我们知道由ST公司生产的STM32采用的是Cotex—M3内核,内核是整个微控制器的CPU。该内核是ARM公司设计的一个处理器体系架构。ARM公司并不生产芯片,而是出售其芯片技术授权。ST公司或其他芯片生产厂商如TI,负责设计的是在内核之外的部件,被称为核外外设或片上外设、设备外设。如芯片内部的模数转换外设ADC、串口UART。定时器TIM等。内核与外设,如同PC上的CPU与主板、内存、显卡、硬盘之间的关系。

       因为基于cortex的某系列芯片采用的内核都是相同的区别主要为核外的片上外设的差异,这些差异缺导致软件在同内核,不同外设的芯片上移植困难。为了解决不同的芯片厂商生产的cortex微控制器软件的兼容性问题,ARM与芯片厂商建立了CMSIS标准(cortex microcontroller software interface standard),所谓CMSIS标准,实际是新建了一个软件抽象层

CMSIS架构

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

(1)内核函数层:其中包含用于访问内核寄存器的名称,地址定义,主要由ARM公司提供。

(2)设备外设访问层:提供了片上的核外外设的地址和中断定义,主要由芯片生产商提供。

2.2库文件简介

        从ST官网可以获得STM32的3.5版库。 

(1)Libraries文件夹是驱动库的源代码及启动文件。

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

       在使用库开发是,我们需要吧libraries目录下的库函数文件添加到工程中,并查阅库帮助文档(Release_Notes.html)来了解ST提供的库函数,这个文档说明了每一个库函数的使用方法。

2.2.1 core_cm3.c文件

       在coreSupport中的是位于CMSIS标准的内核设备函数层的M3核通用的源文件core_cm3.c和头文件core_cm3.h,他们的作用是为那些采用Cortex-M3核设计SOC的芯片商设计的芯片外设提供一个进入M3内核的接口。这两个文件在其他公司的M3系列芯片也是相同的。

       core_cm3.c文件中包含了stdin.h这个文件,这是一个ANSI C文件,是独立于处理器之外的,就像我们熟知的C语言头文件stdio.h文件一样。

        core_cm3.c跟启动文件一样都是底层文件,都是由ARM公司提供的,遵守CMSIS标准,即所有芯片的库文件都带有这个文件,这样软件在不同的CM3芯片的移植工作就得以简化。

2.2.2 system_stm32f10x.c文件

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

startup文件夹是各种STM32型号的启动文件;

stm32f10x.h文件是定义寄存器的地址及使用的结构体封装;

system_stm32f10x.c文件是设备外设访问层,主要配置时钟频率;

system_stm32f10x.h文件是配置时钟频率相应的头文件。

       system_stm32f10x.c,是由ST公司提供的,遵守CMSIS标准。改文件的功能是设置系统时钟和总线时钟,M3比51单片机复杂得多,并不是说我们外部给一个8M的晶振,M3整个系统就以8M的时钟进行倍频,分频,或者使用芯片内部的时钟。所有的外设与时钟的频率有关,所以这个文件的时钟配置是很关键的。

        system_stm32f10x.c在实现系统时钟的时候要用到PLL(锁相环),这就需要操作寄存器,寄存器都是以存储器映射的方式来访问的,所以该文件中包含了stm32f10x.h这个头文件。

2.2.3 stm32f10x.h文件

stm32f10x.h这个 文件非常重要,是一个非常底层的文件。

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

2.2.4启动文件

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

 文件名的英文缩写的意义如下:

cl:互联型产品, stm32f105/107 系列
vl:超值型产品, stm32f100 系列
xl:超高密度(容量) 产品, stm32f101/103 系列
ld:低密度产品, FLASH 小于 64K
md:中等密度产品, FLASH=64 or 128
hd:高密度产品, FLASH 大于 128
启动文件是任何处理器在上复位之后最先运行的一段汇编程序。在我们编写的C语言代码运行之前,需要由汇编为C语言的运行建立一个合适的环境,接下来才能运行我们的程序。

启动文件的作用:

(1)初始化堆栈指针SP;

(2)初始化程序计数器指针PC;

(3)设置堆、栈的大小;

(4)设置异常向量表的入口地址;

(5)配置外部SRAM作为数据存储器(这个由用户配置,一般的开发板可没有外部SRAM);

(6)设置C库的分支入口_main(最终用来调用main函数);

(7)在3.5版的启动文件还调用了在system_stm32f10x.c文件中的SystemInit()函数配置系统时钟,在旧版的工程中要用户进入main函数自己调用SystemInit()函数。

2.2.5 STM32F10x_StdPeriph_Driver 文件夹

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

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

 2.2.6 stm32f10x_it.c、 stm32f10x_conf.h 文件

 我们在用库建立一个完整的工程时,还需要添加stm32f10x_it.c、 stm32f10x_it.h、stm32f10x_conf.h 这三个文件。

stm32f10x_it.c,是专门用来编写中断服务函数的,在我们修改前,这个文件已经定义了一些系统异常的接口,其他普通中断服务函数由我们自己添加。这些中断函数不可以自己定义,可以在汇编启动文件中找到。

 stm32f10x_conf.h,这个文件被包含进stm32f10x.h,是用来配置是用来什么外设的头文件,用这个头文件我们可以很方便的增加或删除上面driver目录下的外设驱动函数库。

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

2.3 库各文件间的关系

 

 库文件直接包含进工程即可,丝毫不用修改,而有的文件就要我们在使用的时候根据具体的需要进行配置。在实际的使用库开发工程的过程中,我们把位于CMSIS层的文件包含进工程丝毫不用修改,也不建议修改。针对位于用户层的几个文件,就是我们在使用库的时候,针对不同的应用对库文件进行增删(用条件编译的方法增删)和改动的文件。

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值