ARM公司:
ARM 是一个做芯片标准的公司,它负责的是芯片内核的架构设计
芯片公司:
TI, ST 他们并不做标准,他们是芯片公司,他们是根据 ARM 公司提供的芯片内核标准设计自己的芯片。所以,任何一个做 Cortex-M3 芯片,他们的内核结构都是一样的,不同的是他们的存储器容量,片上外设, IO 以及其他模块的区别。所以你会发现,不同公司设计的 Cortex-M3 芯片他们的端口数量,串口数量,控制方法这些都是有区别的,这些资源他们可以根据自己的需求理念来设计。同一家公司设计的多种 Cortex-m3 内核芯片的片上外设也会有很大的区别,比如 STM32F103RBT 和 STM32F103ZET,他们的片上外设就有很大的区别。
ARM 公司为了能让不同的芯片公司生产的 Cortex-M3 芯片能在软件上基本兼容,和芯片生产商共同提出了一套标准 CMSIS 标准(Cortex Microcontroller Software Interface Standard) ,翻译过来是
“ARM Cortex™ 微控制器软件接口标准”。 ST 官方库就是根据这套标准设计的。这里我们又要引用参考资料里面的图片来看看基于 CMSIS 应用程序基本结构
CMSIS 分为 3 个基本功能层:
1) 核内外设访问层: ARM 公司提供的访问,定义处理器内部寄存器地址以及功能函数。
2) 中间件访问层:定义访问中间件的通用 API,也是 ARM 公司提供。
3) 外设访问层:定义硬件寄存器的地址以及外设的访问函数。
从图中可以看出, CMSIS 层在整个系统中是处于中间层,向下负责与内核和各个外设直接打交道,向上提供实时操作系统用户程序调用的函数接口。如果没有 CMSIS 标准,那么各个芯片公
司就会设计自己喜欢的风格的库函数,而 CMSIS 标准就是要强制规定,芯片生产公司设计的库函数必须按照 CMSIS 这套规范来设计。
其实不用这么讲这么复杂的,一个简单的例子,我们在使用 STM32 芯片的时候首先要进行系统初始化, CMSIS 规范就规定,系统初始化函数名字必须为 SystemInit,所以各个芯片公
司写自己的库函数的时候就必须用 SystemInit 对系统进行初始化。 CMSIS 还对各个外设驱动文件的文件名字规范化,以及函数名字规范化等等一系列规定。上一节讲的函数
GPIO_ResetBits 这个函数名字也是不能随便定义的,是要遵循 CMSIS 规范的。
(1)_htmresc文件夹内是官方Logo图片,可以忽略。
(2)Libraries 文件夹下面有 CMSIS 和 STM32F4xx_StdPeriph_Driver 两个目录,这两个目录包含固件库核心的所有子文件夹和文件,是代码移植的重头戏。
① CMSIS 文件夹存放的是符合 CMSIS 规范的一些文件。其中CoreSupport下的core_cm3.c 和 core_cm3.h,这个就是 CMSIS 核心文件,提供进入 M3 内核接口,这是 ARM 公司提供,对所有 CM3 内核的芯片都一样;而DeviceSupport下有 启动文件, system_stm32f10x.c, system_stm32f10x.h 以及 stm32f10x.h 文件
stem_stm32f10x.c 和对应的头文件 system_stm32f10x.h 文件的功能是设置系统以及总线时钟,这个里面有一个非常重要的 SystemInit()函数,这个函数在我们系统启动的时候都会调用,
用来设置系统的整个时钟系统。
stm32f10x.h 这个文件就相当重要了,只要你做 STM32 开发, 你几乎时刻都要查看这个文件相关的定义。这个文件打开可以看到,里面非常多的结构体以及宏定义。 这个文件里面主要
是系统寄存器定义申明以及包装内存操作, 对于这里是怎样申明以及怎样将内存操作封装起来的,我们在后面的章节“MDK 中寄存器地址名称映射分析”中会讲到。
②Driver 文件夹下是STM32F4 标准外设固件库源码文件和对应的头文件,说白了就是将寄存器封装好的函数接口。
(3)Project 文件夹下面有STM32F4xx_StdPeriph_Examples 和STM32F4xx_StdPeriph_Template 两个文件夹,Examples文件夹下是固件示例源码,Template文件夹下是工程模板。
(4)Utilities 文件夹下就是官方评估板的一些对应源码,可以忽略不看。
根目录中还有一个固件库的帮助文档 stm32f4xx_dsp_stdperiph_lib_um.chm 文件。