電控---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.pswp.cn/pingmian/77163.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77163.shtml
英文地址,請注明出處:http://en.pswp.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…