STM32固件庫分析

前言

因爲基於 Cortex 系列芯片採用的內核都是相同的,區別主要爲核外的片上外設的差異,這些差異卻導致軟件在同內核,不同外設的芯片上移植困難。爲了解決不同的芯片廠商生產的 Cortex 微控制器軟件 的兼容性問題,ARM 與芯片廠商建立了 CMSIS 標準(Cortex MicroController Software Interface Standard)。所謂 CMSIS 標準,實際是新建了一個軟件抽象層。見圖
CMSIS架構
CMSIS 標準中最主要的爲 CMSIS 核心層,它包括了:
內核函數層:其中包含用於訪問內核寄存器的名稱、地址定義,主要由 ARM 公司提供。

設備外設訪問層:提供了片上的核外外設的地址和中斷定義,主要由芯片生產商提供

1. 庫目錄、文件簡介

採用 3.5.0 庫文件,內容如下:
庫內容
Libraries文件夾:驅動庫的源代碼及啓動文件,使用的固件庫就在這裏面。
Project文件夾:驅動實例和工程模板,可以參考這裏面的例程。
Utilities文件夾:包含ST官方實驗板例程,略過。
stm32f10x_…文件,庫幫助文檔,可以查看外設聲明,求助。

2. \Libraries\CMSIS\CM3下文件

在使用庫開發時,我們需要把 libraries 目錄下的庫函數文件添加到工程中,並查閱庫幫助文檔來了解 ST 提供的庫函數。

文件一覽

2.1 \CoreSupport文件夾

在這個文件夾下:
Core_cm3.h 頭文件裏面實現了內核的寄存器映射,對應外設頭文件 stm32f10x.h,區別就是一個針對內核的外設,一個針對片上(內核之外)的外設。

core_cm3.c 文件實現了一下操作內核外設寄存器的函數,用的比較少。

我們還需要了解的是 core_cm3.h 頭文件中包含了“stdint.h” 這個頭文件,這是一個ANSI C 文件,是獨立於處理器之外的,就像我們熟知的 C 語言頭文件 “stdio.h” 文件一樣。位於 RVMDK 這個軟件的安裝目錄下,主要作用是提供一些類型定義。如下:

/* exact-width signed integer types */
2. typedef signed char int8_t;
3. typedef signed short int int16_t;
4. typedef signed int int32_t;
5. typedef signed _int64 int64_t;
6. /* exact-width unsigned integer types */
7. typedef unsigned char uint8_t;
8. typedef unsigned short int uint16_t;
9. typedef unsigned int uint32_t;
10. typedef unsigned __int64 uint64_t;

2.2 DeviceSupport\ST\STM32F10x文件夾

2.2.1 \startup文件夾

啓動文件放在 startup/arm 這個文件夾下面,這裏面啓動文件有很多個,不同型號的單片機用的啓動文件不一樣,有關每個啓動文件的詳細說明見表
啓動文件對照表

2.2.2 Stm32f10x.h文件

這個頭文件實現了片上外設的所以寄存器的映射,是一個非常重要的頭文件,在內核
中與之想對應的頭文件是 core_cm3.h

2.2.3 Stm32f10x.h文件

這個頭文件實現了片上外設的所以寄存器的映射,是一個非常重要的頭文件,在內核中與之想對應的頭文件是 core_cm3.h。

2.2.4 system_stm32f10x.c文件

system_stm32f10x.c 文件實現了 STM32的時鐘配置,操作的是片上的 RCC 這個外設。系統在上電之後,首選會執行由彙編編寫的啓動文件,啓動文件中的復位函數中調用的SystemInit 函數就在這個文件裏面定義。調用完之後,系統的時鐘就被初始化成 72M。
如果後面我們需要重新配置系統時鐘,我們就可以參考這個函數重寫。爲了維持庫的完整性,我們不會直接在這個文件裏面修改時鐘配置函數。

3.\Libraries\STM32F10x_StdPeriph_Driver下文件

進入 libraries目錄下的 STM32F10x_StdPeriph_Driver 文件夾,見圖
文件夾
inc(include 的縮寫)跟 src(source 的簡寫)這兩個文件夾,這裏的文件屬於 CMSIS 之外的的、芯片片上外設部分。src 裏面是每個設備外設的驅動源程序,inc 則是相對應的外設頭文件。src 及 inc 文件夾是 ST 標準庫的主要內容,甚至不少人直接認爲 ST 標準庫就是指這些文件,可見其重要性。

這兩個文件夾中,還有一個很特別的 misc.c 文件,這個文件提供了外設對內核中的NVIC(中斷向量控制器)的訪問函數,在配置中斷時,我們必須把這個文件添加到工程中。

4. \Project\STM32F10x_StdPeriph_Template下文件

在這個文件目錄下,存放了官方的一個庫工程模板,我們在用庫建立一個完整的工程時,還需要添加這個目錄下的stm32f10x_it.c、stm32f10x_it.h、stm32f10x_conf.h 和
system_stm32f10x.c 這四個文件。

stm32f10x_it.c:這個文件是專門用來編寫中斷服務函數的,在我們修改前,這個文件已經定義了一些系統異常(特殊中斷)的接口,其它普通中斷服務函數由我們自己添加。

system_stm32f10x.c:這個文件包含了 STM32 芯片上電後初始化系統時鐘、擴展外部存儲器用的函數,例如我們前兩章提到供啓動文件調用的“SystemInit”函數,用於上電後初始化時鐘,該函數的定義就存儲在 system_stm32f10x.c 文件。STM32F103 系列的芯片,調用庫的這個 SystemInit 函數後,系統時鐘被初始化爲 72MHz,如有需要可以修改這個文件的內容,設置成自己所需的時鐘頻率,但鑑於保持庫的完整性,我們在做系統時鐘配置的時候會另外重寫時鐘配置函數。

stm32f10x_conf.h:這個文件被包含進 stm32f10x.h 文件。把外設的頭文件全部包含在裏面,統一管理。還可配置是否使用“斷言”編譯選項。

5. 庫文件之間關係

有的庫文件是直接包含進工程即可,絲毫不用修改,而有的文件就要我們在使用的時候根據具體的需要進行配置。接下來從整體上把握一下各個文件在庫工程中的層次或關係,這些文件對應到 CMSIS 標準架構上。如圖:
在這裏插入圖片描述
描述了 STM32 庫各文件之間的調用關係,在實際的使用庫開發工程的過程中,我們把位於 CMSIS 層的文件包含進工程,除了特殊系統時鐘需要修改 system_stm32f10x.c,其它文件絲毫不用修改,也不建議修改。
對於位於用戶層的幾個文件,就是我們在使用庫的時候,針對不同的應用對庫文件進行增刪(用條件編譯的方法增刪)和改動的文件。

後記

認識官方的固件庫是很重要,是固件庫編程的基礎。
CMSIS自我感覺它的功能屏蔽了寄存器地址的細節,不用再尋找寄存器地址

附錄

需要有固件庫資源的朋友們,可找下面鏈接:
鏈接: STM32F103官方固件庫V3.5.0.zip.

新建固件庫工程的步驟以及成品,可在以下鏈接找到:
鏈接: 新建工程加模板.zip.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章