目录
一、前言
使用过ARM单片机的朋友肯定听说过CMSIS,可以说CMSIS是开启ARM单片机的金钥匙,是不是想到单片机的启动文件了呢,对的,启动文件只是CMSIS的一部分,你是不是跟我一样对它感到既熟悉又陌生呢?
二、CMSIS标准
CMSIS ( Cortex Microcontroller Software Interface Standard ),翻译过来是ARM Cortex™ 微控制器软件接口标准 。这个标准是谁提的呢?提的这个标准是用来干什么的呢?这里不得不说说ARM和STM32、TI这些公司的关系了,ARM 是一个做芯片标准的公司,它负责的是芯片内核的架构设计,而TI、ST这样的公司,他们并不做标准,他们是芯片公司,他们是根据 ARM 公司提供的芯片内核标准设计自己的芯片。所以,任何一个做 Cortex M3 芯 片 ,他们的内核结构都是一样的,不同的是他们的存储器容量, 片上外设 IO 以及其他模块的区别。
标准是谁提的呢?ARM跟芯片厂商共同提出的,目的就是为了不同芯片厂商生产的Cortex-M3芯片能在软件上基本兼容,各芯片厂商就得按照这个标准去编写自己芯片内核的驱动程序,比如系统函数的命名、芯片初始化启动流程等;STM32的官方库(标准库、HAL库、LL库)就是按照这个标准写的。
这个标准是用来干什么的呢?如下图它向下负责与内核和各个外设直接打交道,向上提供实时操作系统用户程序调用的函数接口。分为 3 个基本功能层:
核内外设访问层:ARM 公司提供的访问,定义处理器内部寄存器地址以及功能函数。
中间件访问层:定义访问中间件的通用 API, 也是 ARM 公司提供。
外设访问层:定义硬件寄存器的地址以及外设的访问函数。
三、CMSIS文件
看完上面的介绍是不是已经晕菜了,看完跟没看一样没看到实际的代码。下面就打开任意一工程下的CMSIS,我以STM32F4xx为例,在路径 \CMSIS\Device\ST\STM32F4xx 下,有Include、Source两个文件,我们主要用到了这两个文件下的微控制器专用头文件、启动代码 。
1、Include文件
在该文件中主要使用了stm32f4xx.h 和 stm32f429xx.h(不同的芯片这个文件不同)。如下图,stm32f429xx.h 头文件中根据该芯片的具体型号,包含了所有外设的寄存器定义和封装内存操作,直接操作这些寄存器就可以控制外设了,使用STM32任何型号的芯片都需要包含这个头文件。而这么多芯片,具体用哪个头文件呢,这个就是在stm32f4xx.h中选择了,具体包含关系为:用户自己添加全局宏定义标识符STM32F429xx ---> stm32f4xx.h根据宏定义选择头文件 ---> stm32f429xx.h引入到工程中
2、Source文件
在该文件中主要用到了 system_stm32f4xx.c、startup_stm32f429xx.s、stm32f429xx_flash.icf。如下图:
startup_stm32f429xx.s |
启动文件的作用主要是进行堆栈的初始化,中断向量表以及中断函数定义等。会设置系统复位后,直接调用 SystemInit函数进行系统初始化。还有一个很重要的作用就是系统复位后引导进入 main函数。 |
system_stm32f4xx.c |
主要是声明和定义了系统初始化函数 SystemInit 以及系统时钟更新函数 SystemCoreClockUpdate。SystemInit函数的作用是进行时钟系统的一些初始化操作以及中断向量表偏移地址设置,但它并没有设置具体的时钟值 |
stm32f429xx_flash.icf |
定义了芯片的FLASH和RAM的起始和结束地址、以及大小 |
STM32单片机的启动流程:
四、总结
CMSIS就是定义了一套芯片外设控制及编写规范的标准。我们在移植一个新的工程时,只需要修改添加这几个文件即可:
1、system_stm32f4xx.c、startup_stm32f429xx.s、stm32f429xx_flash.icf
2、stm32f4xx.h、stm32f429xx.h