官网链接, github链接
一、概述
CMSIS英文全称Common Microcontroller Software Interface Standard,☞通用微控制器软件接口标准,适用于基于Arm Cortex处理器的微控制器,为处理器和外围设备、实时操作系统和中间件组件提供接口。
CMSIS是工具、API、框架和工作流程的组合,最初是基于 Arm® Cortex®-M 的处理器的硬件抽象层,后来扩展到支持基于 Arm Cortex-A 的入门级处理器;是由各芯片和软件供应商合作定义,开源。
CMSIS在各种开发工具和微控制器中实现一致的软件层和设备支持,它引入上层定义但是不定义外围标准设备,所以可以用到各种基于 Arm Cortex 处理器的设备上。
CMSIS-Build 支持工作流程并使持续测试和验证更容易。
CMSIS符合 ANSI C (C99) 和 C++ (C++03)。
CMSIS使用C或C++样式注释、符合Doxygen的函数注释。
二、Cortex-M(5.6.0)
CMSIS 支持全系列的Cortex-M 处理器和Armv8-M/v8.1-M 架构
ARM7和ARMV7的区别:
STM32绝大部分是Cortex-M内核,也有少部分包含Cortex-A7(比如:STM32MP)
三、在嵌入式应用程序中使用CMSIS
-
添加以下文件:
- 启动文件startup_.c**:**带有复位处理程序和异常向量,为每个中断实现默认功能,还可能包含用户应用程序的堆栈和堆配置,重置后执行并调用SystemInit
- 系统配置文件 system_.c 和 system_.h:通用设备配置(即用于时钟和总线设置),SystemCoreClock指示 CPU 时钟速度
- 设备头文件 <device.h>:允许访问处理器内核和所有外围设备,包含在所有需要设备访问的源文件中,并且可以存储在所有项目通用的中央包含文件夹中
-
CMSIS 提供的版本只是通用模板。
- 具体设备采用的版本通常由设备供应商通过相应的设备系列包 (DFP) 提供,例如STM32F10x 器件系列的系统配置文件 system_.c 和system_.h是system_stmf10x.c,.h是stm32f10x.h,startup_.s(同.c)是startup_stm32f10x_cl.s
-
大多数 Cortex-M 处理器提供 VTOR 寄存器用于重新映射中断向量
- 关于VTOR:
- Cortex-M 内核(除了CM0)模块 SCB 里有个专门的 VTOR 寄存器用来控制中断向量表首地址,程序运行起来后用户可以配置 SCB->VTOR 寄存器来重设中断向量表地址
- SCB->VTOR 寄存器低 7bit 是保留的(永远0),所以中断向量表首地址一定要是 128 字节(0x80)对齐的,假如向量表大小240字节,需要256字节对齐
- 关于中断向量表重映射:
- 为了动态重分发中断, CM3 允许向量表重定位——从其它地址处开始定位各异常向量。这些地址对应的区域可以是代码区,也可以是 RAM 区。在 RAM区就可以修改向量的入口地址
- 重新映射中断向量表是为了IAP一般是为了IAP
- 可以通过boot0和boot1启动决定地址重映射的一部分(bootloader,ram或flash)
- 关于中断向量表内容、中断向量、中断处理函数
- 中断向量表:
- 每一个中断函数都有一个地址,这个地址是由编译器随机分配的,每一次编译所分配的地址是不固定的。但是由于硬件的限制,中断只能跳转到固定的地方执行程序(具体细节不展开说),这里就产生了一个矛盾,中断函数的地址是不固定的,但是中断又只能跳转到固定的地方。为了解决这一矛盾,就需要在内存中去定义一个地址的列表,这个列表的地址是固定的,列表里面存放中断函数的地址以及跳转到该中断函数地址所在的程序。当中断发生后,就跳转到这个固定的列表,因为列表存放的是中断函数的地址和跳转到该地址的程序,只需执行该程序就能再次跳转到中断函数,从而执行中断。这个中断地址的列表就是中断向量表
- 中断向量表第 0 - 1 个向量比较特殊,是程序初始 SP 和 PC 值
- 中断向量表第 2 - 15 个向量是系统中断,IRQ 编号为 -14 到 -1
- 中断向量表第 16 个向量开始是厂商自定义外设中断,IRQ 编号为 0 到 n
- 中断向量:中断具有优先级,标号越小,优先级越大,把中断函数的地址放到一个数组里面,数组的下标跟优先级对应,数组的下标叫做中断向量
- 中断服务函数:在启动文件执行的时候,内核和每个外设的中断服务函数的地址都是已经确定好的,地址就存放在中断向量表中,而且在启动文件里面已经写好了中断服务函数,只是这些中断服务函数为空,而且带[weak]弱定义,那么我们就需要在C文件里面重新实现这个中断服务函数,用户写这个中断服务函数的时候,函数名必须跟启动文件里面写的中断函数名对应,因为函数名对应的就是中断服务函数的地址,如果中断服务函数名和启动文件的名字不一样,就默认启动文件里面预先写好的空的中断服务函数,而且是一个死循环,程序就会一直卡死在中断服务函数里面
- 中断向量表:
- 关于VTOR:
-
将 CMSIS 与通用 Arm 处理器一起使用
- CMSIS-Pack在RTE_Components.h 中提供了#define CMSIS_header_file** **,让您可以访问项目的设备.h文件。这允许您生成适应设备设置的通用软件组件
- CMSIS 处理器和核心外设文件还允许创建通用库。CMSIS -DSP 库就是此类通用库的示例
- 要构建通用库,请设置定义__CMSIS_GENERIC并包含处理器的相关core_.h CMSIS CPU & Core Access 头文件
- 通过使用core_.h,比如#include “core_cm4.h”,源代码可以进行内核寄存器访问、访问CPU 指令内部函数、SIMD 指令内部函数和调试访问的函数