STM32F1开发指南笔记2----CMSIS标准与ST固件库文件夹解析

一、CMSIS标准

ARM是一个做芯片标准的公司,它负责的是芯片内核的架构设计,而TI,ST这样的公司,他们并不做标准,他们是芯片公司,他们是根据ARM公司提供的芯片内核标准设计自己的芯片。所以,任何一个Cortex-M3芯片,他们的内核结构都是一样的,不同的是他们的存储器容量,片上外设,IO以及其他模块的区别。所以你会发现,不同公司设计的cortex-M3芯片他们的端口数量,串口数量,控制方法这些都是有区别的,这些资源他们可以根据自己的需求理念来设计。同一家公司设计的多种cortex-M3内核芯片的片上外设也会有很大的区别,比如STM32F103RBT和STM32F103ZET,他们的片上外设就有很大的区别。我们可以通过《cortex-M3权威指南》中的一个图来了解一下:
在这里插入图片描述

从上图可以看出,芯片虽然是芯片公司设计,但是内核却要服从ARM公司提出的cortex-M3内核标准了,理所当然,芯片公司每卖出一片芯片,需要向ARM公司交一定的专利费。
既然大家都使用的是cortex-M3内核,也就是说,本质上大家都是一样的,这样ARM公司为了能让不同的芯片公司生产的cortex-M3芯片能在软件上基本兼容,和芯片生产商共同提出了一套CMSIS标准(Cortex Microcontroller Software Interface Standard),翻译过来是“ARM Cortex 微控制器软件接口标准”。ST官方库就是根据这套标准设计的。这里我们又要引用参考资料里面的图片来看看基于CMSIS应用程序基本结构:
在这里插入图片描述
CMSIS分为3个基本功能层
核内外设访问层:ARM公司提供的访问,定义处理器内部寄存器地址以及功能函数。
中间件访问层:定义访问中间件的通用API,也是ARM公司提供。
外设访问层:定义硬件寄存器的地址以及外设的访问函数。
从图中可以看出,CMSIS层在整个系统中是处于中间层,向下负责与内核和各个外设直接打交道,向上提供实时操作系统用户程序调用的函数接口。如果没有CMSIS标准,那么各个芯片公司就会设计自己喜欢的风格的库函数,而CMSIS标准就是要强制规定,芯片生产公司设计的库函数必须按照CMSIS这套规范来设计。
其实不用讲的这么复杂,一个简单的例子,我们在使用STM32芯片的时候首先要进行系统初始化,CMSIS规范就规定,系统初始化函数名字必须为SystemInit,所以各个芯片公司写自己的库函数的时候就必须用SystemInit对系统进行初始化。CMSIS还对各个外设驱动文件的文件名字规范化,以及函数名字规范化等等一系列规定。

二、ST固件库文件夹分析

在这里插入图片描述在这里插入图片描述

libraries文件夹下面有CMSIS和STM32F10x_StdPeriph_Driver两个目录,这两个目录包含固件库核心的所有子文件夹和文件。其中CMSIS目录下面是启动文件STM32F10x_StdPeriph_Driver放的是STM32固件库源码文件。源文件目录下面的inc目录存放的是stm32f10x_xxx.h头文件,无需改动。src目录下面放的是stm32f10x_xxx.c格式的固件库源码文件。每一个.c文件和一个相应的.h文件对应。这里的文件也是固件库的核心文件,每个外设对应一组文件。libraries文件夹里面的文件在我们建立工程的时候都会使用到。

project文件夹下面有两个文件夹。顾名思义,STM32F10x_StdPeriph_Examples文件夹下面存放的ST官方提供的固件实例源码,,在以后的开发过程中,可以参考修改这个官方提供的实例来快速驱动自己的外设,很多开发板的实例都参考了官方提供的例程源码,这些源码对以后的学习非常重要。STM32F10x_StdPeriph_Template文件夹下面存放的是工程模板。

utilities文件下就是官方评估板的一些对应源码,这个可以忽略不看。

根目录中还有一个stm32f10x_stdperiph_lib_um.chm文件,直接打开可以知道,这是一个固件库的帮助文档,这个文档非常有用,只可惜是英文的,在开发过程中,这个文档会经常被使用到。

三、关键文件介绍

下面我们要着重介绍libraries目录下面几个重要的文件。
core_cm3.c和core_cm3.h文件位于\Libraries\CMSIS\CM3\CoreSupport目录下面,这个就是CMSIS核心文件,提供进入M3内核接口,这是ARM公司提供,对所有CM3内核的芯片都一样。你永远都不需要修改这个文件,所以这里我们就点到为止。
和CoreSupport同一级还有一个DeviceSupport文件夹。DeviceSupport\ST\STM32F10xt文件夹下面主要存放一些启动文件以及比较基础的寄存器定义以及中断向量定义的文件。
在这里插入图片描述

这个目录下面有三个文件:system_stm32f10x.c, system_stm32f10x.h以及stm32f10x.h文件。其中system_stm32f10x.c和对应的头文件system_stm32f10x.h文件的功能是设置系统以及总线时钟,这个里面有一个非常重要的SystemInit()函数,这个函数在我们系统启动的时候都会调用,用来设置系统的整个时钟系统。
stm32f10x.h这个文件就相当重要了,只要你做STM32开发,你几乎时刻都要查看这个文件相关的定义。这个文件打开可以看到,里面非常多的结构体以及宏定义。这个文件里面主要是系统寄存器定义声明以及包装内存操作,对于这里是怎样声明以及怎么将内存操作封装起来的,我们在后面的章节“MDK中寄存器地址名称映射分析”中会讲到。
在DeviceSupport\ST\STM32F10x同一级还有一个startup文件夹,这个文件夹里面放的文件顾名思义是启动文件。在\startup\arm目录下。我们可以看到8个startup开头的.s文件。
在这里插入图片描述

这里之所以有8个启动文件,是因为对于不同容量的芯片启动文件不一样。对于103系列,主要是用3个启动文件:
startup_stm32f10x_ld.s :适用于小容量产品
startup_stm32f10x_md.s :适用于中等容量产品
startup_stm32f10x_hd.s :适用于大容量产品
这里的容量是指flash的大小,判断方法如下:
小容量:flash≤32k
中容量:64K≤flash≤128K
大容量:256K≤flash

启动文件到底有什么作用,其实我们可以打开启动文件进去看看。启动文件主要是进行堆栈之类的初始化,中断向量表以及中断函数定义。启动文件要引导进入main函数。Reset_Handler中断函数是唯一实现了的中断处理函数,其他的中断函数基本都是死循环(需要用户根据自己的需求去填充)。Reset_Handler在我们系统启动的时候会调用,下面让我们看看Reset_Handler这段代码:
在这里插入图片描述

这里面要引导进入main函数,同时在进入main函数之前,首先要调用SystemInit系统初始化函数。后面的那个[WEAK]表示这个函数是个弱定义,可以被用户自己写的函数所覆盖,如果用户重新定义了就按照用户的执行,如果用户没有定义就按照系统默认提供的执行。

还有其他几个文件stm32f10x_it.c , stm32f10x_it.h以及stm32f10x_conf.h等文件,这里就不一一介绍。stm32f10x_it.c里面是用来编写中断服务函数的,中断服务函数也可以随意编写在工程里面的任意一个文件里面,个人觉得这个文件没太大意义。
stm32f10x_conf.h文件打开可以看到一堆的#include,这里你建立工程的时候,,可以注释掉一些你不用的外设头文件。

发布了34 篇原创文章 · 获赞 1 · 访问量 1435

猜你喜欢

转载自blog.csdn.net/qq_38958704/article/details/105066191
今日推荐