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標志接口下,用戶可以不用關心底層的實現過程,只需要編寫自己用戶層的代碼即可,極大提高了代碼的移植性、重用性和開發速度。