CMSIS详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

从图 4-2 可以看到,基于 CMSIS 标准的软件架构主要分为以下四层:用户应用层,操 作系统层,CMSIS 层以及硬件寄存器层。其中 CMSIS 层起着承上启下的作用,一方面该 层对硬件寄存器层进行了统一的实现,屏蔽了不同厂商对 Cortex-M 系列微处理器核内外设 寄存器的不同定义, 另一方面又向上层的操作系统和应用层提供接口,简化了应用程序开发 的难度,使开发人员能够在完全透明的情况下进行一些应用程序的开发。也正是如此, CMSIS 层的实现也相对复杂,下面将对 CMSIS 层次结构进行剖析。 CMSIS 层主要分为以下 3 个部分: � 核内外设访问层( CPAL, Core Peripheral Access Layer) : 该层由 ARM 负责实现。 包括对寄存器名称、地址的定义,对核寄存器、NVIC、调试子系统的访问接口定 义以及对特殊用途寄存器的访问接口(例如:CONTROL,xPSR)定义。由于对 特殊寄存器的访问以内联方式定义, 所以针对不同的编译器 ARM 统一用__INLINE 来屏蔽差异。该层定义的接口函数均是可重入的。 � 片上外设访问层(DPAL, Device Peripheral Access Layer) :该层由芯片厂商负责 实现。 该层的实现与 CPAL 类似, 负责对硬件寄存器地址以及外设访问接口进行定 义。该层可调用 CPAL 层提供的接口函数同时根据设备特性对异常向量表进行扩 展,以处理相应外设的中断请求。 � 外设访问函数( AFP, Access Functions for Peripherals) :该层也由芯片厂商负责 实现,主要是提供访问片上外设的访问函数,这一部分是可选的。 对一个 Cortex-M 微控制系统而言,CMSIS 通过以上三个部分实现了: � � � 定义了访问外设寄存器和异常向量的通用方法; 定义了核内外设的寄存器名称和核异常向量的名称; 为 RTOS 核定义了与设备独立的接口,包括 Debug 通道。

数据类型及 IO 类型限定符
HAL 层使用标准 ANSI C 头文件 stdint.h 定义的数据类型。 IO 类型限定符用于指定外设 寄存器的访问限制,定义如表 4-1 所列。
表 4-1 IO 类型限定符 IO 类型限定符 __I __O __IO #define Volatile const volatile volatile 描述 只读 只写 读写
1111cmsiscmsiscmsiscmsis标准标准标准标准arm公司于2008年11月12日发布了armcortex微控制器软件接口标准cmsis10cmsis是独立于供应商的cortexm处理器系列硬件抽象层为芯片厂商和中间件供应商提供了简单的处理器软件接口简化了软件复用工作降低了cortexm上操作系统的移植难度并减少了新入门的微控制器开发者的学习曲线和新产品的上市时间
对于 Cortex M0 处理器,在头文件 core_cm0.h 中定义:
#define __CORTEX_M (0x00)

工具链
CMSIS 支持目前嵌入式开发的三大主流工具链,即 ARM ReakView ( armcc ) , IAR EWARM(iccarm)以及 GNU 工具链(gcc) 。通过在 core_cm0.c 中的如下定义,来屏蔽 一些编译器内置关键字的差异。
4.1.3 CMSIS 文件结构
CMSIS 标准的文件结构如图 4-3 所示,下面将对其中各文件作简要介绍。
图 4-3 CMSIS 文件结构

device.h
device.h 由芯片厂商提供,是工程中 C 源程序的主要包含文件。其中“device ”是指 处理器型号,例如 STM32F10x 系列处理器对应的头文件是 stm32f10x.h。它包含: � 中断号的定义。提供所有内核及处理器定义的所有中断及异常的中断号 (IRQn)。 例如 stm32f10x 处理器,中断号定义如下:
推荐规范 定义核寄存器、外设寄存器和 CPU 指令名称时使用大写。 定义外设访问函数、中断函数名称时首字母大写。 对于某个外设相应的函数,一般用该外设名称作为其前缀。 按照 Doxygen 规范撰写函数的注释, 注释使用 C90 风格(/* 注释 */) 或者 C++ 风格(// 注释),函数的注释应包含以下内容: � � � � 一行函数简介; 参数的详细解释; 返回值的详细解释; 函数功能的详细描述。
4.1 CMSIS 标准
ARM 公司于 2008 年 11 月 12 日发布了 ARM Cortex 微控制器软件接口标准 CMSIS 1.0。 CMSIS 是独立于供应商的 Cortex-M 处理器系列硬件抽象层, 为芯片厂商和中间件供应商提 供了简单的处理器软件接口,简化了软件复用工作,降低了 Cortex-M 上操作系统的移植难 度,并减少了新入门的微控制器开发者的学习曲线和新产品的上市时间。 根据近期的调查研究,软件开发已经被嵌入式行业公认为最主要的开发成本,图 4-1 为 近年来软件开发与硬件开发花费对比图。 因此, ARM 与 Atmel、 IAR、 KEIL、 Luminary Micro、 Micrium、NXP、SEGGER 和 ST 等诸多芯片和软件工具厂商合作,将所有 Cortex 芯片厂 商的产品的软件接口标准化,制定了 CMSIS 标准。此举意在降低软件开发成本,尤其针对 进行新设备项目开发或将已有的软件移植到其他芯片厂商提供的基于 Cortex 处理器的微控 制器的情况。 有了该标准, 芯片厂商就能够将他们的资源专注于对其产品的外设特性进行差 异化,并且能够消除对微控制器进行编程时需要维持的不同的、互相不兼容的标准的需求, 从而达到降低开发成本的目的。
((__CM3_CMSIS_VERSION_MAIN << 16) |
对于 Cortex M0 处理器,在 core_cm0.h 中定义所用 CMSIS 的版本。
#define __CM0_CMSIS_VERSION_MAIN (0x01) #define __CM0_CMSIS_VERSION_SUB #define __CM0_CMSIS_VERSION __CM0_CMSIS_VERSION_SUB) (0x30)
#elif defined ( __ICCARM__ ) #define __ASM #define __INLINE __asm inline /*!< asm keyword for IAR Compiler */ /*!< inline keyword for IAR Compiler.
Only avaiable in High optimization mode! */ #elif defined #define __ASM #define __INLINE #elif defined #define __ASM #define __INLINE #endif ( __GNUC__ ) __asm inline /*!< asm keyword for GNU Compiler */ /*!< inline keyword for GNU Compiler*/
图 4-1 软件与硬件开发成本对比图
CMSIS 的现有标准是 CMSIS 2.0,与之前的版本有了一些新的变化。CMSIS 2.0 标准 包含 Cortex-M0 、Cortex-M3 、Cortex-M4 以及 SVD(System View Description )这四部 分。目前,各芯片厂商也还没有都推出各自基于 CMSIS 标准的完整 BSP 包。但未来的 Cortex-M 处理器应用将统一在 CMSIS 的标准之下是一个不可避免的趋势。本节将以 STM32F10x 处理器为对象,介绍 CMSIS 2.0 标准的 Cortex-M3 部分。
( __TASKING__ ) __asm inline /*!< asm keyword for TASKING Compiler */ /*!< inline keyword for TASKING Compiler*/
这样 CPAL 中的功能函数就可以被定义成静态内联类型( static __INLINE) ,以实现编 译优化。
/* [31:16] main version /* [15:0] sub version
*/ */
((__CM0_CMSIS_VERSION_MAIN << 16) |

Cortex 内核
(0x03)
对于 Cortex M3 处理器,在头文件 core_cm3.h 中定义:
#define __CORTEX_M
4.1.1 基于 CMSIS 标准的软件架构
基于 CMSIS 2.0 标准的软件架构如图 4-2 所示。与 CMSIS 1.x 版本相比,CMSIS 2.0 去除了中间层,增加了一个可选的外设访问函数(Access Functions for Peripherals) 。
图 4-2 基于 CMSIS 标准的软件架构
typedef enum IRQn { /****** Cortex-M3 Processor Exceptions/Interrupt Numbers ************/ NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt HardFault_IRQn = -13, BusFault_IRQn = -11, UsageFault_IRQn = -10, SVCall_IRQn = -5, DebugMonitor_IRQn = -4, PendSV_IRQn = -2, SysTick_IRQn = -1, /****** WWDG_STM_IRQn = 0, PVD_STM_IRQn = 1, : : } IRQn_Type; /*!< 3 Cortex-M3 Hard Fault Interrupt /*! < 5 Cortex-M3 Bus Fault Interrupt /*! < 6 Cortex-M3 Usage Fault Interrupt /*! < 11 Cortex-M3 SV Call Interrupt /*!< 14 Cortex-M3 Pend SV Interrupt /*!< 15 Cortex-M3 System Tick Interrupt ********************/ */ /*!< Window WatchDog Interrupt */ */ */ */ */ */ */
/* define compiler specific symbols */ #if defined ( __CC_ARM #define __ASM #define __INLINE ) __asm __inline /*!< asm keyword for ARM Compiler */ /*!< inline keyword for ARM Compiler*/

CMSIS 版本号
CMSIS 标准有多个版本号, 对于 Cortex M3 define __CM3_CMSIS_VERSION_MAIN (0x01) #define __CM3_CMSIS_VERSION_SUB #define __CM3_CMSIS_VERSION __CM3_CMSIS_VERSION_SUB) (0x30) /* [31:16] main version /* [15:0] sub version */ */
这样芯片厂商就能专注于对其产品的外设特性进行差异化, 并且消除他们对微控制器进 行编程时需要维持的不同的、互相不兼容的标准需求,以达到低成本开发的目的。
规范 4.1.2 CMSIS 代码 代码规范
� 基本规范 � � � � � � � CMSIS 的 C 代码遵照 MISRA 2004 规则。 使用标准 ANSI C 头文件<stdint.h>中定义的标准数据类型。 由#define 定义的包含表达式的常数必须用括号括起来。 变量和参数必须有完全的数据类型。 CPAL 层的函数必须是可重入的。 CPAL 层的函数不能有阻塞代码,也就是说等待、查询等循环必须在其他的软 件层中。 定义每个异常/中断的: � � � � � � � � 每个异常处理函数的后缀是 _Handler ,每个中断处理器函数的后缀是 _IRQHandler。 默认的异常中断处理器函数(弱定义)包含一个无限循环。 用#define 将中断号定义为后缀为_IRQn 的名称。
相关文档
最新文档