历史上的今天
返回首页

历史上的今天

今天是:2025年03月13日(星期四)

正在发生

2019年03月13日 | 【STM32】STM32固件库(标准外设库)

2019-03-13 来源:eefocus

标准外设库概述

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系统初始化函数。

推荐阅读

史海拾趣

固得沃克(GOODWORK)公司的发展小趣事

深圳市固得沃克电子有限公司(GOODWORK)的故事始于2004年,当时公司正式成立,专注于半导体分立器件的研发、生产和销售。公司总部设在深圳,并创立了自主品牌“GK”。这一时期的固得沃克,凭借对技术的执着追求和对市场的敏锐洞察,逐步在电子行业站稳脚跟。公司初期虽面临诸多挑战,但凭借团队的坚持和创新精神,逐渐赢得了客户的信赖,为后续的快速发展奠定了坚实基础。

Broadcom(博通)公司的发展小趣事

2015年,博通迎来了历史性的时刻。安华高科技以170亿美元现金与200亿美元的股票,合计370亿美元并购了博通,使其成为安华高科技的子公司。这一并购不仅使博通获得了更多的资源和支持,也为其后续的快速发展奠定了坚实的基础。此后,博通通过一系列的并购活动,不断扩张其业务范围和市场份额。

Hartmann Codier GmbH公司的发展小趣事

2015年,博通迎来了历史性的时刻。安华高科技以170亿美元现金与200亿美元的股票,合计370亿美元并购了博通,使其成为安华高科技的子公司。这一并购不仅使博通获得了更多的资源和支持,也为其后续的快速发展奠定了坚实的基础。此后,博通通过一系列的并购活动,不断扩张其业务范围和市场份额。

BB公司的发展小趣事

在电子行业竞争日益激烈的背景下,BB公司深知技术创新是企业发展的核心动力。因此,公司投入大量研发资金,积极引进和培养人才,不断推动技术创新。经过多年的努力,BB公司在模拟集成电路领域取得了多项重大突破,推出了一系列具有自主知识产权的创新产品。这些产品不仅提升了BB公司的市场竞争力,也为整个电子行业的发展做出了贡献。

Green Power Solutions公司的发展小趣事
使用合适的工具打开稳压器的外壳,注意不要损坏内部元件。
AND Displays公司的发展小趣事

AND Displays公司自成立以来,一直致力于显示技术的研发与创新。在早期阶段,公司团队就针对当时市场上显示面板的缺陷,进行了一系列技术攻关。经过数年的努力,AND Displays成功开发出了一种新型显示技术,该技术在色彩还原、对比度和响应速度等方面均表现出色,迅速获得了市场的认可。此后,公司不断推出创新产品,满足了消费者对高质量显示面板的日益增长的需求,逐渐在电子行业中崭露头角。

问答坊 | AI 解惑

电路请教

我不接lm324的时候接个电阻电路能稳压到5.1V,但是接上lm324以后电压输出就掉到3.5V左右了,何解? …

查看全部问答>

推荐几款高速单片机,越高越好,越简洁越好,越便宜越好,多多谢谢!

推荐几款高速单片机,越高越好,越简洁越好,越便宜越好,多多谢谢!…

查看全部问答>

vxworks pne问题

1 pne中的ospf协议包如何单独编译; …

查看全部问答>

大家有去过培训机构参加培训吗?

打算换工作,可是越来越觉得自己还有好多东西不懂,想去系统的培训一下。我在网上看了一下,比较中意凌阳(没有在这样做广告的意思),大家有参加过它的嵌入式Linux实战培训班吗?怎么样?或者你有更不错的嵌入式培训学校推荐,越详细越好。…

查看全部问答>

打开SD卡中文件问题

文件系统测试程序  中   打开一个文件  文件地址怎么写  下面红色字体的路径是什么意思void FileSysTest(void *pdata){    int ret, i, j;    HANDLE FHandle;    U8 file_buf[KB(500)];#if 1&n ...…

查看全部问答>

不太急,附件,翻译,,,问下

问下 白纸黑字的单页   实验产品免责声明   关于 第三个 方框中 要求 3 个工作日内 交回的签名 ,   可以给个该页的中文简介?    我不能够 无歧义 的 完整的理解 它。基本意思 有点懂。…

查看全部问答>

proteus8.0新调试功能---革命性的改变

本帖最后由 平湖秋月 于 2013-12-31 11:53 编辑 单步调试和运行结果一目了然…

查看全部问答>

请推荐好的Linux应用开发视频教程

本人做过android,现在想学linux应用开发,为节约时间,请各位推荐好的Linux应用开发视频教程,谢谢!…

查看全部问答>

是科技,是历史,更是传奇故事----趣味电子技术史话之通信技术史持续更新中!

maychang老师新课----趣味电子技术史话之通信技术发展史出炉! :本系列史话讲述了通信从远古到近现代的发展历程,并对历程中各通信技术的基本原理、效率、历史背景做了详实的介绍,其中穿插了许多具有传奇色彩、精彩诙谐的历史故事,寓教于乐。 ...…

查看全部问答>