GoDm@'s Blog

ARM-CMSIS简介

版权信息

warning

本文章为博主原创文章。遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。


1. CMSIS是什么

相信使用keil的朋友对“CMSIS”这个词并不陌生,在我们初入门时,并没有深究这个词的含义,只是知道系统启动和这个有关。那他究竟是什么呢?

CMSIS ( Cortex Microcontroller Software Interface Standard ),翻译过来是ARM Cortex™ 微控制器软件接口标准 。简单来说,CMSIS就是 ARM 公司为了解决单片机(MCU)碎片化问题,而强行推行的一套“类 Linux 子系统框架”。

我们都知道,在程序设计中,上层直接依赖底层,代码耦合性非常的严重,底层代码一改,上层不知道要改多少地方,因此我们在程序设计中才会有依赖倒置原则。如果你了解程序设计中的依赖倒置原则,那理解ARM设计这套标准的初衷就不难了。

在早期的 ARM 单片机时代,ST(意法半导体)、NXP(恩智浦)、TI(德州仪器)等厂商都有自己的大爷脾气。大家用的都是 ARM Cortex-M 的内核,但每家定义的寄存器名字、写驱动的方式千奇百怪。代码换个芯片就得重写。所以 ARM 站出来制定了 CMSIS,也就相当于是接口层。

2. CMSIS的几个核心组件

2.1. CMSIS-CORE

ARM 自己设计的 CPU 内核(比如 Cortex-M3/M4/M7)里面带的东西,比如中断控制器(NVIC)、系统滴答定时器(SysTick)、MPU(内存保护单元)以及一些核心寄存器。因为这是 ARM 亲生的,所以 ARM 直接提供写好的 C 语言头文件和内联汇编。你调用的 NVIC_EnableIRQ(),在任何厂家的 Cortex-M 芯片上都是一模一样的,因为所有厂家都依赖它。

2.2. Device Header Files

ARM 规定了一个命名规范,强制要求各家厂商统一数据结构的长相。所有芯片厂商按照这个格式来定义自己外设(UART、SPI、I2C)的寄存器地址和位掩码。比如强制要求叫 UART1->DR,而不能叫 UART1_DATA_REG

2.3. CMSIS-Driver

驱动接口层。这是一个纯粹的接口标准(API 定义)。ARM 定义了一套结构体,里面全都是函数指针。比如对于串口,它规定必须有 InitializeSendReceive 这几个接口。芯片厂商(如 ST)需要提供底层代码去填充这些函数指针。而上层则直接调用这些接口。

2.4. CMSIS-RTOS

这个很简单,由于每种 OS 的创建线程、信号量 API 都不一样。CMSIS-RTOS 提供了一层封装(Wrapper)。 如果你用 CMSIS-RTOS提供的API,不管你底层真正跑的是 FreeRTOS 还是 Keil RTX,你的应用代码都不用改。

3. 使用CMSIS来进行开发

上面的介绍可能带给你一点启发。既然对于所有采用ARMCortex内核的芯片,都支持CMSIS,那我直接用CMSIS提供的接口来进行开发,岂不是直接实现代码大一统?直接无缝切换mcu,代码依然能运行?

理想很丰满,但现实很骨感。如果代码完全不依赖具体硬件,那客户今天用 ST,明天嫌贵就可以无缝切换到其他厂商。像 ST 这样的巨头,为了维持客户粘性,虽然名义上支持 CMSIS-Driver,但他们更主推自己搞的 STM32 HAL 库。
所以在实际单片机开发中,CMSIS-CORE 是百分之百会用到的(大家都认),但 CMSIS-Driver 不一定每一家都完全支持或者好用,很多开发者依然会直接调用厂商提供的专属驱动库。

当然你也可以尝试使用CMSIS来进行开发,也很简单,这里贴一篇文章可以参考:
还在老一套?STM32使用新KEIL5的IDE,全新开发模式RTE介绍及使用_keil rte-CSDN博客


共计约1k字。于2026/03/08首次发布,最后更新于2026/03/08。

本文章为博主原创文章。遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

  1. 1. CMSIS是什么
  2. 2. CMSIS的几个核心组件
    1. 2.1. CMSIS-CORE
    2. 2.2. Device Header Files
    3. 2.3. CMSIS-Driver
    4. 2.4. CMSIS-RTOS
  3. 3. 使用CMSIS来进行开发