CMSIS 到底是什么?

hegangben
2025-07-04 / 0 评论 / 2 阅读 / 正在检测是否收录...

CMSIS 到底是什么?
先来看看ARM公司对CMSIS的定义:
ARM® Cortex™ 微控制器软件接口标准 (CMSIS) 是 Cortex-M 处理器系列的与供应商无关的硬件抽象层。CMSIS 可实现与处理器和外设之间的一致且简单的软件接口,从而简化软件的重用,缩短微控制器开发人员新手的学习过程,并缩短新设备的上市时间。
软件的创建是嵌入式产品行业的一个主要成本因素。通过跨所有 Cortex-M 芯片供应商产品将软件接口标准化(尤其是在创建新项目或将现有软件迁移到新设备时),可以大大降低成本。
我们知道,不同厂家,比如FSL,ST,Energy Micro等不同厂家的内核都是使用Cortex M,但是这些MCU的外设却大相径庭,外设的设计、接口、寄存器等都不一样,因此,一个能够非常熟练使用STM32软件编程的工程师很难快速地上手开发一款他不熟悉的,尽管是Cortex M内核的芯片。而CMSIS的目的是让不同厂家的Cortex M的MCU至少在内核层次上能够做到一定的一致性,提高软件移植的效率。

  1. CMSIS的结构:
    CMSIS 包含以下组件:
    CMSIS-CORE:提供与 Cortex-M0、Cortex-M3、Cortex-M4、SC000 和 SC300 处理器与外围寄存器之间的接口
    CMSIS-DSP:包含以定点(分数 q7、q15、q31)和单精度浮点(32 位)实现的 60 多种函数的 DSP 库
    CMSIS-RTOS API:用于线程控制、资源和时间管理的实时操作系统的标准化编程接口
    CMSIS-SVD:包含完整微控制器系统(包括外设)的程序员视图的系统视图描述 XML 文件
    此标准可进行全面扩展,以确保适用于所有 Cortex-M 处理器系列微控制器。其中包括所有设备:从最小的 8 KB 设备,直至带有精密通信外设(例如以太网或 USB)的设备。(内核外设功能的内存要求小于 1 KB 代码,低于 10 字节 RAM)。
  2. 框架
    mco6n9q3.png

看上去CMSIS-Core和CMSIS-DSP很好理解,但是CMSIS-RTOS不好理解,这玩意是干嘛的
再看一张图吧:
mco6njyd.png

看了这张图的含义更清楚些,CMSIS-RTOS在用户的应用代码和第三方的RTOS Kernel直接架起一道桥梁,一个设计在不同的RTOS之间移植,或者在不同Cortex MCU直接移植的时候,如果两个RTOS都实现了CMSIS-RTOS,那么用户的应用程序代码完全可以不做修改。

  1. 已经支持的MCU和工具链:
    mco6nz62.png

 
完整的CMSIS文档可以从ARM公司网站下载,大小有100多M字节。
 

  1.   如何使用CMSIS,需要哪些文件,以Freescale Kinetis L系列举例。
    独立于编译器的文件:
    ● Cortex-M3内核及其设备文件(core_cm0.h + core_cm0.c)
    ─ 访问Cortex-M0内核及其设备:NVIC等
    ─ 访问Cortex-M0的CPU寄存器和内核外设的函数
    ● 微控制器专用头文件(device.h)  -  MKL25Z4.h
    ─ 指定中断号码(与启动文件一致)
    ─ 外设寄存器定义(寄存器的基地址和布局)
    ─ 控制微控制器其他特有的功能的函数(可选)
    ● 微控制器专用系统文件(system_device.c)  -- system_MKL25Z4.h + system_MKL25Z4 .c 
    ─ 函数SystemInit,用来初始化微控制器
    --函数 void SystemCoreClockUpdate (void); 用于获取内核时钟频率
    ─SystemCoreClock,该值代表系统时钟频率
    ─ 微控制器的其他功能(可选)
    ● 编译器启动代码(汇编或者C)(startup_device.s)  -  startup_MKL25Z4.s for Keil
    ─ 微控制器专用的中断处理程序列表(与头文件一致)
    ─ 弱定义(Weak)的中断处理程序默认函数(可以被用户代码覆盖)

一、前言

二、CMSIS标准

三、CMSIS文件

1、Include文件

2、Source文件

四、总结

一、前言
使用过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(不同的芯片这个文件不同),如下图

(1)在stm32f429xx.h 头文件包含了该芯片所有外设的寄存器定义和封装内存操作,直接操作这些寄存器就可以控制外设了,使用STM32任何型号的芯片都需要包含这个头文件。

(2)在stm32f4xx.h中会根据芯片型号宏标识符(我这里是STM32F429xx )选择对应的头文件(stm32f429xx.h),如果定义了USE_HAL_DRIVER宏标识符,还会将HAL库外设驱动包含进来,具体包含关系为:

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

3、修改全局宏标识 STM32F429xx

0

评论 (0)

取消