ARM内核之CMSIS

1.什么是CMSIS? 

CMSIS(Cortex Microcontroller Software Interface Standard,Cortex微控制器软件接口标准)提供Cortex-M内核与软件之间的接口,即用户可以通过这些统一的接口(函数API)去访问底层硬件,而不必关心不同厂家针对具体硬件的实现过程(单片机的启动文件也在这个标准中)。CMSIS的架构图如下:

ST和NXP厂家各自实现的芯片是有差异的,而有了CMSIS之后,ST和NXP需要针对自家芯片的特点执行CMSIS。比如CMSIS的UART中ARM_DRIVER_USART结构体有很多操作底层USART的函数,用户只需要调用结构体中的函数即可,函数的具体实现过程由ST和NXP实现(有差异)。对于用户来说,不管是ST还NXP只要是Cortex-M内核,这些ARM_DRIVER_USART中的函数API都是相同的(不关心底层硬件的实现过程),那么在使用的时候提高了代码的移植性、复用性和开发进度。

在STM32H7(Cortex-M7)中部分ARM_DRIVER_USART中的函数需要调用HAL_UART_Init()初始化串口,但是NXP是直接调用自己的寄存器实现。最终对于用户而言,只需要调用接口函数即可,不必去关心ST和NXP操作串口硬件的过程和方法。

简单来说,就像电动螺丝刀。ARM提供了核心的电动控制部分和螺丝刀的标准大小,但是不管厂家具体怎么制作这些螺丝刀(只需要遵守标准即可)。所以,在统一标准下,用户使用电动螺丝刀可以安装不同的螺丝刀,而且使用方法都是相同的,避免了用户再去区分这些螺丝刀的差异,提高使用的便利性(提高开发速度)。

2. CMSIS的组成部分:

CMSIS组成部分如下:

(1)Core层:提供对Cortex-M处理器核心的访问,包括寄存器操作、中断管理(NVIC)、位带操作、系统控制块(SCB,包含时钟控制、异常处理等)、内存保护单元(MPU)等;

(2)DSP层:提供数字信号处理的算法函数,比如滤波器、三角函数、矩阵运算等,使用C语言实现,并针对不同Cortex-M内核优化性能。

(3)RTOS层:提供操作系统的接口API,比如任务调度、资源管理、时间管理等,基于C语言实现。常使用的FreeRTOS、Threadx都是使用此接口。

(4)Driver层:提供标准化的外设驱动接口,如串口、以太网、USB等,使开发者无需了解具体硬件细节即可配置外设。ARM定义了这些外设接口函数和寄存器地址,所有的厂家都需要安这个标准来实现具体的函数执行。

(5)CMSIS-NN层:针对神经网络的优化库,通过高效内核减少内存占用,适用于Cortex-M处理器上的AI应用。

(6)编译层:定义通用的数据类型(uint32_t、float)、编译器相关的指令等,方便代码可以在不同编译环境中运行。

等等。

CMSIS通过标准化接口和组件,降低了嵌入式开发的复杂性。CMSIS是ARM Cortex-M生态的核心支柱,在跨平台开发、代码重用和实时系统集成等方面有很大应用。开发者可借助CMSIS的模块化架构,快速构建高效、可移植的嵌入式应用。

3. CMSIS文件举例:

3.1 CMSIS的USART举例:本文通过USART来说明CMSIS的使用方法和优势。底层USART有一个结构体ARM_DRIVER_USART,此结构体中定义了很多操作USART硬件的接口函数:

3.2 ARM_DRIVER_USART内部函数的实现过程:比如STM32H7,使用ARM_DRIVER_USART时,需要提前利用STM32CUBE生成HAL_UART_MspInit()和HAL_UART_MspDeInit(),因为ARM_DRIVER_USART中的部分函数需调用它们初始化、操作串口:

但是NXP中的实现方法是不一样的,只是用户不需要关心,用户只要调用ARM_DRIVER_USART中的函数即可。

如果没有文件UART_STM32H7xx.c,可以按如下方法添加组件:

3.3 使用优势:比如创建通用模板库。在使用CMSIS中的ARM_DRIVER_USART来封装通用的串口初始化、发送、接受函数。比如做一个通用的USART初始化函数,不管在什么芯片上,用户只需调用user_usart_init()函数即可。在user_usart_init()函数中,去调用ARM_DRIVER_USART内部函数。

比如在STM32H7中,用户只需提前利用STM32CUBE生成HAL_UART_MspInit()和HAL_UART_MspDeInit(),然后移植对应的UART_STM32H7xx.c相关文件即可以使用user_usart_init()函数。而在NXP芯片中,用户只需移植对应LPC_xx_UART文件即可(这个文件的具体名称可能不正确。不记得了。方法是没问题的)。

3.4 事件回调函数的使用:在ARM_DRIVER_USART中配置好一个事件回调函数(用户实现),然后系统会在串口发送完成和接受完成回调函数中(开启中断后,硬件自动执行,不需要用户实现)给事件回调函数相关事件置位。这样用户通过判断事件回调函数中事件标志位便可以判断串口发送和接受情况:

3.5 补充知识:STM32CUBE生成代码(HAL库)初始化USART流程:

3.6 上述知识概述:

4. 总结:CMSIS是Cortex-M内核的重要组成部分。在CMSIS标志接口下,用户可以不用关心底层的实现过程,只需要编写自己用户层的代码即可,极大提高了代码的移植性、重用性和开发速度。

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

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

相关文章

嵌入式软件面经(二)Q: Modbus协议CRC校验的方式是什么?它有哪些优势?

Modbus协议使用的CRC(循环冗余校验)是一种用于确保数据通信完整性和准确性的差错检测方法。在Modbus RTU通信中,CRC校验过程清晰明确,且被广泛应用于工业通信场景。 一、Modbus协议的CRC校验流程 (一)CRC计…

glib-object 中G_DEFINE_TYPE 宏都作了什么?

author: hjjdebug date: 2025年 06月 25日 星期三 15:35:26 CST descrip: glib-object 中G_DEFINE_TYPE 宏都作了什么? 文章目录 1. 测试代码2 给出它的展开式.3.说说它都生成了什么?3.1. my_foo_get_type() 函数3.2. static GType my_foo_get_type_once(void)3.3. my_foo_cl…

Alembic迁移系统初始化实战教程

下面是一份结构清晰、步骤明确的 基于 Alembic Pydantic SQLAlchemy 的数据库迁移系统初始化教程,非常适合初次搭建项目或团队规范流程参考。 🚀 Alembic SQLAlchemy Pydantic 项目数据库迁移初始化教程 本教程将指导你如何从零初始化 Alembic 迁移…

灰度发布怎么保证数据库一致的

注: 以下内容来源于deepseek答案,生产环境以实际情况为主! 在灰度发布中保证数据库一致的最优解需要同时满足安全性、低复杂度和高可操作性。结合多年实战经验,以下是最推荐的黄金方案(适用于90%以上场景)&…

不用vue,只用html,即可简单实现electron项目

为你提供一个 最简单的 Electron 项目模板,包含完整的代码、配置和打包说明。即使你是小白,也能快速上手。 1. 项目结构 /your-project├── main.js # Electron 主进程文件├── preload.js # 安全通信脚本(可选&#xf…

C++11原子操作:从入门到精通

文章目录 一、什么是原子操作&#xff1f;二、为什么需要原子操作&#xff1f;三、C11中的<atomic>头文件四、基本使用1. 声明原子变量2. 基本原子操作 五、内存顺序&#xff08;Memory Order&#xff09;示例&#xff1a;使用内存顺序实现自旋锁 六、原子类型模板七、实…

深入解析Flink Local模式启动流程源码:揭开作业初始化的神秘面纱

在Flink的数据处理体系中&#xff0c;Local模式凭借无需依赖分布式集群资源的特性&#xff0c;成为开发测试阶段快速验证作业逻辑的利器。其启动流程的源码里&#xff0c;藏着从作业提交到任务执行的完整脉络。接下来&#xff0c;我们将深入关键代码段&#xff0c;逐行剖析Flin…

二刷 苍穹外卖 day06

HttpClient 用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包 作用&#xff1a; 发送HTTP请求 接受响应数据 应用场景&#xff1a; 当我们在使用扫描支付、查看地图、获取验证码、查看天气等功能时 其实&#xff0c;应用程序本身并未实现这些功能&#xff…

React第六十三节Router中BrowserRouter的用途及注意事项

前言 BrowserRouter 是 React Router 库的核心组件&#xff0c;用于实现单页面应用&#xff08;SPA&#xff09;的客户端路由。它利用 HTML5 History API 管理 URL&#xff0c;实现页面无刷新跳转。下面详细解释其用途、使用方法和代码示例&#xff1a; 一、BrowserRouter 核…

《Self-Adapting Language Models》(SEAL)代码阅读笔记

代码&#xff1a;https://github.com/Continual-Intelligence 脚本命令用法&#xff1a;knowledge-incorporation/README.md 生成self-edit数据 脚本&#xff1a;sbatch knowledge-incorporation/scripts/make_squad_data.sh vllm serve启动Qwen2.5-7B模型的服务。 执行self-e…

GelSight Mini视触觉传感器开发资源升级:触觉3D点云+ROS2助力机器人科研与医疗等应用

近日&#xff0c;GelSight宣布对其GelSight Mini视触觉传感器的GitHub支持页面进行重大更新&#xff0c;围绕3D点云重建、ROS2 集成及开发者支持体系推出三大核心升级&#xff0c;助力机器人触觉感知、工业检测及科研场景落地。 GelSight Mini视触觉传感器重磅发布&#xff01;…

6、做中学 | 三年级下期 Golang值类型相互转换

本次为操作文章&#xff0c;大部分都在讨论类型之间如何转换&#xff0c;使用的是内置方法进行调用执行&#xff0c;详细使用请移步至&#xff1a; go的API使用文档地址 https://studygolang.com/pkgdoc 一、数值类型相互转换 go中数值转换需要显示转换&#xff0c;不能隐式自…

019 高校心理教育辅导系统技术解析:构建心理健康守护平台

高校心理教育辅导系统技术解析&#xff1a;构建心理健康守护平台 在关注大学生心理健康成为教育重点的当下&#xff0c;高校心理教育辅导系统借助数字化技术整合多种功能模块&#xff0c;面向管理员、学生、教师三类角色&#xff0c;实现心理教育辅导工作的高效化与精准化。本…

【ArcGIS】土地资源单项评价

【ArcGIS】土地资源单项评价 一、土地资源单项评价1、评价思路 二、操作步骤1、处理环境设置2、地形坡度评价3、高程评价4、坡度高程叠加评价5、地形起伏度6、土地资源综合评价 一、土地资源单项评价 1、评价思路 &#xff08;1&#xff09;利用全域DEM计算地形坡度&#xff…

Prioritized Generative Replay

ICLR 2025 Oral code 具有样本效率的 online reinforcement learning (RL) 通常使用 replay buffer 存储经验&#xff0c;以便在更新价值函数时重复使用。然而&#xff0c;uniform replay 效率低下&#xff0c;因为某些类型的 transition 可能与学习更相关。 虽然对更有用的样本…

Linux -- 线程、锁

1、 Linux线程概念 1.1、什么是线程 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;更准确的定义是&#xff1a;线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部运行&#xff0c;本质是在进程地址空间内运行在Linux系统中…

海外服务器的定义和作用都有哪些?

海外服务器可以说是一个统称&#xff0c;其中包含了全球各地除了中国大陆以外其他国家的服务器&#xff0c;在如今的数字化时代中&#xff0c;海外服务器的应用已经成为跨国企业业务拓展、科研与学术交流等多个领域中不可或缺的一部分&#xff0c;能够为各个行业提供更加稳定且…

数据结构之优先级队列

系列文章目录 数据结构之ArrayList_arraylist o(1) o(n)-CSDN博客 数据结构之LinkedList-CSDN博客 数据结构之栈-CSDN博客 数据结构之队列-CSDN博客 数据结构之二叉树-CSDN博客 目录 系列文章目录 前言 一、优先级队列和堆 二、堆的模拟实现 1. 堆的创建 2. 计算建堆…

【版本控制教程】如何使用Unreal Engine 5 + UE源代码控制(Perforce P4)

本文来源perforce.com&#xff0c;由Perforce中国授权合作伙伴——龙智翻译整理&#xff0c;旨在为国内用户提供一份实用、易懂的Unreal Engine 5Perforce P4的中文使用指南。希望能为UE开发者、设计师和美术小伙伴们的版本控制实践提供有力支持~ Unreal Engine 5 是一款尖端的…

opensingleComDialog方法解析优化

下面是对 opensingleComDialog 方法的详细解析&#xff0c;并给出优化建议和优化后的代码。 方法解析 作用 opensingleComDialog(index) 方法用于在输入框失去焦点时&#xff08;blur 事件&#xff09;自动根据输入内容进行唯一性查询&#xff0c;如果查到唯一结果则自动填充…