• STM32标准库(固件库)分析


    STM32标准库(固件库)分析

    STM32标准外设库(固件库)概述

    STM32标准外设库之前的版本也称固件函数库或简称固件库,是⼀个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数库还包括每⼀个外设的驱动描述和应⽤实例,为开发者访问底层硬件提供了⼀个中间API,通过使⽤固件函数库,⽆需深⼊掌握底层硬件细节,开发者就可以轻松应⽤每⼀个外设。因此,使⽤固态函数库可以⼤⼤减少⽤户的程序编写时间,进⽽降低开发成本。每个外设驱动都由⼀组函数组成,这组函数覆盖了该外设所有功能。每个器件的开发都由⼀个通⽤API (application programming interface 应⽤编程界⾯)驱动,API对该驱动程序的结构,函数和参数名称都进⾏了标准化。

    使用标准外设库开发的优势

    简单的说,使用标准外设库进行开发最大的优势就在于可以使开发者不用深入了解底层硬件细节就可以灵活规范的使用每一个外设。标准外设库覆盖了从GPIO到定时器,再到CAN、I2C、SPI、UART和ADC等等的所有标准外设。对应的C源代码只是用了最基本的C编程的知识,所有代码经过严格测试,易于理解和使用,并且配有完整的文档,非常方便进行二次开发和应用。

    STM32F10XXX标准外设库结构与⽂件描述

    标准外设库的文件结构(STM32F10x_StdPeriph_Lib_V3.5.0)

    在这里插入图片描述

    文件夹说明
    _htmresc存放CMSIS LOGO图标和ST公司的LOGO图标
    Libraries库源码和启动文件
    ProjectST公司提供的外设驱动例程和标准库工程模板
    UtilitiesST官方评估板的例程,一般不需要用到
    Release_Notes.html库版本更新说明
    stm32f10x_stdperiph_lib_um.chm库使用帮助文档

    在使用标准库开发时,我们需要把Libraries目录下的库函数文件添加到工程中,并查阅库帮助文档来了解ST提供的库函数,这个文档说明了每一个库函数的使用方法。

    Libraries

    灰色底的表示文件夹,白底的表示文件

    在这里插入图片描述

    core_cm3.c、core_cm3.h

    这两个文件位于“Libraries\CMSIS\CM3\CoreSupport”目录下,说明此文件属于CMSIS标准文件,是用来提供进入M3内核的接口文件,属于CMSIS的核心文件,由ARM提供。对于所有M3内核的芯片来说这个文件都是相同的,不需要我们修改。

    CMSIS标准的英文全称是Cortex Microcontroller Software Interface Standard,翻译过来就是ARM Cortex微控制器软件接口标准。因为基于Cortex内核的芯片生产厂商有很多,不只是ST公司。为了解决不同厂家生产的Crotex芯片软件兼容问题,ARM公司和其他芯片厂商制定了这个CMSIS标准。

    在这里插入图片描述

    基于CMSIS标准的软件架构主要分为以下4层:
    用户应用层、操作系统及中间件接口层、CMSIS层、硬件寄存器层。

    其中CMSIS层起着承上启下的作用:

    • 一方面该层对硬件寄存器层进行统一实现,屏蔽了不同厂商对Cortex-M系列微处理器核内外设寄存器的不同定义;
    • 另一方面又向上层的操作系统及中间件接口层和应用层提供接口,简化了应用程序开发难度,使开发人员能够在完全透明的情况下进行应用程序开发。

    其中ARM提供了下列部分:

    内核设备访问层:包含了用来访问内核的寄存器设备的函数。

    中间设备访问层:为软件提供了访问外设的通用方法。芯片供应商应当修改中间设备访问层,以适应中间设备组件用到的微控制器上的外设。

    芯片供应商扩展下列软件层:

    外设访问层:提供片上所有外设定义的函数。

    CMSIS 层在整个系统中是处于中间层,向下负责与内核和各个外设直接打交道,向上提供实时操作系统用户程序调用的函数接口。如果没有 CMSIS 标准,那么各个芯片公司就会设计自己喜欢的风格的库函数,而 CMSIS 标准就是要强制规定,芯片生产公司设计的库函数必须按照 CMSIS 这套规范来设计。

    其实不用这么讲这么复杂的,一个简单的例子,我们在使用 STM32 芯片的时候首先要进行系统初始化,CMSIS 规范就规定,系统初始化函数名字必须为 SystemInit,所以各个芯片公司写自己的库函数的时候就必须用 SystemInit 对系统进行初始化。CMSIS 还对各个外设驱动文件的文件名字规范化,以及函数名字规范化等等一系列规定。比如函数GPIO_ResetBits 这个函数名字也是不能随便定义的,是要遵循 CMSIS 规范的。

    stm32f10x.h

    stm32f10x.h是STM32F10x的头文件,类似于51单片机的reg.51,在开发STM32F10x程序的时候基本上都会调用这个头文件,可见其重要性。此文件内部封装了STM32的总线、内存和外设寄存器等,实现了内核之外的外设寄存器映射,同时该文件还包含了一些时钟相关的定义和中断相关定义等。

    system_stm32f10x.c、system_stm32f10x.h

    system_stm32f10x.h是片上外设接入层系统头文件。主要是申明设置系统及总线时钟相关的函数。与其对应的源文件是system_stm32f10x.c。这个文件里面有一个非常重要的SystemInit()函数申明,这个函数在我们系统启动的时候都会调用,用来设置系统的整个系统和总线时钟。

    startup_stm32f10x_xd.s

    编译器启动文件;在后面创建工程模板时,要将STM32的启动文件添加进来,否则系统不能启动。ST固件库提供的启动文件有多,需根据使用的STM32芯片来选择,若开发板上使用的是高容量的STM32F1芯片,选择startup_stm32f1 0x_hd.s启动文件

    启动文件主要是进行堆栈之类的初始化,中断向量表以及中断函数定义。启动文件要引导进入main 函数

    文件说明
    startup_stm32f10x_ld.sSTM32小容量产品启动文件
    startup_stm32f10x_md.sSTM32中容量产品启动文件
    startup_stm32f10x_hd.sSTM32大容量产品启动文件

    小容量:FALSH<=32K

    中容量:64K<=FLASH<=128K

    大容量:256K<=FLASH

    在startup这个目录下,还有很多文件夹,如"arm"、“gcc_ride7”、“iar”、“TrueSTUDIO”,这些文件夹下包含了对应编译平台的汇编启动文件,在实际使用时要根据编译平台来选择。我们使用的 MDK 启动文件在"arm"文件夹中。

    文件夹说明
    armMDK ARM编译器启动文件
    gcc_ride7GCC编译器启动文件
    iarIAR编译器启动文件
    TrueSTUDIOTrueSTUDIO编译器启动文件

    拓展:TrueSTUDIO(TrueStudio)是意法半导体公司针对STM32开发的一款全新的编译软件。TrueStudio是一个强大的基于Eclipse的C / C++集成开发工具。

    TrueStudio for STM32是一个灵活的、可扩展的IDE和调试STM32单片机的强大工具。TrueStudio基于开放标准(Eclipse和GNU)和扩展代码的专业特点,给系统的结构和动态行为提供了独特的见解。特别是,TrueStudio for STM32开发商提供广泛的选择,系统的分析功能,帮助他们评估从各种角度设计的合理性、包括内存和堆栈的使用,静态分析以及可视化的运行系统的动态行为。TrueStudio除了支持Windows64位操作系统之外,还增加了对Linux系统的支持

    特点:1.免费 2.建立在Eclipse CDT、GCC、GDB 3.项目管理 4.项目向导 5.进口商 6.配置工具 7.cmsis-pack 8.编辑 9.先进的代码编辑 10.导航、重构、样式和结构可视化 11.编译器和构建工具 12.高度优化的C/C++编译器 13.汇编程序、链接器和实用程序 14.内存和堆栈分析器来查找无法识别的bug,研究源代码。 15.具有先进的跟踪、可视化和分析功能的RTOS感知调试器 16.st-link和J-Link的支持 17.错误和问题跟踪系统,如bugzilla,追踪客户,螳螂 18.版本控制系统客户端的颠覆(SVN),Git和CVS 19.源代码审查 20.技术支持

    misc.h、misc.c

    因为STM32 V3.5版本的库函数中没有原来版本中单独对于NVIC(中断向量嵌套)的外设驱动,把NVIC的外设驱动放在了misc.c中,实际上是代替原来的stm32f10x_nvic.c.

    stm32f10x.PPP.h、stm32f10x.PPP.c

    外设驱动函数文件;包括了相关外设的初始化配置和部分功能应用函数,这部分是进行编程功能实现的重要组成部分。

    比如stm32f10x_gpio.c文件,里面已经封装好操作GPIO外设底层的内容,提供给我们使用的是一些API函数。stm32f10x_ppp.h就是对应的头文件。PPP都代指外设名称

    stm32f10x.PPP.c和stm32f10x.PPP.h与下面类似

    在这里插入图片描述

    标准外设库中的主要外设均采用了缩写的形式,通过这些缩写可以很容易的辨认对应的外设。

    缩写外设/单元
    ADC模数转换器
    BKP备份寄存器
    CAN控制器局域网模块
    CEC消费电子控制,如HDMI(高清多媒体接口)
    CRCCRC计算单元
    DAC数模转换器
    DBGMCU调试支持
    DMA直接内存存取控制器
    EXTI外部中断事件控制器
    FLASH闪存存储器
    FSMC灵活的静态存储器控制器
    GPIO通用输入输出
    I2CI2C接口
    IWDG独立看门狗
    PWR电源/功耗控制
    RCC复位与时钟控制器
    RTC实时时钟
    SDIOSDIO接口
    SPI串行外设接口
    TIM定时器
    USART通用同步/异步收发器
    WWDG窗口看门狗

    Project

    在这里插入图片描述

    此文件夹下有2个目录,STM32F10x_StdPeriph_Examples文件夹存放的是ST公司提供的外设驱动例程,在开发过程中可以借鉴这些例程快速构建自己的外设驱动。有时间大家可以看看,里面的编程思路对我们还是很有帮助的。

    STM32F10x_StdPeriph_Templates文件夹存放的是官方的标准库工程模板,我们后面创建自己工程模板的时候就需要复制此文件夹内的几个文件。

    文件说明
    EWARMIAR EWARM的项目模板示例
    MDK-ARMKEIL MDK的项目模板示例
    RIDERaisonance RIDE的项目模板示例
    TrueSTUDIOTrueSTUDIO的项目模板示例

    main.c

    用户程序文件,通过标准外设库提供的接口进行相应的外设配置和功能设计。

    stm32f10x.it.c、stm32f10x.it.h

    stm32f10x_it.c文件用于存放中断函数,不过中断函数也可以放在其他工程文件内,所以这个文件很少操作,对应的stm32f10x_it.h文件是它的头文件。用户可以相应的加入自己的中断程序的代码,对于指向同一个中断向量的多个不同中断请求,用户可以通过判断外设的中断标志位来确定准确的中断源,执行相应的中断服务函数。

    这个文件是专门用来编写中断服务函数的,在我们修改前,这个文件已经定义了一些系统异常(特殊中断)的接口,其它普通中断服务函数由我们自己添加。

    stm32f10x_conf.h

    stm32f10x_conf.h文件是外设驱动配置文件,通过更改包含的外设头文件来选择固件库所使用的外设,在新建程序和进行功能变更之前应当首先修改对应的配置。这个文件被包含进 stm32f10x.h 文件中。

    文件作用说明汇总

    在这里插入图片描述

    在这里插入图片描述

    图中Application.c一般又写成main.c

    用户相关应用文件5个(main.c、stm32f10x.conf.h、stm32f10x_it.c、stm32f10x_it.h、system_stm32f10x.c),无论是哪种开发工具构建的STM32F10x工程,用户的具体应用都只与这5个文件有关。这样,在同一 型号的微控制器上开发不同应用时,不须修改相关开发工具目录下的工程文件,只需要用新写的应用程序文件替换这5个文件即可

    STM32F10xxx标准外设库体系结构图

    在这里插入图片描述

    下面图片是stm32f10xx的库文件关系

    在这里插入图片描述

    STM32F10x_StdPeriph_Lib_V3.5.0目录树

    在这里插入图片描述

    参考:

    https://www.guyuehome.com/37364

    https://blog.51cto.com/dlican/5108811

    https://blog.51cto.com/u_3619476/3731053

  • 相关阅读:
    ​LeetCode解法汇总2678. 老人的数目
    深度学习500问——Chapter03:深度学习基础(2)
    Redis总结(二)
    【开源】基于Vue.js的森林火灾预警系统的设计和实现
    聊一聊国内大模型公司,大模型面试心得、经验、感受
    安全好用性价比高的远程协同运维软件有吗?
    聊聊自动驾驶必须解决哪些感知问题?交通标志识别技术详解
    【C】逆序字符串(俩种递归思路)
    从零开始利用MATLAB进行FPGA设计(一):建立脉冲检测模型的Simulink模型1
    奋斗成就人生!且看十年码农,如何进军阿里——论系统学习的功用
  • 原文地址:https://blog.csdn.net/weixin_46251230/article/details/126464390