基于CMSIS创建典型STM32F4工程
? ? ? ?這次我們來聊聊CMSIS。之前在Kile環(huán)境下創(chuàng)建STM32工程的時候,對有些文件的加入總不是很了解,書上或網(wǎng)上建立工程的教程對于這些文件的加入也是一筆帶過,或者直接不說。對于類似名叫core_cm3.h,system_stm32f4xx.c的文件的作用感到比較困惑。在閱讀了《ARM Cortex-m3與Conrtex-m4權(quán)威指南》之后,對CMSIS才有了一個比較清楚的了解,也知道為什么工程中需要加入這些文件了。
? ? ? ?以下內(nèi)容節(jié)選自《ARM Cortex-m3與Conrtex-m4權(quán)威指南》第三版,Joseph Yiu著,清華大學(xué)出版社出版。根據(jù)這些描述我將創(chuàng)建一個典型的STM32F4的工程,以便更好的來理解我們對CMSIS的闡述。如果你想深入了解Cortex-m3或Cortex-m4而不是停留在簡單的函數(shù)調(diào)用的話,我非常建議閱讀本書,它會很好的解答你在學(xué)習(xí)過程中遇到的很多問題。
1.CMSIS簡介
? ? ? ? CMSIS由ARM開發(fā),它使得微控制器和軟件供應(yīng)商可以使用一致的軟件結(jié)構(gòu)來開發(fā)Cortex微控制器的軟件,許多Cortex-M微控制器的軟件產(chǎn)品都是符合CMSIS的。
? ? ? ? 由于當前龐大的生態(tài)系統(tǒng),對軟件結(jié)構(gòu)進行某種形式的標準化已經(jīng)非常必要,這樣可以確保多種開發(fā)工具和不同軟件解決方案的兼容性。同時,嵌入式系統(tǒng)也變得越來越復(fù)雜,開發(fā)和軟件測試的工作量也顯著增加了。為了減少開發(fā)時間并且降低產(chǎn)品中存在缺陷的風(fēng)險,軟件重用已經(jīng)越來越普遍。另外,嵌入式系統(tǒng)的復(fù)雜度也增加了對第三方軟件解決方案的依賴。例如,一個嵌入式軟件工程可能會涉及各方面的軟件部件:
·內(nèi)部開發(fā)者開發(fā)的軟件
·重用的其他項目的軟件
·微控制器供應(yīng)商的設(shè)備驅(qū)動庫
·嵌入式OS
·通信協(xié)議棧等其他的第三方軟件產(chǎn)品
? ? ? ? 在這種情況下,各種軟件產(chǎn)品間的配合已經(jīng)非常關(guān)鍵。由于所有這些原因,ARM同各家微控制器供應(yīng)商、工具供應(yīng)商和軟件解決方案提供商一道開發(fā)了CMSIS——一個涵蓋了大多數(shù)Cortex-M處理器和Cortex-M微控制器產(chǎn)品的軟件框架。CMSIS項目仍在不斷更新。
? ? ? ? CMSIS項目有CMSIS-Core、CMSIS-DSP、CMSIS-SVD、CMSIS-RTOS、CMSIS-DAP。我們最能直觀感受到的就是CMSIS-Core。這些項目所做的工作都是對Contex-M芯片的使用進行一個標準化。下面我們來看看CMSIS-Core進行了哪些標準化。
2.CMSIS-Core所做的標準化
(1)處理器外設(shè)的標準化定義。
? ? ? ?這里注意區(qū)分處理器外設(shè)和微控制器的外設(shè)的區(qū)別,微控制器就像STM32,處理器就像STM32中的Cortex-M,我們知道處理器也是有自己的私房外設(shè)的,其中包括嵌套向量中斷控制器(NVIC)中的寄存器、處理器中的系統(tǒng)節(jié)拍定時器(SysTick)、可選的存儲器保護單元(MPU)、系統(tǒng)控制塊(SCB)中的多個可編程寄存器以及一些和調(diào)試特性相關(guān)的軟件可編程寄存器。注意:有些Cortex-M4中的寄存器在Cortex-M3中是不可用的,類似地,Cortex-M3和Cortex-M4中的一些寄存器在Cortex-M0中也是不可用的。
(2)訪問處理器特性的標準化函數(shù)。
? ? ? ?其中包括使用NVIC進行中斷控制的多個函數(shù)以及訪問處理器中特殊寄存器的函數(shù)。若需要的話,也可以直接訪問寄存器,而使用這些函數(shù)(有時也被稱作應(yīng)用編程接口,或者叫API)進行編程有助于提高軟件可移植性。實際上,你可以回憶在core_cm4.h中看到的很多“奇怪”的函數(shù),這里的函數(shù)指的就是他們。你可以放心的使用他們而不必擔(dān)心這些代碼在其他cortex系列的處理上無法運行,當然前提是代碼得符合CMSIS標準。???????
(3)操作特殊指令的標準化函數(shù)。
? ? ? ? ? Cortex-M處理器支持幾個用于特殊目的的指令(例如,等待中斷WFI,用于進入休眠模式),這些指令無法用普通的IEC/ISOC語言生成。CMSIS實現(xiàn)了一組函數(shù),C程序代碼可以利用這些函數(shù)實現(xiàn)特殊指令。若沒有這些函數(shù),用戶必須得使用工具鏈相關(guān)的解決方案,如內(nèi)在函數(shù)或內(nèi)聯(lián)匯編,才能將特殊指令插入應(yīng)用程序中,這樣會降低軟件的可重用性,而且為了避免出現(xiàn)錯誤,可能還需要對工具鏈的深入了解。CMSIS為這些特性提供了一種標準的API,這樣應(yīng)用程序開發(fā)者就可以輕松使用了。它們也存在于類似core_cm4.h的文件中。
(4)系統(tǒng)異常處理的標準化命名。
? ? ? ?多個系統(tǒng)異常類型在Cortex-M處理器的架構(gòu)中有所體現(xiàn),通過賦予這些系統(tǒng)異常處理標準化的命名,開發(fā)適用于多種Cortex-M產(chǎn)品的軟件也就更加容易。這對嵌入式OS開發(fā)者尤其重要,因為嵌入式OS需要使用一些系統(tǒng)異常。???????
(5)系統(tǒng)初始化的標準函數(shù)。
? ? ? ? 對于多數(shù)具有豐富特性的現(xiàn)代微控制器產(chǎn)品,在應(yīng)用程序開始前都需要配置時鐘電路和電源管理寄存器。在符合CMSIS的設(shè)備驅(qū)動庫中,這些配置過程由Systemlnit()實現(xiàn)。很顯然,該函數(shù)的實際實現(xiàn)是設(shè)備相關(guān)的,而且可能需要適應(yīng)多種工程需求。不過,由于有了標準的函數(shù)名、函數(shù)的標準使用方式以及函數(shù)的標準位置,設(shè)計者就能很容易地開始使用Cortex-M微控制器。???????
(6)描述時鐘頻率的標準化的變量。
? ? ? ? 這個看起來必要性不是很大,不過有時應(yīng)用程序代碼需要知道系統(tǒng)當前運行的時鐘頻率。例如,在設(shè)置UART波特率分頻器或初始化嵌人式OS使用的SysTick定時器時可能需要這種信息。CMSIS-Core中定義了一個軟件變量SystemCoreClock(用于CMSIS的1.3或者更新的版本,之前的版本為SystemFreq)。
另外,CMSIS-Core還提供了設(shè)備驅(qū)動庫的通用平臺。每個設(shè)備驅(qū)動庫看起來都是一樣的,這樣初學(xué)者使用設(shè)備就更加容易,而且軟件開發(fā)人員也可以很輕松地開發(fā)出用于多種Cortex-M微控制器產(chǎn)品的軟件。
3.CMSIS-Core的組織結(jié)構(gòu)
? ? ? ? CMSIS文件被集成在微控制器供應(yīng)商提供的設(shè)備驅(qū)動庫軟件包中,設(shè)備驅(qū)動庫中的有些文件是ARM準備的,對于各家微控制器供應(yīng)商都是一樣的,其他文件則取決于供應(yīng)商/設(shè)備。一般來說,可以將CMSIS定義為以下幾層:
1、內(nèi)核外設(shè)訪問層。名稱定義、地址定義以及訪問內(nèi)核寄存器和內(nèi)核外設(shè)的輔助函數(shù),這是處理器相關(guān)的,由ARM提供。
2、設(shè)備外設(shè)訪問層。名稱定義、外設(shè)寄存器的地址定義以及包括中斷分配、異常向量定義等的系統(tǒng)設(shè)計,這是設(shè)備相關(guān)的(注意:同一家供應(yīng)商的多個設(shè)備可能會使用同一組文件)。
3、外設(shè)訪問函數(shù)。訪問外設(shè)的驅(qū)動代碼,這是供應(yīng)商相關(guān)的,而且是可選的。在開發(fā)應(yīng)用程序時,可以選擇使用微控制器供應(yīng)商提供的外設(shè)驅(qū)動代碼,或者有必要,也可以直接訪問外設(shè)。
? ? ? ?對于外設(shè)訪問還提出了另外一層:中間件訪問層。該層在當前的CMSIS版本中不存在,現(xiàn)在的設(shè)想為,開發(fā)一組用于訪問UART、SPI以及以太網(wǎng)等常見外設(shè)的API。若該層存在,中間件開發(fā)人員可以基于該層開發(fā)自己的應(yīng)用程序,這樣軟件在設(shè)備間移植也就更加容易。各層角色如下圖所示
? ? ? ? 注意在有些情況下,設(shè)備驅(qū)動庫中可能會包含用于微控制器供應(yīng)商設(shè)計的NVIC的函數(shù)(例如可能大部分人都使用過的misc.c文件中的函數(shù)),它們是供應(yīng)商定義的。CMSIS的目標為提供一個共同的起點,微控制器供應(yīng)商也可以根據(jù)自己的意愿添加其他的函數(shù)。不過若軟件需要在另外一個微控制器產(chǎn)品上重用,就需要移植。
4、如何使用CMSIS-Core
? ? ? ? ?CMSIS文件位于微控制器供應(yīng)商提供的設(shè)備驅(qū)動軟件包中,因此,在使用微控制器供應(yīng)商提供的設(shè)備驅(qū)動庫時,就已經(jīng)在使用CMSIS了。
? ? ? ? ?一般來說,需要做到以下幾點。
(1)將源文件添加到工程中,其中包括:
·設(shè)備相關(guān),工具鏈相關(guān)的啟動代碼,C或匯編。
·設(shè)備相關(guān)的設(shè)備初始化代碼(如system_stm32f1xx.c)。
·用于外設(shè)訪問功能的其他供應(yīng)商相關(guān)的源文件,這是可選的(如GPIO,USART等外設(shè)的.c文件)。
·對于CMSIS-Core庫的CMSIS2.00或者之前版本,為了訪問內(nèi)核寄存器,可能還需要將一個處理器相關(guān)的C程序文件(如core_cm3.c)添加到工程中,從CMSIS-Core版本2.10開始就不再需要了(只需要添加core_cm3.h即可)。
(2)將頭文件添加到搜索路徑中,其中包括:
·用于外設(shè)寄存器定義和中斷分配定義的設(shè)備相關(guān)的頭文件(如stm32f1xx.h)。
·用于設(shè)備初始化代碼的設(shè)備相關(guān)的頭文件(如system_stm32f1xx.h)。
·多個處理器相關(guān)的頭文件(如core_cm3.h、core_cm4.h,它們對于所有的微控制器供應(yīng)商都是相同的)。
·其他可選的用于外設(shè)訪問的供應(yīng)商相關(guān)的頭文件(如GPIO,USART等外設(shè)的.h文件)。
·有些情況下,開發(fā)組件中可能會包含一些預(yù)安裝的CMSIS支持文件。
? ? ? ?有些情況下,在創(chuàng)建一個新的工程時,集成開發(fā)環(huán)境(IDE)會自動設(shè)置啟動代碼,要不然,還需要手動將設(shè)備驅(qū)動庫中的啟動代碼(如startup_stm32f401xx.s)添加到工程中。處理器的啟動流程需要啟動代碼,它包括中斷處理所需的異常向量表定義。
具體如下圖所示:
? ? ? ?下面我將利用我下載得到的STM32F4xx_DSP_StdPeriph_Lib_V1.8.0標準庫根據(jù)上面第4條如何使用CMSIS-Core的說明來構(gòu)建一個基于標準庫的STM32F4開發(fā)環(huán)境。在STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\CMSIS目錄下有一個叫index的html文件,對其中的CMSIS文件作用做了說明:
? ? ? ? 從中我們可以看出我們要使用的CMSIS-Core文件在Include文件夾中。我們可以看到這里還有CMSIS-DSP項目,日后如果要用微控制器進行DSP之類的,可以來使用這其中的文件,可以看到它甚至還為ARMCC和GCC開發(fā)工具做好了相應(yīng)的庫,如GCC就是一個集成的.a文件,非常方便,也比較高效,那么下面就開始動手吧。
1、首先在桌面新建一個文件夾stm32f4_TestProject。
2、打開并在其中建立一個名叫CMSIS的文件夾,專門存放我們的CMSIS文件;建立MDK文件夾,用來存放工程文件;建立USER文件夾,用來存放應(yīng)用代碼;建立StdPeriph_Lib文件夾,用來存放外設(shè)標準庫函數(shù)。
3、在CMSIS中建立Include目錄,加入core_cm4.h、core_cmSimd.h、core_cmInstr.h、core_cmFunc.h、stm32f4xx.h、stm32f4xx.h。繼續(xù)在CMSIS目錄中加入啟動文件startup_stm32f401xx.s。加入system_stm32f4xx.c文件
4、在StdPeriph_Lib目錄中視需要加入標準外設(shè)啟動庫函數(shù),在USER目錄添加自己的工程文件,和一個stm32f4xx_conf.h控制引入的頭文件即可。
5、打開kile5,新建工程,設(shè)備選擇STM32F4RE,而后添加文件到工程,添加頭文件路徑就不再說了。
6,添加宏定義 USE_STDPERIPH_DRIVER,STM32F40XX
7,編譯運行, 0 Error(s), 0 Warning(s).
? ? ? ?實際上可以看到,這就是按照上圖的工程結(jié)構(gòu)來進行搭建的,只有對每一個文件的加入理解了,才能更好的組織工程代碼,使我們的工作更有條理。
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的基于CMSIS创建典型STM32F4工程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python opencv 图像网络传输
- 下一篇: java中子类和父类的初始化和函数调用关