野火STM32资料
因为基于
Cortex
系列芯片采用的内核都是相同的,区别主要为核外的片上外设的差异, 这些差异却导致软件在同内核,不同外设的芯片上移植困难。为了解决不同的芯片厂商生 产的 Cortex
微控制器软件 的兼容性问题,
ARM
与芯片厂商建立了
CMSIS
标准
(Cortex MicroController Software Interface Standard)。 所谓 CMSIS
标准,实际是新建了一个软件抽象层。见图
10-1
。
![](https://i-blog.csdnimg.cn/blog_migrate/3ec0b8b3f70cdf42d057f6255d71c204.png)
CMSIS
标准中最主要的为
CMSIS
核心层,它包括了:
内核函数层:其中包含用于访问内核寄存器的名称、地址定义,主要由
ARM
公司提
供。
设备外设访问层:提供了片上的核外外设的地址和中断定义,主要由芯片生产商提供。
可见
CMSIS
层位于硬件层与操作系统或用户层之间,提供了与芯片生产商无关的硬件抽象层,可以为接口外设、实时操作系统提供简单的处理器软件接口,屏蔽了硬件差异,这对软件的移植是有极大的好处的。STM32
的库,就是按照
CMSIS
标准建立的。
正点原子STM32资料
STM32
固件库就是函数的集合,那么对这些函数有什么要求呢??这里就涉及到一个 CMSIS
标准的基础知识,这部分知识可以从《
Cortex-M3
权威指南》中了解到, 我们这里只是对权威指南的讲解做个概括性的介绍。经常有人问到 STM32
和
ARM
以及
ARM7 是什么关系这样的问题,其实 ARM
是一个做芯片标准的公司,它负责的是芯片内核的架构设 计,而 TI
,
ST
这样的公司,他们并不做标准,他们是芯片公司,他们是根据
ARM
公司提供的 芯片内核标准设计自己的芯片。所以,任何一个Cortex-M3
芯片,他们的内核结构都是一样的,不同的是他们的存储器容量,片上外设,IO
以及其他模块的区别。所以你会发现,不同公司设计的 Cortex-M3
芯片他们的端口数量,串口数量,控制方法这些都是有区别的,这些资源他们可以根据自己的需求理念来设计。同一家公司设计的多种 Cortex-m3
内核芯片的片上外设也会有很大的区别,比如 STM32F103RBT
和
STM32F103ZET
,他们的片上外设就有很大的区别。我们可以通过《Cortex-M3
权威指南》中的一个图来了解一下:
![](https://i-blog.csdnimg.cn/blog_migrate/8e89a212bcce267d4c83e1e0fc42913c.png)
从上图可以看出,芯片虽然是芯片公司设计,但是内核却要服从
ARM
公司提出的
Cortex-M3内核标准了,理所当然,芯片公司每卖出一片芯片,需要向 ARM
公司交一定的专利费。既然大家都使用的是 Cortex-M3
核,也就是说,本质上大家都是一样的,这样
ARM
公司为了能让不同的芯片公司生产的 Cortex-M3 芯片能在软件上基本兼容,和芯片生产商共同提出了一套标准 CMSIS 标准(Cortex Microcontroller Software Interface Standard) ,翻译过来是“ARM Cortex™ 微控制器软件接口标准”。ST 官方库就是根据这套标准设计的。这里我们又要引用参考资料里面的图片来看看基于 CMSIS 应用程序基本结构:
![](https://i-blog.csdnimg.cn/blog_migrate/435c9f354d84161e131f84703a265ccb.png)
CMSIS
分为
3
个基本功能层:
1)
核内外设访问层:
ARM
公司提供的访问,定义处理器内部寄存器地址以及功能函数。
2)
中间件访问层
:
定义访问中间件的通用
API,
也是
ARM
公司提供。
3)
外设访问层:定义硬件寄存器的地址以及外设的访问函数。
从图中可以看出,
CMSIS
层在整个系统中是处于中间层,向下负责与内核和各个外设直接打交道,向上提供实时操作系统用户程序调用的函数接口。如果没有 CMSIS
标准,那么各个芯片公司就会设计自己喜欢的风格的库函数,而 CMSIS
标准就是要强制规定,芯片生产公司设计的库函数必须按照 CMSIS
这套规范来设计。其实不用这么讲这么复杂的,一个简单的例子,我们在使用 STM32
芯片的时候首先要进行系统初始化,CMSIS
规范就规定,系统初始化函数名字必须为
SystemInit
,所以各个芯片公司写自己的库函数的时候就必须用 SystemInit
对系统进行初始化。
CMSIS
还对各个外设驱动文件的文件名字规范化,以及函数名字规范化等等一系列规定。上一节讲的函数GPIO_ResetBits 这个函数名字也是不能随便定义的,是要遵循
CMSIS 规范的。