官术网_书友最值得收藏!

第5章 STM32單片機標準外設固件庫

為了后續能夠順利進行STM32單片機開發,首先需要初步熟悉該平臺對應的固件庫,具體包括標準的外圍設備(簡稱“外設”,可以理解為“控制器”)固件庫(不同的單片機系列對應不同的固件庫,STM32F103C8T6對應STM32F10x_StdPeriph_Lib)與USB全速設備固件庫(STM32_USB-FS-Device_Lib)。也就是說,與USB控制器相關的固件庫是分開的,我們先從標準的外圍設備固件庫切入。

有人可能會問:為什么要使用固件庫呢?記得以前開發51單片機的時候可沒這些?直接訪問底層寄存器就可以做項目呀!實際上,STM32單片機也可以采用直接訪問底層寄存器的方式編程,但是由于STM32單片機比51單片機復雜得多,底層的寄存器數量也很龐大,直接訪問它們還是會影響開發效率的,所以STM32單片機的生產廠商意法半導體(SGS-THOMSON Microelectronics, ST)推出了固件庫,它將對底層寄存器訪問的函數進行包裝,并提供一套應用程序接口(Application Programming Interface, API)函數,我們只需知道在適當的時候調用哪些函數即可。

當然,本書并不是不討論底層寄存器,只不過從固件庫入手能夠幫助你建立更宏觀的概念,否則直接鉆到一大堆寄存器當中就很難理清楚頭緒了。我們很快就會使用簡單的例子展示API函數與底層寄存器之間的映射關系。如此一來,即使你的開發平臺與本書并不一致,也并不影響你對本書內容的理解。換句話說。固件庫只是幫助我們理解USB控制器的工具,最終還是會深入硬件底層,畢竟我們要理解問題的實質所在,而不是簡單地運行一個例程就完事了。

那我們應該如何使用固件庫呢?一般在main主函數所在的文件中,只需包含頭文件stm32f10x.h即可,它與51單片機開發中需要包含的頭文件reg51.h具有等同的意義。但是前面已經提過,STM32單片機是比較復雜的,所以stm32f10x.h包含的信息量比較大(超過8000行代碼),其中的細節暫時不必深究,后續有需要時再來討論,但是你會看到其中又包含了幾個頭文件,如清單5.1所示。

清單5.1 stm32f10x.h頭文件(部分)

core_cm3.h(.c)是由ARM公司提供的核心文件,它提供了進入Cortex-M3內核的接口,不需要對其進行修改,而system_stm32f10x.h(.c)提供了設置系統與總線時鐘的函數。ARM是負責芯片內核架構設計的公司(Cortex-M3內核就是其中之一),其本身并不制造芯片。ST(或其他有需要的廠商)獲得Cortex-M3內核授權后,根據自己的市場戰略制造出一系列具體的單片機(簡單地說,就是在內核的基礎上添加很多控制器,如Timer、ADC、SPI、I2C、USB等)。ST之類芯片的制造廠商賣出的每個芯片,都需要給ARM公司繳納一定的費用,這就是ARM公司的營利模式。

由于多家廠商會從ARM公司獲得Cortex-M3授權,但是它們的市場戰略或本身擁有的資源不盡相同,最終制造出來的單片機自然也會有差異(內核仍然是一樣的)。為了讓使用相同內核的不同廠商單片機的源代碼能夠盡量保持兼容,ARM與芯片的制造廠商提出了ARM CortexTM微控制器軟件接口標準(Cortex Microcontroller Software Interface Standard, CMSIS)。簡單地說,CMSIS制定了一些規范化的命名方式,廠商在設計自己的固件庫時必須按該標準來做,這樣就不會出現不同的代碼風格。

頭文件stm32f10x_conf.h由ST廠商提供,主要用來包含相關外設控制器的頭文件(相當于多個頭文件的匯總),其主要源代碼如清單5.2所示。STM32單片機內部的每個控制器都對應了一個頭文件(與源文件),對于那些當前項目不需要使用的外設,將相應的“頭文件包含的預處理指令行”注釋掉即可(當然,也可以選擇全部包含,只不過編譯時間會長一些而已)。

清單5.2 stm32f10_conf.h頭文件

特別注意清單5.1中,必須要定義一個USE_STDPERIPH_DRIVER宏才能包含stm32f10_conf.h頭文件,我們通常會在開發軟件平臺(本書使用Keil)中定義,如圖5.1所示。

圖5.1 Keil軟件平臺中的宏定義

stdint.h頭文件是一個標準C庫文件,大部分單片機C編譯器均支持,其中定義了很多數據類型的別名,如清單5.3所示。

清單5.3 stdint.h頭文件(部分)

也就是說,在后續的編程開發過程中,我們不會直接使用標準C定義的char、int等基本數據類型,而是使用重新定義后的int8_t、int16_t等數據類型,這樣做的目的主要是保證固件庫的獨立性,以方便可能存在的源代碼移植,因為不同編譯器對每種基本數據類型字節大小的定義可能不完全一樣,如果直接使用char、int等基本數據類型,則更換平臺編譯后可能會使代碼產生解析上的錯誤,繼而導致出現功能異常;如果要讓它重新正確運行起來,就需要將固件庫中所有使用到的數據類型都做相應的替換,這將會非常麻煩且容易出錯!如果使用重定義后的數據類型,我們僅需要在必要時針對不同的編譯器更改stdint.h文件中的數據類型定義即可,而引用這些數據類型的源代碼卻可以完全保持不變,這就是剛剛提到的“保證固件庫獨立性”的意思。

總體上,在開發STM32單片機項目時需要的庫文件架構如圖5.2所示。其中,stm32f10x_it.h(.c)是存放STM32工程中所有中斷函數的模板文件。如果不使用中斷,可以將這兩個文件都去掉。當然,也可以將中斷函數放在其他的文件中。也就是說,這兩個文件的包含并不是必需的。stm32f10x_ppp.h(.c)是STM32外設驅動文件的統稱(ppp對應某個外設名稱),它對應諸如stm32f10x_gpio.h(.c)、stm32f10x_rcc.h(.c)等文件。misc.h(.c)是中斷向量嵌套的外設驅動文件,大家了解一下即可。

圖5.2 項目開發時需要的庫文件架構

前面提到的庫文件可以在ST廠商發布的標準固件庫中找到,V3.5.0版本的庫文件結構如圖5.3所示。

我們重點關注一下啟動文件(51單片機也有啟動文件),它主要包含堆棧初始化、中斷向量表及中斷函數的定義,不同STM32系列的單片機對應的啟動文件也不一樣,具體如表5.1所示,其中的“容量”主要針對Flash存儲器容量。通常,16~32KB為小容量,64~128KB為中容量,256~512KB為大容量,512~1024KB為超大容量。STM32F103C8T6的Flash存儲器容量大小為64KB,屬于中容量芯片,所以應該選擇startup_stm32f10x_md.s,只需要將其包含在項目中即可。

圖5.3 V3.5.0版本的庫文件結構

表5.1 不同芯片對應的啟動文件

不同芯片對應的啟動文件不一樣,相應的中斷號也會不一樣。stm32f10x.h頭文件針對不同芯片系列定義了各自的中斷號,如清單5.4所示,其中針對不同單片機系列定義了中斷號枚舉類型IRQn_Type。也就是說,宏STM32F10X_LD、STM32F10X_LD_VL、STM32F10X_MD、STM32F10X_MD_VL、STM32F10X_HD、STM32F10X_HD_VL、STM32F10X_XL、STM32F10X_CL與啟動文件是對應的,既然我們選擇的單片機對應的啟動文件是startup_stm32f10x_md.s,那么也應該定義相應的宏,所以圖5.1所示的對話框中還定義了STM32F10X_MD宏。

清單5.4 中容量STM32F10X系列單片機的中斷號定義

順便提一下本書對源代碼的注釋方式。官方固件庫的注釋語言均為英文,且使用“/**/”的注釋方式。如果本書對原來的注釋進行了任何修改(例如,刪除、增加、翻譯等),將會采用“//”的注釋方式,否則保持原有注釋形式不變。

當你需要使用某些庫文件進行開發時,可以選擇的方式主要有兩種:其一,將需要的庫文件復制到自己開發的每個項目中。雖然這會使項目的源代碼占用很大的磁盤空間,但可以將工程直接給別人使用(拿到手就可以編譯)。其二,直接從固件庫中添加相應的文件到項目中(庫文件不在項目所在的目錄下,只是引用而沒有復制)。雖然這種方式會占用較小的磁盤空間,但別人此時只有項目的源代碼而沒有固件庫(或固件庫的目錄跟你的設置不一致),需要重新進行固件庫文件的配置,比較麻煩。廠家為了方便對評估板例程進行管理,通常會使用后一種方式,這樣同一個評估板對應的多個例程就可以共享相同的庫文件了。

為了簡單起見,我們將所有需要的頭文件、源文件及啟動文件全部放在一個目錄下(切記,在stm32f10_conf.h頭文件中注釋掉沒有使用的外設對應的“頭文件包含的預處理指令行”,除非你已經將所有頭文件都復制過來),并且在該目錄下建立項目。將源文件與啟動文件添加到項目后的項目文件如圖5.4所示。

main.c是新建的源文件,后續編寫的應用代碼就在里面。如果你覺得項目文件有點亂,則可以進一步新建組(Group)對文件進行分組。“組”是一種邏輯上的概念,與目錄是不同的,即便你將所有文件都放在同一目錄,也可以進行“組”的劃分。例如,我們將核心文件與啟動文件歸為Core組,將外設文件歸為STM32F10x_StdPeriph_Driver組,其他文件歸為User組,分組后的項目文件如圖5.5所示。

圖5.4 將源文件與啟動文件添加到項目后的項目文件

圖5.5 分組后的項目文件

當然,現在項目中所有的文件都是“扎堆”放在同一目錄的,你也可以根據自己的習慣新建目錄將它們分類放置,只需要記得在圖5.1中將相關的頭文件目錄添加到“Include Paths”中,這已經不是本書的討論范疇了,大家了解一下即可。

還有一點值得提醒的是,在進行項目編譯時,應該勾選圖5.1所示對話框中“Output”標簽頁中的“Create HEX File”與“Browse Information”兩項,前者表示生成可被單片機執行的十六進制文件,將其下載到單片機就可以運行;后者表示編譯時生成瀏覽信息,這樣在Keil軟件平臺中進行標識符、函數或文件跳轉查詢時就會很方便,如圖5.6所示。

圖5.6 “Output”標簽頁

接下來就從main.c源文件開啟簡單快樂的編程開發之旅吧!

主站蜘蛛池模板: 哈巴河县| 道孚县| 苏州市| 广水市| 桂阳县| 名山县| 东海县| 鄱阳县| 金寨县| 江西省| 泸定县| 灵丘县| 丹巴县| 乌苏市| 金堂县| 涡阳县| 富锦市| 定陶县| 福州市| 麻栗坡县| 山阴县| 峨边| 武邑县| 浦东新区| 九龙坡区| 措勤县| 威宁| 体育| 鹤庆县| 濮阳县| 尼勒克县| 中江县| 铜鼓县| 岑巩县| 运城市| 长白| 海晏县| 清丰县| 桂平市| 临泉县| 磐石市|