官网链接, 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

  1. 添加以下文件:

    • 启动文件startup_.c**:**带有复位处理程序和异常向量,为每个中断实现默认功能,还可能包含用户应用程序的堆栈和堆配置,重置后执行并调用SystemInit
    • 系统配置文件 system_.c 和 system_.h:通用设备配置(即用于时钟和总线设置),SystemCoreClock指示 CPU 时钟速度
    • 设备头文件 <device.h>:允许访问处理器内核和所有外围设备,包含在所有需要设备访问的源文件中,并且可以存储在所有项目通用的中央包含文件夹中
  2. CMSIS 提供的版本只是通用模板。

    • 具体设备采用的版本通常由设备供应商通过相应的设备系列包 (DFP) 提供,例如STM32F10x 器件系列的系统配置文件 system_.c 和system_.h是system_stmf10x.c,.h是stm32f10x.h,startup_.s(同.c)是startup_stm32f10x_cl.s
  3. 大多数 Cortex-M 处理器提供 VTOR 寄存器用于重新映射中断向量

    • 关于VTOR:

      1. Cortex-M 内核(除了CM0)模块 SCB 里有个专门的 VTOR 寄存器用来控制中断向量表首地址,程序运行起来后用户可以配置 SCB->VTOR 寄存器来重设中断向量表地址
      2. SCB->VTOR 寄存器低 7bit 是保留的(永远0),所以中断向量表首地址一定要是 128 字节(0x80)对齐的,假如向量表大小240字节,需要256字节对齐
    • 关于中断向量表重映射:
      1. 为了动态重分发中断, CM3 允许向量表重定位——从其它地址处开始定位各异常向量。这些地址对应的区域可以是代码区,也可以是 RAM 区。在 RAM区就可以修改向量的入口地址
      2. 重新映射中断向量表是为了IAP一般是为了IAP
      3. 可以通过boot0和boot1启动决定地址重映射的一部分(bootloader,ram或flash)
    • 关于中断向量表内容、中断向量、中断处理函数
      1. 中断向量表:

        1. 每一个中断函数都有一个地址,这个地址是由编译器随机分配的,每一次编译所分配的地址是不固定的。但是由于硬件的限制,中断只能跳转到固定的地方执行程序(具体细节不展开说),这里就产生了一个矛盾,中断函数的地址是不固定的,但是中断又只能跳转到固定的地方。为了解决这一矛盾,就需要在内存中去定义一个地址的列表,这个列表的地址是固定的,列表里面存放中断函数的地址以及跳转到该中断函数地址所在的程序。当中断发生后,就跳转到这个固定的列表,因为列表存放的是中断函数的地址和跳转到该地址的程序,只需执行该程序就能再次跳转到中断函数,从而执行中断。这个中断地址的列表就是中断向量表
        2. 中断向量表第 0 - 1 个向量比较特殊,是程序初始 SP 和 PC 值
        3. 中断向量表第 2 - 15 个向量是系统中断,IRQ 编号为 -14 到 -1
        4. 中断向量表第 16 个向量开始是厂商自定义外设中断,IRQ 编号为 0 到 n
      2. 中断向量:中断具有优先级,标号越小,优先级越大,把中断函数的地址放到一个数组里面,数组的下标跟优先级对应,数组的下标叫做中断向量
      3. 中断服务函数:在启动文件执行的时候,内核和每个外设的中断服务函数的地址都是已经确定好的,地址就存放在中断向量表中,而且在启动文件里面已经写好了中断服务函数,只是这些中断服务函数为空,而且带[weak]弱定义,那么我们就需要在C文件里面重新实现这个中断服务函数,用户写这个中断服务函数的时候,函数名必须跟启动文件里面写的中断函数名对应,因为函数名对应的就是中断服务函数的地址,如果中断服务函数名和启动文件的名字不一样,就默认启动文件里面预先写好的空的中断服务函数,而且是一个死循环,程序就会一直卡死在中断服务函数里面
  4. 将 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 指令内部函数调试访问的函数

对CMSIS的学习(第1-3部分)相关推荐

  1. 单片机之如何看参考手册

    简介:本文主要讲解学习单片机,如何阅读芯片参考手册. 参考手册是一种非常详细的技术文档,它提供了关于MCU的所有方面的详细信息,包括硬件和软件.这里有一些关于如何阅读STM32F40xxx.STM32 ...

  2. freeRtos学习笔记 (9) 移植和CPU利用率统计

    freeRtos学习笔记 (9) 移植和CPU利用率统计 使用官方固件移植 首先准备一个能跑的裸机工程 注意,freertos需要使用systick定时器,而stm32HAL库默认使用systick作 ...

  3. [学习笔记]stm32

    文章目录 一些问题 学习笔记 stm32F1 stm32F4 简介 Cortex内核 Cortex-M4内核 库开发与寄存器开发的关系 STM32 固件库与 CMSIS 标准 内部结构 最小系统 小马 ...

  4. arm rtx教程_ARM CMSIS标准概述及快速入门

    CMSIS的创建是为了帮助行业实现标准化,减少了客户学习曲线,开发成本,缩短产品上市时间. 再来看看CMSIS是什么,有哪些工具提供及快速入门~ CMSIS:(Cortex Microcontroll ...

  5. 一起来学习LiteOS中断模块的源代码

    摘要:本文带领大家一起剖析了LiteOS中断模块的源代码. 本文我们来一起学习下LiteOS中断模块的源代码,文中所涉及的源代码,均可以在LiteOS开源站点https://gitee.com/Lit ...

  6. stm32定时2通道3映射_stm32学习笔记之问题总结

    1. SYSCLK时钟源有三个来源:HSI RC.HSE OSC.PLL; 2. MCO[2:0]可以提供4源不同的时钟同步信号; 3. GPIO口貌似有两个反向串联的二极管用作钳位二极管; 4. 总 ...

  7. 随想录(学习nxp rt1052 soc)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 在国内市场上,stm32是谜一样的存在.工控领域,除了51单片机,大概就是stm32的应用最广. ...

  8. IMX6ULL学习笔记(18)——GPIO中断

    一.中断简介 相比 STM32 的 NVIC,IMX6ULL 的中断控制系统更复杂,它的中断管理器使用的是 GIC V2,GIC V2 的实现方式与我们熟知的 NVIC 差别较大. 1.1 GIC G ...

  9. STM32学习笔记整理之(0)——新建工程

    转载:原创文章:http://emouse.cnblogs.com 1.1.1 开发工具与开发环境 1. 软件版本 本节所使用Keil MDK 为目前的最新版V4.21,具体版本信息如图 5‑6所示. ...

  10. LIteOS学习笔记-7LiteOS启动流程与编译流程

    LIteOS学习笔记-7LiteOS启动流程与编译流程 LiteOS启动流程 1. 启动方式 2. 启动流程 硬件初始化 内核初始化 调试串口初始化 尝试进行网络连接 启动任务调度 LiteOS编译流 ...

最新文章

  1. 奥运会志愿者需要做哪些工作?
  2. NGUI Label Color Code
  3. 【LeetCode】620. 有趣的电影
  4. 我用这个框架拿了Kaggle大赛冠军
  5. [USACO1.5]数字三角形 Number Triangles
  6. 自动以及手动清除手机垃圾文件
  7. 如何查看自己的ubutu系统是32位的还是64位的
  8. (转)MFC技巧学习五
  9. CSS 如何让li横向居中显示
  10. jQuery中iframe的操作
  11. 牛散村期货:3月春风生 第一周非农财经简阅
  12. Python学习资料篇
  13. 2022珠三角深圳锂电池技术展览会暨论坛|2022华南广东深圳锂电池技术展览会
  14. Tensorflow中的变量
  15. 西交学电气还是计算机,上南大还是上西交学电气
  16. 航测无人机航线规划原理
  17. DDoS攻防战 (一) : 概述
  18. 手机电路板文件_三轮制裁后,华为手机业务还能不能继续?“胡杨”就是答案...
  19. MySQL主从部署, master and slave have equal MySQL server UUIDs问题解决
  20. adb devices 出现offline的无敌解决办法

热门文章

  1. Objective-c 开发环境
  2. zemax---透镜基础篇
  3. 代码审计之企业级进销存管理系统
  4. 使用 LwIP TCP/IP 栈,在 STM32Cube 上开发应用
  5. CS269I:Incentives in Computer Science 学习笔记 Lecture 20: Fair Division(公平分配)(本系列完结撒花!)
  6. python爬iptv直播源脚本_GitHub - bensonlai2002/iptv-m3u-maker: IPTV 国内+国外 电视台直播源m3u文件, 收集汇总本地源脚本...
  7. 五大主流浏览器的介绍
  8. 商品分类,手机云进销存ERP门店零售批发仓库开单APP软件,文具五金服装鞋帽酒店烟酒饰品批发条码管理
  9. laravel框架使用phpQuery库来实现网页抓取
  10. 高斯滤波详解 附python和matlab高斯滤波代码