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
英文地址,請注明出處:http://en.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;如果查到唯一結果則自動填充…