电控---CMSIS概览

1. CMSIS库简介

CMSIS(Cortex Microcontroller Software Interface Standard,Cortex微控制器软件接口标准)是由ARM公司开发的一套标准化软件接口,旨在为基于ARM Cortex-M系列处理器(如Cortex-M0/M0+/M3/M4/M7/M33等)的微控制器提供统一的软件编程接口,简化跨厂商芯片的软件开发,提高代码复用率和移植性。

核心作用

  1. 统一硬件抽象层
    屏蔽不同厂商Cortex-M芯片的底层差异,提供一致的寄存器访问、中断管理、系统控制(如SysTick、NVIC)等接口,开发者无需为不同品牌的芯片重写底层代码。
  2. 加速开发效率
    提供标准化的外设驱动模板、示例代码和工具链支持,降低学习成本,缩短产品开发周期。
  3. 促进生态兼容
    支持主流IDE(如Keil、IAR、GCC)和实时操作系统(RTOS,如FreeRTOS、uCOS),便于整合第三方中间件(如DSP库、安全模块)。

主要组成部分

1. 核心层(CMSIS Core)
  • 内核访问接口:提供对Cortex-M内核寄存器(如NVIC、SysTick、MPU)的标准化访问函数和头文件,确保不同厂商芯片的内核功能调用一致。
  • 设备启动代码:包含启动文件(如startup.s)和系统初始化函数(SystemInit()),用于芯片上电后的初始配置。
2. 设备外设访问层(CMSIS Device)
  • 厂商特定外设驱动:由芯片厂商实现,定义外设寄存器地址、结构体和操作函数(如GPIO、UART、SPI等),遵循统一的命名和使用规范。
  • 片上资源描述:通过头文件(如stm32f4xx.h)声明芯片型号、外设基地址和寄存器位定义,确保跨厂商代码的兼容性。
3. 中间件接口层(CMSIS Middleware)
  • DSP与数学库(CMSIS-DSP):提供优化的数字信号处理函数(FFT、滤波、矩阵运算等),支持定点/浮点运算,充分利用Cortex-M的SIMD和浮点单元(FPU)。
  • RTOS接口(CMSIS-RTOS):定义与RTOS交互的统一API(如线程管理、信号量、消息队列),便于在不同RTOS间移植应用代码。
  • 安全与存储接口(CMSIS-SVD、CMSIS-Security):支持外设寄存器描述文件(SVD)解析、安全启动和加密功能。

优势与特点

  1. 跨厂商兼容性
    同一套代码可在不同品牌的Cortex-M芯片(如STM32、NXP LPC、瑞萨RX、TI Tiva等)上复用,只需替换设备相关的头文件和启动代码。
  2. 工具链无关性
    支持Keil、IAR、GCC等主流开发工具,编译配置统一,减少工具链适配成本。
  3. 丰富的生态支持
    • CMSIS-Pack:ARM提供的软件包管理系统,整合了设备支持包、中间件和示例代码,可通过工具(如Keil Pack Installer)快速安装。
    • 开源与标准化:接口规范公开,厂商和开发者可共同维护,降低技术锁定风险。

2 组成部分

2.1 CMSIS - Core

这是CMSIS库的核心部分,它为Cortex - M内核提供了统一的访问接口,主要包含以下几个方面:

2.1.1 内核寄存器访问

通过定义一系列的结构体和宏,开发者可以方便地访问Cortex - M内核的寄存器,如NVIC(Nested Vectored Interrupt Controller)、SysTick(系统定时器)、SCB(System Control Block)等。例如,在访问NVIC寄存器时,可以使用如下代码示例:

// 使能中断号为5的中断
NVIC_EnableIRQ(5);

这里的NVIC_EnableIRQ函数是CMSIS - Core提供的标准函数,用于使能指定中断号的中断。

2.1.2 系统初始化

提供了SystemInit函数,用于对系统时钟、复位和中断向量表等进行初始化。这个函数通常在启动代码中被调用,为后续的程序运行做好准备。以下是一个简化的SystemInit函数调用示例:

int main(void)
{SystemInit();// 后续代码while(1){// 主循环}
}
2.1.3 异常和中断处理

定义了异常和中断处理的通用接口。开发者可以通过编写特定的中断处理函数,并在中断向量表中进行注册,来处理各种中断事件。例如,对于外部中断处理函数的定义:

void EXTI0_IRQHandler(void)
{// 处理外部中断0的代码// 清除中断标志等操作
}
2.2 CMSIS - Device

这部分由芯片厂商实现,针对特定的微控制器提供外设的访问接口。

2.2.1 外设寄存器定义

厂商会根据芯片的硬件特性,定义每个外设的寄存器结构体和地址。例如,对于GPIO(通用输入输出)外设,会定义GPIO寄存器结构体,包含数据寄存器、控制寄存器等。以下是一个简单的GPIO寄存器结构体示例:

typedef struct
{__IO uint32_t MODER;    /*!< GPIO port mode register,               Address offset: 0x00 */__IO uint32_t OTYPER;   /*!< GPIO port output type register,        Address offset: 0x04 */__IO uint32_t OSPEEDR;  /*!< GPIO port output speed register,       Address offset: 0x08 */__IO uint32_t PUPDR;    /*!< GPIO port pull-up/pull-down register,  Address offset: 0x0C */__IO uint32_t IDR;      /*!< GPIO port input data register,         Address offset: 0x10 */__IO uint32_t ODR;      /*!< GPIO port output data register,        Address offset: 0x14 */// 其他寄存器...
} GPIO_TypeDef;
2.2.2 外设驱动函数

厂商会提供一系列的外设驱动函数,方便开发者对各种外设进行配置和操作。例如,对于UART(通用异步收发传输器)外设,会有初始化函数、发送数据函数和接收数据函数等。以下是一个UART初始化函数的示例:

void UART_Init(UART_HandleTypeDef *huart)
{// 配置UART寄存器// 波特率、数据位、停止位等huart->Instance->BRR = 0x0000; // 示例代码,实际需要根据波特率计算// 使能UARThuart->Instance->CR1 |= USART_CR1_UE;
}
2.3 CMSIS - DSP

CMSIS - DSP库提供了一系列优化的数字信号处理函数,用于在Cortex - M微控制器上进行高效的信号处理。

2.3.1 基本数学函数

包括三角函数、指数函数、对数函数等。这些函数针对Cortex - M内核进行了优化,能够在有限的资源下实现较高的计算性能。例如,计算正弦函数:

#include "arm_math.h"float32_t angle = 0.5f;
float32_t result;
arm_sin_f32(angle, &result);
2.3.2 滤波函数

提供了各种滤波器的实现,如FIR(有限长单位冲激响应)滤波器、IIR(无限长单位冲激响应)滤波器等。以下是一个简单的FIR滤波器初始化和使用示例:

#include "arm_math.h"#define NUM_TAPS 10
float32_t firCoeffs[NUM_TAPS] = {0.1, 0.2, 0.3, 0.2, 0.1, 0.1, 0.2, 0.3, 0.2, 0.1};
float32_t firStateF32[NUM_TAPS + BLOCK_SIZE - 1];
arm_fir_instance_f32 S;// 初始化FIR滤波器
arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs[0], &firStateF32[0], BLOCK_SIZE);// 处理输入数据
float32_t input[BLOCK_SIZE];
float32_t output[BLOCK_SIZE];
arm_fir_f32(&S, input, output, BLOCK_SIZE);
2.3.3 矩阵运算函数

支持矩阵的加法、乘法、求逆等运算。以下是一个矩阵乘法的示例:

#include "arm_math.h"#define ROWS_A 2
#define COLS_A 3
#define COLS_B 2float32_t A[ROWS_A * COLS_A] = {1, 2, 3, 4, 5, 6};
float32_t B[COLS_A * COLS_B] = {7, 8, 9, 10, 11, 12};
float32_t C[ROWS_A * COLS_B];arm_matrix_instance_f32 matA, matB, matC;
arm_mat_init_f32(&matA, ROWS_A, COLS_A, A);
arm_mat_init_f32(&matB, COLS_A, COLS_B, B);
arm_mat_init_f32(&matC, ROWS_A, COLS_B, C);arm_mat_mult_f32(&matA, &matB, &matC);
2.4 CMSIS - RTOS

CMSIS - RTOS提供了一套统一的实时操作系统(RTOS)接口,使得开发者可以在不同的RTOS之间进行切换,而不需要对应用代码进行大量修改。

2.4.1 任务管理

提供了创建、删除、挂起和恢复任务的接口。以下是一个简单的任务创建示例:

#include "cmsis_os.h"void task1(void const * argument)
{while(1){// 任务1的代码}
}osThreadDef(task1, osPriorityNormal, 1, 0);
osThreadId task1_id = osThreadCreate(osThread(task1), NULL);
2.4.2 同步与通信

支持信号量、互斥锁、消息队列等同步和通信机制。以下是一个信号量的使用示例:

#include "cmsis_os.h"osSemaphoreId semaphore_id;
osSemaphoreDef(semaphore);// 创建信号量
semaphore_id = osSemaphoreCreate(osSemaphore(semaphore), 1);// 等待信号量
osSemaphoreWait(semaphore_id, osWaitForever);// 释放信号量
osSemaphoreRelease(semaphore_id);

3. 版本与兼容性

CMSIS有不同的版本,每个版本在功能和兼容性上可能会有所差异。目前,CMSIS 5是比较新的版本,它在CMSIS 4的基础上进行了改进,支持更多的Cortex - M内核型号,并且对一些功能进行了优化和扩展。

4. 开发流程

4.1 环境搭建

首先需要选择合适的开发工具,如Keil MDK、IAR Embedded Workbench等。然后根据芯片型号下载对应的CMSIS设备支持包,并将其添加到开发环境中。

4.2 代码编写

根据需求选择使用CMSIS的不同部分。如果是进行系统初始化和中断处理,主要使用CMSIS - Core;如果是操作外设,使用CMSIS - Device;如果需要进行数字信号处理,使用CMSIS - DSP;如果要实现多任务管理,使用CMSIS - RTOS。

4.3 编译和调试

使用开发工具对代码进行编译和链接,生成可执行文件。然后通过调试器(如JTAG、SWD)将程序下载到目标芯片中进行调试。

5. 应用场景

  • 嵌入式系统开发:适用于物联网(IoT)、工业控制、消费电子、汽车电子等领域的Cortex-M芯片项目。
  • 底层驱动开发:编写与硬件无关的上层应用逻辑,或基于现有驱动快速构建复杂系统。
  • 中间件集成:通过CMSIS-DSP优化信号处理算法,或利用CMSIS-RTOS接口实现多任务管理。
5.1 工业控制

在工业自动化领域,CMSIS库可以用于实现电机控制、传感器数据采集和处理等功能。例如,使用CMSIS - DSP库对传感器采集到的信号进行滤波和分析,使用CMSIS - Device库对电机驱动外设进行控制。

5.2 消费电子

在智能手表、智能家居等消费电子产品中,CMSIS库可以帮助开发者快速实现各种功能。例如,使用CMSIS - RTOS实现多任务管理,使设备能够同时处理多个任务,如显示界面更新、传感器数据采集等。

5.3 物联网

在物联网设备中,CMSIS库可以用于实现低功耗通信、数据处理等功能。例如,使用CMSIS - Core对系统进行低功耗管理,使用CMSIS - DSP库对采集到的环境数据进行处理和分析。

6. 局限性

虽然CMSIS库提供了很多便利,但也存在一些局限性。例如,对于一些特殊的硬件特性,CMSIS库可能没有提供相应的接口,开发者需要自己编写底层代码来实现。此外,CMSIS - RTOS接口只是一个标准,不同的RTOS在实现上可能会有一些差异,在实际使用中可能需要进行一些适配工作。

7.版本与获取

  • 版本演进:当前主流版本为CMSIS 5,新增了对Cortex-M33/M55等新型号的支持,强化了安全特性和包管理机制。
  • 资源获取
    • ARM官网提供CMSIS核心库和工具链文档(ARM CMSIS官网)。
    • 芯片厂商(如ST、NXP)在官网提供针对其产品的CMSIS设备支持包。

总结

CMSIS库是Cortex-M生态的重要基础设施,通过标准化接口降低了嵌入式开发的复杂度,推动了跨厂商、跨工具链的代码复用,是现代嵌入式系统开发中提高效率和可维护性的关键技术之一。无论是底层驱动开发还是上层应用设计,CMSIS都为开发者提供了统一且高效的编程框架。


高低灯火,鼎沸笙箫。
一年三百六十日,
愿长似今宵。 —杨无咎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/77163.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

list.

列表类型是用来存储多个有序的字符串&#xff0c;列表中的每个字符串称为元素&#xff08;element&#xff09;&#xff0c;⼀个列表最多可以存储个元素 在 Redis 中&#xff0c;可以对列表两端插入&#xff08;push&#xff09;和弹出&#xff08;pop&#xff09;&#xff0c;…

关于Diamond机械手的运动学与动力学的推导

1.关于Diamond机械手 &#xff08;1&#xff09;位置模型推导 逆解&#xff1a;机械末端平台的位置与驱动关节之间的关系。 设p点在xy平面的坐标是&#xff08;x&#xff0c;y&#xff09;T&#xff0c;此时根据向量求解 OP等于向量r等于e向xy轴的向量主动臂长度向xy轴的向量…

如何新建一个空分支(不继承 master 或任何提交)

一、需求分析&#xff1a; 在 Git 中&#xff0c;我们通常通过 git branch 来新建分支&#xff0c;这些分支默认都会继承当前所在分支的提交记录。但有时候我们希望新建一个“完全干净”的分支 —— 没有任何提交&#xff0c;不继承 master 或任何已有内容&#xff0c;这该怎么…

Flask(补充内容)配置SSL 证书 实现 HTTPS 服务

没有加密的http服务&#xff0c;就像在裸泳&#xff0c;钻到水里便将你看个精光。数据在互联网上传输时&#xff0c;如果未经加密&#xff0c;随时可能被抓包软件抓住&#xff0c;里面的cookie、用户名、密码什么的&#xff0c;它会看得一清二楚&#xff0c;所以&#xff0c;只…

云服务器CVM标准型S5实例性能测评——2025腾讯云

腾讯云服务器CVM标准型S5实例具有稳定的计算性能&#xff0c;CPU采用采用 Intel Xeon Cascade Lake 或者 Intel Xeon Cooper Lake 处理器&#xff0c;主频2.5GHz&#xff0c;睿频3.1GHz&#xff0c;CPU内存配置2核2G、2核4G、4核8G、8核16G等配置&#xff0c;公网带宽可选1M、3…

什么是智算中心

智算中心是一种专门为智能计算提供强大算力支持的基础设施&#xff0c;以下是关于它的详细介绍&#xff1a; 定义与功能 智算中心是基于强大的计算能力&#xff0c;特别是针对人工智能算法进行优化的计算中心。它集成了大量的高性能计算设备&#xff0c;如 GPU 集群、FPGA 阵…

注意力机制是如何实现的

注意力机制的实现可以分解为几个核心步骤&#xff0c;其本质是通过动态计算权重&#xff0c;决定不同位置信息的重要性&#xff0c;再对信息进行加权融合。以下从数学原理、代码实现到直观解释逐步展开&#xff1a; 一、核心实现步骤 以最常见的**点积注意力&#xff08;Dot-P…

【裁员感想】

裁员感想 今天忽然感觉很emo 因为知道公司要裁员 年中百分之10 年末百分十10 我知道这个百分20会打到自己 所以还挺不开心的 我就想起 我的一个亲戚当了大学老师 我觉得真的挺好的 又有寒暑假 又不是很累 薪资也不低 又是编制 同时也觉得自己很失败 因为对自己互联网的工作又…

从信号处理角度理解图像处理的滤波函数

目录 1、预备知识 1.1 什么是LTI系统? 1.1.1 首先来看什么是线性系统,前提我们要了解什么是齐次性和叠加性。

目标检测概述

为什么基于卷积网络的目标检测模型在预测后要使用非极大值抑制 基于卷积网络的目标检测模型可能会在目标的相邻区域生成多个相互重叠框&#xff0c;每个框的预测结果都是同一个目标&#xff0c;引起同一目标的重复检测。造成这一现象的原因主要有两个&#xff0c; 基于卷积网络…

【JAVA】在idea新加artifact时,点击Build-Build Artifacts时,新加的artifact不能选中

首先保证添加artifact无问题&#xff0c;比如依赖都正确、无重复命令的情况等 办法 一 File > Invalidate Caches / Restart。 重启IDEA后&#xff0c;重新检查Artifact是否可选 办法 二 打开 Project Structure&#xff08;CtrlShiftAltS&#xff09;。 进入 Artifacts 选…

Paramiko 使用教程

目录 简介安装 Paramiko连接到远程服务器执行远程命令文件传输示例 简介 Paramiko 是一个基于 Python 的 SSH 客户端库&#xff0c;它提供了在网络上安全传输文件和执行远程命令的功能。本教程将介绍 Paramiko 的基本用法&#xff0c;包括连接到远程服务器、执行命令、文件传输…

《TCP/IP网络编程》学习笔记 | Chapter 24:制作 HTTP 服务器端

《TCP/IP网络编程》学习笔记 | Chapter 24&#xff1a;制作 HTTP 服务器端 《TCP/IP网络编程》学习笔记 | Chapter 24&#xff1a;制作 HTTP 服务器端HTTP 概要理解 Web 服务器端无状态的 Stateless 协议请求消息&#xff08;Request Message&#xff09;的结构响应消息&#x…

【Quest开发】在虚拟世界设置具有遮挡关系的透视窗口

软件&#xff1a;Unity 2022.3.51f1c1、vscode、Meta XR All in One SDK V72 硬件&#xff1a;Meta Quest3 仅针对urp管线 参考了YY老师这篇&#xff0c;可以先看他的再看这个可能更好理解一些&#xff1a;Unity Meta Quest MR 开发&#xff08;七&#xff09;&#xff1a;使…

GPU 招投标全流程分析与总结

GPU 招投标全流程分析与总结 招投标流程概述 以下是通过代理商采购Nvidia H20-GPU 141G的招投标全流程分析: #mermaid-svg-hMPPfkCpGj8GKXfV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hMPPfkCpGj8GKXfV .er…

[C++] STL中的向量容器<vector>附加练习

目录 讲在前面(必看)八卦阵题目描述输入格式输出格式输入输出样例数据范围AC代码及要点 决赛应援题目描述输入格式输出格式输入输出样例数据范围AC代码及要点 讲在前面(必看) 本篇为练习篇, vector讲解篇在这里. 菜鸟食用前请做好心理准备(你懂的) 八卦阵 题目描述 n 名同学…

基于SpringBoot+Vue3实现的宠物领养管理平台功能一

一、前言介绍&#xff1a; 1.1 项目摘要 随着社会经济的发展和人们生活水平的提高&#xff0c;越来越多的人开始关注并参与到宠物领养中。宠物已经成为许多家庭的重要成员&#xff0c;人们对于宠物的关爱和照顾也日益增加。然而&#xff0c;传统的宠物领养流程存在诸多不便&a…

parameter和localparam的区别(verilog中)

在Verilog中&#xff0c;parameter 和 localparam 都用于定义常量&#xff0c;但是它们之间有一些重要的区 作用范围&#xff1a; parameter&#xff1a;可以在模块外部被修改或重定义。它可以被作为模块的参数传递给其他模块&#xff0c;因此具有较广泛的作用范围&#xff0c;…

鸿蒙API15 “一多开发”适配:解锁黄金三角法则,开启高效开发新旅程

一、引言 在万物互联的时代浪潮中&#xff0c;鸿蒙操作系统以其独特的 “一多开发” 理念&#xff0c;为开发者打开了一扇通往全场景应用开发的新大门。“一多开发”&#xff0c;即一次开发&#xff0c;多端部署 &#xff0c;旨在让开发者通过一套代码工程&#xff0c;就能高效…

Linux中docker容器拉取镜像失败解决方案

查看 /etc/systemd/system/docker.service.d/http-proxy.conf 文件&#xff08;没有则新建&#xff09;&#xff0c;查看自定义 Docker 服务的代理设置 输入内容 [Service] Environment"HTTP_PROXYsocks5://10.211.13.214:7890" Environment"HTTPS_PROXYsocks…