百科名片
ARM Cortex™ 微控制器軟體接口標準(CMSIS:Cortex Microcontroller Software Interface Standard) 是 Cortex-M 處理器系列的與供應商無關的硬體抽象層。 使用CMSIS,可以為處理器和外設實現一致且簡單的軟體接口,從而簡化軟體的重用、縮短微控制器新開發人員的學習過程,並縮短新設備的上市時間。軟體的創建被嵌入式行業公認為主要成本係數。通過在所有Cortex-M 晶片供應商產品中標準化軟體接口,這一成本會明顯降低,尤其是在創建新項目或將現有軟體遷移到新設備時。最新版本的CMSIS 為3.5。
結構
CMSIS是ARM公司與多家不同的晶片和軟體供應商一起緊密合作定義的,提供了核心與外設、實時作業系統和中間設備之間的通用接口。
CMSIS軟體層次
CMSIS可以分為多個軟體層次,分別由ARM公司、晶片供應商提供。
其中ARM提供了下列部分,可用於多種編譯器:
● 核心設備訪問層:包含了用來訪問核心的暫存器設備的名稱定義,地址定義和助手函式。同時也為RTOS(實時作業系統)定義了獨立於微控制器的接口,該接口包括調試通道定義。
● 中間設備訪問層:為軟體提供了訪問外設的通用方法。晶片供應商應當修改中間設備訪問層,以適應中間設備組件用到的微控制器上的外設。目前中間設備訪問層仍處於開發過程中,本文不做詳述。 晶片供應商擴展下列軟體層:
● 微控制器外設訪問層:提供片上所有外設的定義。
● 外設的訪問函式(可選):為外設提供額外的助手函式。CMSIS為Cortex-Mx微控制器系統定義了:
● 訪問外設暫存器的通用方法和定義異常向量的通用方法。
● 核心設備的暫存器名稱和核心異常向量的名稱。
● 獨立於微控制器的RTOS接口,帶調試通道。
● 中間設備組件接口(TCP/IP協定棧,快閃記憶體檔案系統)。
CMSIS包含的組件
1、外圍暫存器和中斷定義: 適用於設備暫存器和中斷的一致接口
2、核心外設函式:特定處理器功能和核心外設的訪問函式
3、DSP 庫:最佳化的信號處理算法,並為 SIMD 指令提供Cortex-M4 支持
4、系統視圖說明(SVD):描述設備外設和中斷的XML 檔案。
該標準完全可擴展,可確保其適合於所有 Cortex-M處理器系列微控制器,從最小的8 KB 設備到具有複雜通信外設(如乙太網或USB)的設備。(核心外設函式的記憶體要求少於1 KB 代碼,少於10 位元組RAM)。
基於CMSIS應用程式的基本結構
CMSIS-外設訪問層的檔案
獨立於編譯器的檔案:
● Cortex-M3核心及其設備檔案(core_cm3.h + core_cm3.c)
─ 訪問Cortex-M3核心及其設備:NVIC,SysTick等
─ 訪問Cortex-M3的CPU暫存器和核心外設的函式
● 微控制器專用頭檔案(device.h)
─ 指定中斷號碼(與啟動檔案一致)
─ 外設暫存器定義(暫存器的基地址和布局)
─ 控制微控制器其他特有的功能的函式(可選)
● 微控制器專用系統檔案(system_device.c)
─ 函式SystemInit,用來初始化微控制器
─ 函式Sysem_ExtMemCtl,用來配置外部存儲器控制器。它位於檔案
startup_stm32f10x_xx.s /.c,在跳轉到main前調用
─SystemFrequncy,該值代表系統時鐘頻率
─ 微控制器的其他功能(可選)
編譯器供應商+微控制器專用啟動檔案
● 編譯器啟動代碼(彙編或者C)(startup_device.s)
─ 微控制器專用的中斷處理程式列表(與頭檔案一致)
─ 弱定義(Weak)的中斷處理程式默認函式(可以被用戶代碼復蓋)
CMSIS軟體包詳細目錄
下載的CMSIS軟體包含有Cortex M3核的支持檔案以及基於Cortex M3核處理器的啟動代碼和庫引導檔案。
使用步驟
以STM32F10XX序列處理為例,介紹CMSIS的使用步驟。
1、從ST官方網站下載3.0以上版本的標準外設庫。
2、基於開發軟體新建工程,建立相應的檔案目錄,注意詢問是否加入啟動檔案時,選擇“否”。
3、根據所選晶片,把Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm中的啟動代碼加到工程中。
4、根據處理器FLASH容量的大小,選擇啟動代碼。stm32f10x.h 的66-73 行表明了啟動代碼的類型。例如STM32F10X_HD 行表示大容量的,如果不需要直接注釋掉即可。
5、選擇是否啟用標準外設庫。stm32f10x.h的105行的USE_STDPERIPH_DRIVER用於確定是否啟用,如果不啟用直接注釋掉。
6、確定處理器的頻率。system_stm32f10x.c的110-115行用於確定處理器的頻率,注釋掉不需要的即可。例如處理器的頻率為是36MHz,注釋SYSCLK_FREQ_72MHz,去掉SYSCLK_FREQ_36MHz注釋。