目录
- [CMSIS:Cortex Microcontroller Software Interface Standard](#CMSIS:Cortex Microcontroller Software Interface Standard)
-
- [1. 概述](#1. 概述)
- [2. CMSIS-Core](#2. CMSIS-Core)
-
- [2.1 概述](#2.1 概述)
- [2.2 关键组件](#2.2 关键组件)
- [2.3 示例代码](#2.3 示例代码)
- [2.4 详细解释](#2.4 详细解释)
- [3. CMSIS-DSP](#3. CMSIS-DSP)
-
- [3.1 概述](#3.1 概述)
- [3.2 关键组件](#3.2 关键组件)
- [3.3 示例代码](#3.3 示例代码)
- [3.4 详细解释](#3.4 详细解释)
- [4. CMSIS-RTOS](#4. CMSIS-RTOS)
-
- [4.1 概述](#4.1 概述)
- [4.2 关键组件](#4.2 关键组件)
- [4.3 示例代码](#4.3 示例代码)
- [4.4 详细解释](#4.4 详细解释)
- [5. CMSIS-Driver](#5. CMSIS-Driver)
-
- [5.1 概述](#5.1 概述)
- [5.2 关键组件](#5.2 关键组件)
- [5.3 示例代码](#5.3 示例代码)
- [5.4 详细解释](#5.4 详细解释)
- [6. CMSIS-Pack](#6. CMSIS-Pack)
-
- [6.1 概述](#6.1 概述)
- [6.2 关键功能](#6.2 关键功能)
- [6.3 示例](#6.3 示例)
- [6.4 详细解释](#6.4 详细解释)
- [7. CMSIS-NN](#7. CMSIS-NN)
-
- [7.1 概述](#7.1 概述)
- [7.2 关键组件](#7.2 关键组件)
- [7.3 示例代码](#7.3 示例代码)
- [7.4 详细解释](#7.4 详细解释)
- [8. CMSIS-Zone](#8. CMSIS-Zone)
-
- [8.1 概述](#8.1 概述)
- [8.2 关键功能](#8.2 关键功能)
- [8.3 示例](#8.3 示例)
- [8.4 详细解释](#8.4 详细解释)
- [9. CMSIS-RTOS API的详细解析](#9. CMSIS-RTOS API的详细解析)
-
- [9.1 概述](#9.1 概述)
- [9.2 关键接口](#9.2 关键接口)
- [9.3 示例代码](#9.3 示例代码)
- [9.4 详细解释](#9.4 详细解释)
- [10. CMSIS的应用场景](#10. CMSIS的应用场景)
-
- [10.1 嵌入式系统](#10.1 嵌入式系统)
- [10.2 实时操作系统](#10.2 实时操作系统)
- [10.3 神经网络](#10.3 神经网络)
- [10.4 设备驱动](#10.4 设备驱动)
- [10.5 软件包管理](#10.5 软件包管理)
- [11. 结论](#11. 结论)
- [12. 参考文献](#12. 参考文献)
- [13. 结束语](#13. 结束语)
- 相关文章:
CMSIS:Cortex Microcontroller Software Interface Standard
1. 概述
CMSIS(Cortex Microcontroller Software Interface Standard)是由ARM公司开发的一套软件标准接口,旨在为基于ARM Cortex-M处理器的微控制器提供一致的开发接口。CMSIS通过定义一组标准化的API和库函数,极大地简化了嵌入式软件开发的复杂性,提高了代码的移植性和重用性。
CMSIS的主要目标是:
- 提供一致的开发环境,减少开发时间和成本。
- 促进代码的重用和移植,提高软件质量和维护性。
- 支持软件组件的标准化管理和分发。
2. CMSIS-Core
2.1 概述
CMSIS-Core是CMSIS的核心部分,定义了访问Cortex-M处理器核心及其外设的一组标准化接口。这些接口提供了对处理器中断系统、系统控制和配置、系统定时器等的访问。
2.2 关键组件
- NVIC(Nested Vectored Interrupt Controller):管理中断的优先级和响应。
- SCB(System Control Block):提供系统控制和配置功能,如异常向量表的基地址、系统重置等。
- SysTick(System Timer):一个简单的24位递减计数定时器,用于产生系统节拍。
- MPU(Memory Protection Unit):用于设置和管理内存保护区域。
- FPU(Floating Point Unit):提供浮点运算功能。
2.3 示例代码
c
#include "cmsis.h"
// 初始化SysTick定时器
void SysTick_Init(void) {
SysTick_Config(SystemCoreClock / 1000); // 每1ms产生一次中断
}
// SysTick中断服务函数
void SysTick_Handler(void) {
// 处理代码
}
2.4 详细解释
NVIC(Nested Vectored Interrupt Controller):NVIC是Cortex-M处理器的核心组件之一,负责管理和处理中断。它允许对中断进行分组、嵌套和优先级管理,使得系统能够高效地响应外部和内部事件。
SCB(System Control Block):SCB提供了一组系统控制和配置寄存器,用于管理系统复位、异常向量表和其他系统配置。SCB还包含系统状态寄存器,用于指示当前的系统状态和异常信息。
SysTick(System Timer):SysTick是一个24位递减计数定时器,通常用于实现操作系统的节拍时钟。SysTick定时器可以配置为在达到零时产生中断,使得系统可以定期执行任务。
MPU(Memory Protection Unit):MPU用于设置和管理内存保护区域,防止未经授权的内存访问。通过配置MPU,开发者可以保护关键数据和代码,提高系统的安全性和可靠性。
FPU(Floating Point Unit):FPU提供硬件浮点运算支持,使得浮点运算可以更高效地执行。对于需要大量浮点运算的应用,如DSP(数字信号处理)和图形处理,FPU显著提高了运算速度。
3. CMSIS-DSP
3.1 概述
CMSIS-DSP库是CMSIS的一部分,提供了一组高度优化的数字信号处理(DSP)函数库。这些函数库涵盖了常见的DSP算法,如滤波器、变换、矩阵运算和统计函数。通过使用CMSIS-DSP库,开发者可以快速实现复杂的DSP算法,并充分利用Cortex-M处理器的硬件能力。
3.2 关键组件
- 基本数学函数:加减乘除、平方根、倒数等。
- 复杂数学函数:复数加减乘除等。
- 过滤器函数:FIR、IIR等。
- 变换函数:FFT、DCT等。
- 统计函数:均值、方差、最大值、最小值等。
- 矩阵运算:矩阵加减乘、转置等。
3.3 示例代码
c
#include "arm_math.h"
void DSP_Example(void) {
float32_t input[1024];
float32_t output[1024];
arm_rfft_fast_instance_f32 S;
// 初始化RFFT实例
arm_rfft_fast_init_f32(&S, 1024);
// 进行FFT变换
arm_rfft_fast_f32(&S, input, output, 0);
}
3.4 详细解释
基本数学函数:CMSIS-DSP库提供了一组基本数学运算函数,包括加减乘除、平方根、倒数等。这些函数经过优化,能够高效地在Cortex-M处理器上执行。
复杂数学函数:CMSIS-DSP库还提供了复数运算函数,用于处理复数的加减乘除等运算。复数运算在许多信号处理和通信应用中非常重要。
过滤器函数:CMSIS-DSP库提供了FIR(有限脉冲响应)和IIR(无限脉冲响应)滤波器函数,用于信号滤波和处理。FIR滤波器具有线性相位响应,而IIR滤波器则具有更高的效率和较少的延迟。
变换函数:CMSIS-DSP库提供了FFT(快速傅里叶变换)和DCT(离散余弦变换)函数,用于信号的频域分析和处理。FFT是最常用的变换函数,用于将时域信号转换为频域信号。
统计函数:CMSIS-DSP库提供了一组统计函数,用于计算信号的均值、方差、最大值、最小值等。这些函数对于信号分析和处理非常有用。
矩阵运算:CMSIS-DSP库提供了矩阵加减乘、转置等运算函数,用于线性代数和矩阵计算。矩阵运算在图像处理、机器学习和控制系统中非常常见。
4. CMSIS-RTOS
4.1 概述
CMSIS-RTOS定义了一组标准的实时操作系统(RTOS)API,使得应用程序可以在不同的RTOS上运行,而无需修改代码。CMSIS-RTOS API提供了一些基本的RTOS功能,如任务管理、时间管理、信号量、互斥量等。
4.2 关键组件
- 线程管理:创建、删除、启动和调度线程。
- 定时器:软件定时器的创建和管理。
- 信号量:同步线程间的操作。
- 互斥量:保护共享资源。
- 消息队列:线程间的消息传递。
- 事件标志:用于线程间的事件同步。
4.3 示例代码
c
#include "cmsis_os2.h"
// 线程函数
void thread1(void *argument) {
while (1) {
// 线程处理代码
}
}
// 主函数
int main(void) {
osKernelInitialize(); // 初始化RTOS内核
osThreadNew(thread1, NULL, NULL); // 创建线程
osKernelStart(); // 启动RTOS调度器
while (1) {
// 主循环
}
}
4.4 详细解释
线程管理:CMSIS-RTOS API提供了一组函数用于创建、删除、启动和调度线程。每个线程都有自己的栈空间和优先级,RTOS调度器根据线程的优先级和状态来决定哪个线程应该运行。
定时器:CMSIS-RTOS API提供了软件定时器功能,允许开发者创建和管理定时器事件。定时器可以用于周期性任务、延时操作等。
信号量:信号量用于在线程之间同步操作,保证多个线程之间的协调。信号量有两种类型:计数信号量和二进制信号量。计数信号量用于资源管理,而二进制信号量用于简单的同步。
互斥量:互斥量用于保护共享资源,防止多个线程同时访问共享资源而引发竞态条件。互斥量确保在任何时刻只有一个线程可以访问共享资源。
消息队列:消息队列用于在线程之间传递消息,支持多线程间的通信。消息队列可以存储多个消息,并按照先进先出的顺序传递消息。
事件标志:事件标志用于线程间的事件同步,允许一个线程等待另一个线程的事件发生。事件标志可以组合使用,以实现复杂的事件同步机制。
5. CMSIS-Driver
5.1 概述
CMSIS-Driver定义了一组标准化的外设驱动接口,用于访问微控制器的各种外设,如UART、SPI、I2C等。CMSIS-Driver通过提供标准化的驱动接口,使得软件可以方便地移植到不同的硬件平台上,而不需要针对每种硬件重新编写驱动代码。
5.2 关键组件
- USART驱动:提供串行通信功能。
- SPI驱动:提供同步串行通信功能。
- I2C驱动:提供I2C通信功能。
- CAN驱动:提供控制器局域网通信功能。
- Ethernet驱动:提供以太网通信功能。
- USB驱动:提供USB主机和设备功能。
- 存储驱动:提供对SD卡、NAND Flash等存储设备的访问。
5.3 示例代码
c
#include "Driver_USART.h"
extern ARM_DRIVER_USART Driver_USART1;
void USART_Init(void) {
Driver_USART1.Initialize(NULL);
Driver_USART1.PowerControl(ARM_POWER_FULL);
Driver_USART1.Control(ARM_USART_MODE_ASYNCHRONOUS, 115200);
Driver_USART1.Control(ARM_USART_CONTROL_TX, 1);
Driver_USART1.Control(ARM_USART_CONTROL_RX, 1);
}
void USART_Send(char *data, uint32_t len) {
Driver_USART1.Send(data, len);
}
5.4 详细解释
USART驱动:CMSIS-Driver中的USART驱动提供了一组标准化的函数,用于初始化、配置和控制USART外设。开发者可以通过这些接口实现串行通信,而不需要关注底层硬件的具体实现。
SPI驱动:SPI驱动提供了同步串行通信功能,用于与各种外设(如传感器、显示器等)进行通信。CMSIS-Driver定义了SPI的标准接口,使得不同硬件平台上的SPI通信代码可以保持一致。
I2C驱动:I2C驱动用于实现I2C总线通信,支持主机和从机模式。CMSIS-Driver中的I2C接口提供了初始化、数据传输和错误处理等功能,简化了I2C外设的使用。
CAN驱动:CAN驱动用于控制器局域网(CAN)的通信,广泛应用于汽车电子、工业控制等领域。CMSIS-Driver中的CAN接口提供了标准化的API,用于消息发送、接收和错误管理。
Ethernet驱动:以太网驱动提供了网络通信功能,支持TCP/IP协议栈的实现。CMSIS-Driver中的Ethernet接口定义了以太网外设的标准操作,使得网络应用程序可以轻松移植到不同的硬件平台上。
USB驱动:USB驱动支持USB主机和设备功能,包括标准的USB协议和各种设备类(如HID、MSC等)。CMSIS-Driver中的USB接口提供了标准化的API,用于实现USB通信和设备管理。
存储驱动:存储驱动用于访问各种存储设备,如SD卡、NAND Flash等。CMSIS-Driver中的存储接口提供了标准化的读写操作,简化了文件系统和存储设备的集成。
6. CMSIS-Pack
6.1 概述
CMSIS-Pack定义了一种软件包描述格式,用于管理和分发软件组件,特别适用于集成开发环境(IDE)。CMSIS-Pack使得软件组件可以方便地安装、更新和移除,简化了软件开发和维护过程。
6.2 关键功能
- 组件描述:描述组件的内容、依赖关系和版本信息。
- 设备描述:描述微控制器的特性和外设信息。
- 环境集成:与IDE集成,便于软件组件的安装、更新和移除。
6.3 示例
xml
<package>
<vendor>ARM</vendor>
<name>CMSIS</name>
<version>5.6.0</version>
<description>ARM Cortex Microcontroller Software Interface Standard</description>
<components>
<component Cclass="Core">
<files>
<file>Include/cmsis_core.h</file>
<file>Source/cmsis_core.c</file>
</files>
</component>
</components>
<devices>
<device Dfamily="Cortex-M4">
<file>Device/ARM/Cortex-M4.svd</file>
</device>
</devices>
</package>
6.4 详细解释
组件描述:CMSIS-Pack中的组件描述部分定义了软件包的基本信息,包括名称、版本、描述和依赖关系。通过组件描述,开发者可以清晰地了解软件包的内容和功能。
设备描述:设备描述部分定义了微控制器的特性和外设信息,包括寄存器定义、内存映射和外设地址。设备描述文件通常采用SVD(System View Description)格式,可以在IDE中用于生成寄存器和外设的访问代码。
环境集成:CMSIS-Pack与集成开发环境(IDE)紧密集成,便于软件组件的安装、更新和移除。IDE可以通过解析CMSIS-Pack文件,自动配置项目环境,简化开发过程。
7. CMSIS-NN
7.1 概述
CMSIS-NN库是CMSIS的一部分,提供了一组用于神经网络的函数库,优化了Cortex-M处理器上的神经网络算法的执行效率。CMSIS-NN特别适用于机器学习和人工智能应用,通过提供高效的计算内核,实现低功耗和高性能的神经网络推理。
7.2 关键组件
- 卷积层:提供卷积操作。
- 全连接层:提供全连接层操作。
- 激活函数:如ReLU、Sigmoid等。
- 池化层:如最大池化、平均池化等。
- 量化函数:支持神经网络模型的量化操作。
7.3 示例代码
c
#include "arm_nnfunctions.h"
// 卷积层示例
void NN_Example(void) {
q7_t input_data[32*32*3];
q7_t output_data[32*32*16];
q7_t kernel[3*3*3*16];
q7_t bias[16];
arm_convolve_HWC_q7_basic(input_data, 32, 32, 3, kernel, 3, 16, 1, 1, bias, 0, output_data, 32, NULL, NULL);
}
7.4 详细解释
卷积层:卷积层是神经网络中的基本组成部分,用于提取输入数据中的特征。CMSIS-NN库提供了优化的卷积操作函数,通过利用Cortex-M处理器的SIMD指令集,实现高效的卷积计算。
全连接层:全连接层将输入数据与权重矩阵相乘,并加上偏置,得到输出结果。CMSIS-NN库中的全连接层函数经过优化,能够高效地执行矩阵乘法和加法运算。
激活函数:激活函数用于引入非线性,使得神经网络能够学习复杂的映射关系。CMSIS-NN库提供了常见的激活函数,如ReLU(修正线性单元)、Sigmoid(S形函数)等。
池化层:池化层用于对特征图进行降采样,减少数据量和计算量。CMSIS-NN库提供了最大池化和平均池化函数,能够高效地实现特征图的降采样。
量化函数:量化函数用于将浮点数值转换为定点数值,降低神经网络模型的存储和计算成本。CMSIS-NN库中的量化函数支持模型的量化操作,使得神经网络能够在资源受限的嵌入式系统上高效运行。
8. CMSIS-Zone
8.1 概述
CMSIS-Zone是CMSIS的一个组件,提供了多核处理器和多域应用的内存保护和管理功能。通过CMSIS-Zone,开发者可以将系统划分为多个保护域,每个保护域具有独立的访问权限和资源分配。
8.2 关键功能
- 内存分区:定义内存区域及其访问权限。
- 多域支持:支持多域应用的资源隔离和管理。
- 安全扩展:支持TrustZone-M等安全扩展功能。
8.3 示例
c
#include "cmsis_zone.h"
// 定义内存分区
void Zone_Init(void) {
ZONE_Setup(0, 0x20000000, 0x20001000, ZONE_ACCESS_READWRITE);
ZONE_Setup(1, 0x20001000, 0x20002000, ZONE_ACCESS_READONLY);
}
8.4 详细解释
内存分区:CMSIS-Zone允许开发者将内存划分为多个保护区域,每个区域可以定义不同的访问权限。这种机制可以有效隔离系统的不同部分,确保关键数据和代码的安全性。例如,可以将敏感数据区域设置为只读,而将其他区域设置为读写,以防止未经授权的访问或修改。
多域支持:多域支持使得系统能够在多个保护域之间实现资源隔离和管理。这对于复杂的嵌入式系统尤其重要,尤其是在需要同时运行多个应用程序或服务的场景中。通过多域支持,系统可以确保各个域之间不会相互干扰,提升了系统的可靠性和安全性。
安全扩展:CMSIS-Zone支持与TrustZone-M等安全扩展的集成,使得系统能够在硬件层面提供增强的安全性。TrustZone-M技术允许处理器将内存和外设分为安全域和非安全域,从而实现更高水平的保护和隔离。通过利用这些安全扩展,开发者可以实现更加安全的嵌入式系统设计。
9. CMSIS-RTOS API的详细解析
9.1 概述
CMSIS-RTOS API是一组用于实时操作系统(RTOS)的标准接口,定义了任务、定时器、信号量、互斥量等基本RTOS功能的操作。通过CMSIS-RTOS API,开发者可以在不同的RTOS上编写可移植的应用程序,而无需修改代码。
9.2 关键接口
- 任务管理:包括任务创建、删除、启动和管理。
- 定时器管理:包括软件定时器的创建、启动、停止和回调处理。
- 信号量:用于线程间同步和互斥。
- 互斥量:保护共享资源,避免竞态条件。
- 消息队列:线程间的消息传递和管理。
- 事件标志:线程间的事件同步和管理。
9.3 示例代码
c
#include "cmsis_os2.h"
#define THREAD_STACK_SIZE 256
// 线程1函数
void Thread1(void *argument) {
while (1) {
// 线程处理代码
osDelay(1000); // 延时1秒
}
}
// 线程2函数
void Thread2(void *argument) {
while (1) {
// 线程处理代码
osDelay(500); // 延时0.5秒
}
}
int main(void) {
osKernelInitialize(); // 初始化RTOS内核
// 创建线程1
osThreadNew(Thread1, NULL, &(const osThreadAttr_t) {
.name = "Thread1",
.stack_size = THREAD_STACK_SIZE,
.priority = osPriorityNormal
});
// 创建线程2
osThreadNew(Thread2, NULL, &(const osThreadAttr_t) {
.name = "Thread2",
.stack_size = THREAD_STACK_SIZE,
.priority = osPriorityNormal
});
osKernelStart(); // 启动RTOS调度器
while (1) {
// 主循环
}
}
9.4 详细解释
任务管理:CMSIS-RTOS API提供了一组函数用于管理任务的创建、删除、启动和调度。通过定义任务优先级、堆栈大小和任务属性,开发者可以控制任务的行为和资源分配。任务调度由RTOS调度器根据任务的优先级和状态来决定哪个任务应该运行。
定时器管理:软件定时器用于周期性任务的执行和时间延迟操作。CMSIS-RTOS API允许开发者创建、启动、停止和管理软件定时器。定时器可以在到达设定时间后触发回调函数,用于执行定时操作或定期检查。
信号量:信号量用于线程间的同步和互斥,确保多个线程之间的协调。CMSIS-RTOS API提供了创建、获取、释放和删除信号量的功能。信号量有两种类型:计数信号量和二进制信号量,分别用于资源管理和简单的同步。
互斥量:互斥量用于保护共享资源,避免多个线程同时访问共享资源而引发竞态条件。CMSIS-RTOS API提供了创建、获取、释放和删除互斥量的功能。通过使用互斥量,开发者可以确保在任何时刻只有一个线程可以访问共享资源。
消息队列:消息队列用于线程间的消息传递和管理。CMSIS-RTOS API提供了创建、发送、接收和删除消息队列的功能。消息队列可以存储多个消息,并按照先进先出的顺序传递消息,支持线程间的通信和数据交换。
事件标志:事件标志用于线程间的事件同步和管理。CMSIS-RTOS API提供了创建、设置、清除和等待事件标志的功能。事件标志可以用于线程间的同步和协调,使得一个线程可以等待另一个线程的事件发生。
10. CMSIS的应用场景
10.1 嵌入式系统
CMSIS广泛应用于各种嵌入式系统,包括消费电子产品、工业控制、汽车电子和医疗设备等。通过提供标准化的接口和库,CMSIS简化了嵌入式系统的开发过程,提高了代码的移植性和重用性。
10.2 实时操作系统
CMSIS-RTOS API被广泛应用于实时操作系统中,用于管理任务、定时器、信号量和互斥量等功能。通过CMSIS-RTOS API,开发者可以在不同的RTOS平台上编写可移植的应用程序,简化了RTOS的使用和集成。
10.3 神经网络
CMSIS-NN库在机器学习和人工智能应用中得到了广泛应用。通过提供高效的神经网络计算内核,CMSIS-NN库使得Cortex-M处理器能够高效地执行神经网络推理,适用于低功耗和高性能的嵌入式应用。
10.4 设备驱动
CMSIS-Driver库提供了一组标准化的外设驱动接口,使得开发者可以方便地访问微控制器的各种外设,如UART、SPI、I2C等。通过CMSIS-Driver,驱动代码可以在不同的硬件平台上保持一致,简化了外设驱动的开发和维护。
10.5 软件包管理
CMSIS-Pack定义了一种软件包描述格式,用于管理和分发软件组件。通过CMSIS-Pack,开发者可以方便地安装、更新和移除软件组件,简化了软件开发和维护过程。
11. 结论
CMSIS作为ARM公司开发的一套软件标准接口,提供了统一的开发环境和标准化的API,极大地简化了嵌入式软件开发的复杂性。通过CMSIS-Core、CMSIS-DSP、CMSIS-RTOS、CMSIS-Driver、CMSIS-Pack、CMSIS-NN、CMSIS-Zone等组件,开发者可以高效地实现各种嵌入式应用,包括实时操作系统、神经网络、外设驱动等。CMSIS的标准化接口和库函数使得代码的移植性和重用性大大提高,推动了嵌入式系统的发展和创新。
CMSIS的应用场景非常广泛,从消费电子产品到工业控制,从实时操作系统到神经网络推理,CMSIS都发挥了重要的作用。随着技术的不断发展,CMSIS将继续为嵌入式软件开发提供强大的支持和便利,推动嵌入式系统的进步和创新。
12. 参考文献
-
ARM官方CMSIS页面
- ARM CMSIS
提供了CMSIS的最新文档、下载链接和相关资源。
- ARM CMSIS
-
ARM CMSIS-RTOS API文档
- CMSIS-RTOS API Documentation
包含详细的CMSIS-RTOS API说明和使用指南。
- CMSIS-RTOS API Documentation
-
ARM CMSIS-DSP库
- CMSIS-DSP Library
提供了CMSIS-DSP库的功能说明、示例代码和优化信息。
- CMSIS-DSP Library
-
CMSIS-Pack
- CMSIS-Pack
介绍了CMSIS-Pack的使用和软件包管理的详细信息。
- CMSIS-Pack
-
CMSIS-NN库
- CMSIS-NN
提供了CMSIS-NN库的功能、接口和优化信息。
- CMSIS-NN
-
ARM CMSIS-Zone
- CMSIS-Zone
介绍了CMSIS-Zone的功能和应用场景。
- CMSIS-Zone
-
Keil MDK
- Keil MDK
提供了Keil MDK集成开发环境的详细信息,支持CMSIS的开发和调试。
- Keil MDK
-
Github - CMSIS库
- CMSIS GitHub Repository
提供了CMSIS库的源码、示例和更新信息。
- CMSIS GitHub Repository
-
CMSIS文档下载
- CMSIS Documentation Downloads
包含CMSIS的各类文档、开发指南和工具链的下载链接。
- CMSIS Documentation Downloads
13. 结束语
- 本节内容已经全部介绍完毕,希望通过这篇文章,大家对
CMSIS
有了更深入的理解和认识。- 感谢各位的阅读和支持,如果觉得这篇文章对你有帮助,请不要吝惜你的点赞和评论 ,这对我们非常重要。再次感谢大家的关注和支持 !点我关注❤️