STM32固件庫詳解

1.1 基於標準外設庫的軟件開發

1.1.1 STM32標準外設庫概述

STM32標準外設庫之前的版本也稱固件函數庫或簡稱固件庫,是一個固件函數包,它由程序、數據結構和宏組成,包括了微控制器所有外設的性能特徵。該函數庫還包括每一個外設的驅動描述和應用實例,爲開發者訪問底層硬件提供了一箇中間API,通過使用固件函數庫,無需深入掌握底層硬件細節,開發者就可以輕鬆應用每一個外設。因此,使用固態函數庫可以大大減少用戶的程序編寫時間,進而降低開發成本。每個外設驅動都由一組函數組成,這組函數覆蓋了該外設所有功能。每個器件的開發都由一個通用API (application programming interface 應用編程界面)驅動,API對該驅動程序的結構,函數和參數名稱都進行了標準化。

ST公司2007年10月發佈了V1.0版本的固件庫,MDK ARM3.22之前的版本均支持該庫。2008年6月發佈了V2.0版的固件庫,從2008年9月推出的MDK ARM3.23版本至今均使用V2.0版本的固件庫。V3.0以後的版本相對之前的版本改動較大,本書使用目前較新的V3.4版本。

1.1.2 使用標準外設庫開發的優勢

簡單的說,使用標準外設庫進行開發最大的優勢就在於可以使開發者不用深入瞭解底層硬件細節就可以靈活規範的使用每一個外設。標準外設庫覆蓋了從GPIO到定時器,再到CAN、I2C、SPI、UART和ADC等等的所有標準外設。對應的C源代碼只是用了最基本的C編程的知識,所有代碼經過嚴格測試,易於理解和使用,並且配有完整的文檔,非常方便進行二次開發和應用。

1.1.3 STM32F10XXX標準外設庫結構與文件描述
1. 標準外設庫的文件結構

在上一小節中已經介紹了使用標準外設庫的開發的優勢,因此對標準外設庫的熟悉程度直接影響到程序的編寫,下面讓我們來認識一下STM32F10XXX的標準外設庫。STM32F10XXX的標準外設庫經歷衆多的更新目前已經更新到最新的3.5版本,開發環境中自帶的標準外設庫爲2.0.3版本,本書中以比較穩定而且較新的V3.4版本爲基礎介紹標準外設庫的結構。

可以從ST的官方網站下載到各種版本的標準外設庫,首先看一下3.4版本標準外設庫的文件結構,如圖 5‑3所示。3.0以上版本的文件結構大致相同,每個版本可能略有調整。

clip_image002[19]

圖 5‑3 STM32F10XXX V3.4標準外設庫文件結構

表 5‑4中介紹了每個文件夾所包含的主要內容。

表 5‑4 STM32F10XXX V3.4標準外設庫文件夾描述

STM32F10x_StdPeriph_Lib_V3.4.0

_htmresc

本文件夾包含了所有的html頁面資源

Libraries

CMSIS

見表 5‑6

STM32F10x_StdPeriph_Driver

inc

標準外設庫驅動頭文件

src

標準外設庫驅動源文件

Project

Examples

標準外設庫驅動的完整例程

Template

MDK-ARM

KEIL RVMDK的項目模板示例

RIDE

Raisonance RIDE的項目模板示例

EWARM

IAR EWARM的項目模板示例

Utilities

STM3210-EVAL

本文件夾包含了用於STM3210B-EVAL和STM3210E-EVAL評估板的專用驅動

標準外設庫的第一部分是CMSIS 和STM32F10x_StdPeriph_Driver,CMSIS 是獨立於供應商的Cortex-M 處理器系列硬件抽象層,爲芯片廠商和中間件供應商提供了簡單的處理器軟件接口,簡化了軟件複用工作,降低了Cortex-M 上操作系統的移植難度,並減少了新入門的微控制器開發者的學習曲線和新產品的上市時間。STM32F10x_StdPeriph_Driver則包括了分別對應包括了所有外設對應驅動函數,這些驅動函數均使用C語言編寫,並提供了統一的易於調用的函數接口,供開發者使用。Project文件夾中則包括了ST官方的所有例程和基於不同編譯器的項目模板,這些例程是學習和使用STM32的重要參考。Utilities包含了相關評估板的示例程序和驅動函數,供使用官方評估板的開發者使用,很多驅動函數同樣可以作爲學習的重要參考。

STM32F10xxx標準外設庫體系結構如圖 5‑4所示。圖中很好的展示了各層以及具體文件之間的聯繫,各文件的具體功能說明如表 5‑5所示。

clip_image004[6]

圖 5‑4 STM32F10xxx標準外設庫體系結構

表 5‑5 文件功能說明

文件名

功能描述

具體功能說明

core_cm3.h

core_cm3.c

Cortex-M3內核及其設備文件

訪問Cortex-M3內核及其設備:NVIC,SysTick等

訪問Cortex-M3的CPU寄存器和內核外設的函數

stm32f10x.h

微控制器專用頭文件

這個文件包含了STM32F10x全系列所有外設寄存器的定義(寄存器的基地址和佈局)、位定義、中斷向量表、存儲空間的地址映射等

system_stm32f10x.h

system_stm32f10x.c

微控制器專用系統文件

函數SystemInit,用來初始化微控制器

函數Sysem_ExtMemCtl,用來配置外部存儲器控制器。它位於文件startup_stm32f10x_xx.s /.c,在跳轉到main前調用

SystemFrequncy,該值代表系統時鐘頻率

startup_stm32f10x_Xd.s

編譯器啓動代碼

微控制器專用的中斷處理程序列表(與頭文件一致)

弱定義(Weak)的中斷處理程序默認函數(可以被用戶代碼覆蓋) 該文件是與編譯器相關的

stm32f10x_conf.h

固件庫配置文件

通過更改包含的外設頭文件來選擇固件庫所使用的外設,在新建程序和進行功能變更之前應當首先修改對應的配置。

stm32f10x_it.h

stm32f10x_it.c

外設中斷函數文件

用戶可以相應的加入自己的中斷程序的代碼,對於指向同一個中斷向量的多個不同中斷請求,用戶可以通過判斷外設的中斷標誌位來確定準確的中斷源,執行相應的中斷服務函數。

stm32f10x_ppp.h

stm32f10x_ppp.c

外設驅動函數文件

包括了相關外設的初始化配置和部分功能應用函數,這部分是進行編程功能實現的重要組成部分。

Application.c

用戶文件

用戶程序文件,通過標準外設庫提供的接口進行相應的外設配置和功能設計。

2. 基於CMSIS標準的軟件架構

根據調查研究,軟件開發已經被嵌入式行業公認爲最主要的開發成本。對於ARM公司來說,一個ARM內核往往會授權給多個廠家,生產種類繁多的產品,如果沒有一個通用的軟件接口標準,那麼當開發者在使用不同廠家的芯片時將極大的增加了軟件開發成本,因此,ARM與Atmel、IAR、Keil、hami-nary Micro、Micrium、NXP、SEGGER和ST等諸多芯片和軟件廠商合作,將所有Cortex芯片廠商產品的軟件接口標準化,制定了CMSIS標準。此舉意在降低軟件開發成本,尤其針對新設備項目開發,或者將已有軟件移植到其他芯片廠商提供的基於Cortex處理器的微控制器的情況。有了該標準,芯片廠商就能夠將他們的資源專注於產品外設特性的差異化,並且消除對微控制器進行編程時需要維持的不同的、互相不兼容的標準的需求,從而達到降低開發成本的目的。

如圖 5‑5所示,基於CMSIS標準的軟件架構主要分爲以下4層:用戶應用層、操作系統及中間件接口層、CMSIS層、硬件寄存器層。其中CMSIS層起着承上啓下的作用:一方面該層對硬件寄存器層進行統一實現,屏蔽了不同廠商對Cortex-M系列微處理器核內外設寄存器的不同定義;另一方面又向上層的操作系統及中間件接口層和應用層提供接口,簡化了應用程序開發難度,使開發人員能夠在完全透明的情況下進行應用程序開發。也正是如此,CMSIS層的實現相對複雜。

clip_image005[6]

圖 5‑5 CMSIS標準的軟件架構

層主要分爲以下3 個部分:

(1) 核內外設訪問層(CPAL,Core Peripheral Access Layer):該層由ARM 負責實現。包括對寄存器名稱、地址的定義,對核寄存器、NVIC、調試子系統的訪問接口定義以及對特殊用途寄存器的訪問接口(例如:CONTROL,xPSR)定義。由於對特殊寄存器的訪問以內聯方式定義,所以針對不同的編譯器ARM 統一用來屏蔽差異。該層定義的接口函數均是可重入的。

(2) 片上外設訪問層(DPAL, Device Peripheral Access Layer):該層由芯片廠商負責實現。該層的實現與CPAL 類似,負責對硬件寄存器地址以及外設訪問接口進行定義。該層可調用CPAL 層提供的接口函數同時根據設備特性對異常向量表進行擴展,以處理相應外設的中斷請求。

(3) 外設訪問函數(AFP, Access Functions for Peripherals):該層也由芯片廠商負責實現,主要是提供訪問片上外設的訪問函數,這一部分是可選的。

對一個Cortex-M 微控制系統而言,CMSIS 通過以上三個部分實現了:

l 定義了訪問外設寄存器和異常向量的通用方法;

l 定義了核內外設的寄存器名稱和核異常向量的名稱;

l 爲RTOS 覈定義了與設備獨立的接口,包括Debug 通道。

這樣芯片廠商就能專注於對其產品的外設特性進行差異化,並且消除他們對微控制器進

行編程時需要維持的不同的、互相不兼容的標準需求,以達到低成本開發的目的。CMSIS中的具體文件結構如表 5‑6所示。

表 5‑6 CMSIS文件夾結構

CMSIS

Core

Documentation

CMSIS文檔

CM3

Startup

arm

MDK ARM編譯器啓動文件

startup_stm32f10x_hd.s: 大容量產品啓動文件

startup_stm32f10x_md.s: 中容量產品啓動文件

startup_stm32f10x_ld.s: 小容量產品啓動文件

gcc_ride7

GCC編譯器啓動文件

iar

IAR編譯器啓動文件

TrueSTUDIO

TrueSTUDIO編譯器啓動文件

本文件夾包含STMF10xxx CMSIS文件:微控制器外設訪問層和內核設備訪問層:

core_cm3.h:CMSIS的Cortex-M3內核設備訪問層頭文件

core_cm3.c:CMSIS的Cortex-M3內核設備訪問層源文件

stm32f10x.h:CMSIS的Cortex-M3 STM32f10xxx微控制器外設訪問層頭文件

system_stm32f10x.h:CMSIS的Cortex-M3 STM32f10xxx微控制器外設訪問層頭文件

system_stm32f10x.c:CMSIS的Cortex-M3 STM32f10xxx微控制器外設訪問層源文件

在實際開發過程中,根據應用程序的需要,可以採取2種方法使用標準外設庫(StdPeriph_Lib):

(1) 使用外設驅動:這時應用程序開發基於外設驅動的API(應用編程接口)。用戶只需要配置文件”stm32f10x_conf.h”,並使用相應的文件”stm32f10x_ppp.h/.c”即可。

(2) 不使用外設驅動:這時應用程序開發基於外設的寄存器結構和位定義文件。

這兩種方法的優缺點在“使用標準外設庫開發的優勢”小節中已經有了具體的介紹,這裏仍要說明的是,使用使用標準外設庫進行開發可以極大的減小軟件開發的工作量,也是目前嵌入式系統開發的一個趨勢。

標準外設庫(StdPeriph_Lib)支持STM32F10xxx系列全部成員:大容量,中容量和小容量產品。從表 5‑6中也可以看出,啓動文件已經對不同的系列進行了劃分,實際開發中根據使用的STM32產品具體型號,用戶可以通過文件”stm32f10x.h”中的預處理define或者通過開發環境中的全局設置來配置標準外設庫(StdPeriph_Lib),一個define對應一個產品系列。

下面列出支持的產品系列

STM32F10x_LD:STM32小容量產品

STM32F10x_MD:STM32中容量產品

STM32F10x_HD:STM32大容量產品

在庫文件中這些define的具體作用範圍是:

l 文件“stm3210f.h”中的中斷IRQ定義

l 啓動文件中的向量表,小容量,中容量,大容量產品各有一個啓動文件

l 外設存儲器映像和寄存器物理地址

l 產品設置:外部晶振(HSE)的值等

l 系統配置函數

因此通過宏定義這種方式,可以使標準外設庫適用於不同系列的產品,同時也方便與不同產品之間的軟件移植,極大的方便了軟件的開發。

1.1.4 STM32F10XXX標準外設庫的使用

標準外設庫中包含了衆多的變量定義和功能函數,如果不能瞭解他們的命名規範和使用規律將會給編程帶來很大的麻煩,本節將主要敘述標準外設庫中的相關規範,通過這些規範的學習可以更加靈活的使用固件庫,同時也將極大增強程序的規範性和易讀性,同時標準外設庫中的這種規範也值得我們在進行其他相關的開發時使用和借鑑。

1. 縮寫定義

標準外設庫中的主要外設均採用了縮寫的形式,通過這些縮寫可以很容易的辨認對應的外設。

縮寫

外設/單元

ADC

模數轉換器

BKP

備份寄存器

CAN

控制器局域網模塊

CEC

 

CRC

CRC計算單元

DAC

數模轉換器

DBGMCU

調試支持

DMA

直接內存存取控制器

EXTI

外部中斷事件控制器

FLASH

閃存存儲器

FSMC

靈活的靜態存儲器控制器

GPIO

通用輸入輸出

I2C

I2C接口

IWDG

獨立看門狗

PWR

電源/功耗控制

RCC

復位與時鐘控制器

RTC

實時時鐘

SDIO

SDIO接口

SPI

串行外設接口

TIM

定時器

USART

通用同步/異步收發器

WWDG

窗口看門狗

2. 命名規則

標準外設庫遵從以下命名規則 PPP表示任一外設縮寫,例如:ADC。源程序文件和頭文件命名都以“stm32f10x_”作爲開頭,例如:stm32f10x_conf.h。常量僅被應用於一個文件的,定義於該文件中;被應用於多個文件的,在對應頭文件中定義。所有常量都由英文字母大寫書寫。寄存器作爲常量處理。他們的命名都由英文字母大寫書寫。在大多數情況下,他們採用與縮寫規範一致。外設函數的命名以該外設的縮寫加下劃線爲開頭。每個單詞的第一個字母都由英文字母大寫書寫,例如:SPI_SendData。在函數名中,只允許存在一個下劃線,用以分隔外設縮寫和函數名的其它部分。對於函數命名,總的來說有以下規則:

l 名爲PPP_Init的函數,其功能是根據PPP_InitTypeDef中指定的參數,初始化外設PPP,例如TIM_Init.

l 名爲PPP_DeInit的函數,其功能爲復位外設PPP的所有寄存器至缺省值,例如TIM_DeInit.

l 名爲PPP_Init的函數,其功能爲通過設置PPP_InitTypeDef 結構中的各種參數來定義外設的功能,例如:USART_Init .

l 名爲PPP_Cmd的函數,其功能爲使能或者失能外設PPP,例如: SPI_Cmd.

l 名爲PPP_ITConfig的函數,其功能爲使能或者失能來自外設PPP某中斷源,例如: RCC_ITConfig.

l 名爲PPP_DMAConfig的函數,其功能爲使能或者失能外設PPP的DMA接口,例如:TIM1_DMAConfig.

l 用以配置外設功能的函數,總是以字符串“Config”結尾,例如GPIO_PinRemapConfig.

l 名爲PPP_GetFlagStatus的函數,其功能爲檢查外設PPP某標誌位被設置與否,例如:I2C_GetFlagStatus.

l 名爲PPP_ClearFlag的函數,其功能爲清除外設PPP標誌位,例如:I2C_ClearFlag.

l 名爲PPP_GetITStatus的函數,其功能爲判斷來自外設PPP的中斷髮生與否,例如:I2C_GetITStatus.

l 名爲PPP_ClearITPendingBit的函數,其功能爲清除外設PPP中斷待處理標誌位,例如: I2C_ClearITPendingBit.

這樣的命名方式非常便於程序的編寫和閱讀,以標準外設庫中的示例函數爲例,下面摘錄了STM32F10x_StdPeriph_Examples\ADC\3ADCs_DMA\mian.c中的一段程序。

複製代碼
 1 DMA_InitType Def DMA_InitStructure;
 2 
 3 /* DMA1 channel1 configuration ----------------------------------------------*/
 4 
 5 DMA_DeInit(DMA1_Channel1);
 6 
 7 DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
 8 
 9 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC1ConvertedValue;
10 
11 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
12 
13 DMA_InitStructure.DMA_BufferSize = 1;
14 
15 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
16 
17 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
18 
19 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
20 
21 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
22 
23 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
24 
25 DMA_InitStructure.DMA_Priority = DMA_Priority_High;
26 
27 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
28 
29 DMA_Init(DMA1_Channel1, &DMA_InitStructure);
30 
31 /* Enable DMA1 channel1 */
32 
33 DMA_Cmd(DMA1_Channel1, ENABLE);
複製代碼

 

這段程序完成了DMA1通道的配置,首先定義了DMA_InitType DMA_InitStructure,接着配置DMA_InitType的各種參數,各參數的命名方式也均使用約定的命名方式,從命名就能夠很容易的看出各參數所指代的具體功能。功能參數配置完成後,使用DMA_Init(DMA1_Channel1, &DMA_InitStructure);完成相應外設的初始化,最後使用DMA_Cmd(DMA1_Channel1, ENABLE) 使能相應外設。從這個例子就能夠很容易的看出標準外設庫這種規範化的命名規則給編寫和閱讀程序帶來的好處。

3. 變量定義

在早期的版本中有24個變量定義,在Keil的安裝根目錄下,可以找到對應的定義,路徑爲:Keil\ARM\INC\ST\STM32F10x\stm32f10x_type.h

複製代碼
 1 /* Includes ------------------------------------------------------------------*/
 2 
 3 /* Exported types ------------------------------------------------------------*/
 4 
 5 typedef signed long s32;
 6 
 7 typedef signed short s16;
 8 
 9 typedef signed char s8;
10 
11 typedef signed long const sc32; /* Read Only */
12 
13 typedef signed short const sc16; /* Read Only */
14 
15 typedef signed char const sc8; /* Read Only */
16 
17 typedef volatile signed long vs32;
18 
19 typedef volatile signed short vs16;
20 
21 typedef volatile signed char vs8;
22 
23 typedef volatile signed long const vsc32; /* Read Only */
24 
25 typedef volatile signed short const vsc16; /* Read Only */
26 
27 typedef volatile signed char const vsc8; /* Read Only */
28 
29 typedef unsigned long u32;
30 
31 typedef unsigned short u16;
32 
33 typedef unsigned char u8;
34 
35 typedef unsigned long const uc32; /* Read Only */
36 
37 typedef unsigned short const uc16; /* Read Only */
38 
39 typedef unsigned char const uc8; /* Read Only */
40 
41 typedef volatile unsigned long vu32;
42 
43 typedef volatile unsigned short vu16;
44 
45 typedef volatile unsigned char vu8;
46 
47 typedef volatile unsigned long const vuc32; /* Read Only */
48 
49 typedef volatile unsigned short const vuc16; /* Read Only */
50 
51 typedef volatile unsigned char const vuc8; /* Read Only */
複製代碼

 

3.0以後的版本中使用了CMSIS數據類型,變量的定義有所不同,但是出於兼容舊版本的目的,以上的數據類型仍然兼容。CMSIS的IO類型限定詞如表 5‑7所示,CMSIS和STM32固件庫的數據類型對比如表 5‑8所示。這些數據類型可以在STM32F10x_StdPeriph_Lib_V3.4.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\stm32f10x.h中找到具體的定義,此部分定義如下。

複製代碼
 1 /*!< STM32F10x Standard Peripheral Library old types (maintained for legacy purpose) */
 2 
 3 typedef int32_t s32;
 4 
 5 typedef int16_t s16;
 6 
 7 typedef int8_t s8;
 8 
 9 typedef const int32_t sc32; /*!< Read Only */
10 
11 typedef const int16_t sc16; /*!< Read Only */
12 
13 typedef const int8_t sc8; /*!< Read Only */
14 
15 typedef __IO int32_t vs32;
16 
17 typedef __IO int16_t vs16;
18 
19 typedef __IO int8_t vs8;
20 
21 typedef __I int32_t vsc32; /*!< Read Only */
22 
23 typedef __I int16_t vsc16; /*!< Read Only */
24 
25 typedef __I int8_t vsc8; /*!< Read Only */
26 
27 typedef uint32_t u32;
28 
29 typedef uint16_t u16;
30 
31 typedef uint8_t u8;
32 
33 typedef const uint32_t uc32; /*!< Read Only */
34 
35 typedef const uint16_t uc16; /*!< Read Only */
36 
37 typedef const uint8_t uc8; /*!< Read Only */
38 
39 typedef __IO uint32_t vu32;
40 
41 typedef __IO uint16_t vu16;
42 
43 typedef __IO uint8_t vu8;
44 
45 typedef __I uint32_t vuc32; /*!< Read Only */
46 
47 typedef __I uint16_t vuc16; /*!< Read Only */
48 
49 typedef __I uint8_t vuc8; /*!< Read Only */
複製代碼

 

表 5‑7 CMSIS IO類型限定詞

IO類限定詞

#define

描述

_I

volatile const

只讀訪問

_O

volatile

只寫訪問

_IO

volatile

讀和寫訪問

表 5‑8 固件庫與CMSIS數據類型對比

固件庫類型

CMSIS類型

描述

s32

int32_t

易揮發只讀有符號32位數據

s16

int16_t

易揮發只讀有符號16位數據

s8

int8_t

易揮發只讀有符號8位數據

sc32

const int32_t

只讀有符號32位數據

sc16

const int16_t

只讀有符號16位數據

sc8

const int8_t

只讀有符號8位數據

vs32

_IO int32_t

易揮發讀寫訪問有符號32位數據

vs16

_IO int16_t

易揮發讀寫訪問有符號16位數據

vs8

_IO int8_t

易揮發讀寫訪問有符號8位數據

vsc32

_I int32_t

易揮發只讀有符號32位數據

vsc16

_I int16_t

易揮發只讀有符號16位數據

vsc8

_I int8_t

易揮發只讀有符號8位數據

u32

uint32_t

無符號32位數據

u16

uint16_t

無符號16位數據

u8

uint8_t

無符號8位數據

uc32

const uint32_t

只讀無符號32位數據

uc16

const uint16_t

只讀無符號16位數據

uc8

const uint8_t

只讀無符號8位數據

vu32

_IO uint32_t

易揮發讀寫訪問無符號32位數據

vu16

_IO uint16_t

易揮發讀寫訪問無符號16位數據

vu8

_IO uint8_t

易揮發讀寫訪問無符號8位數據

vuc32

_I uint32_t

易揮發只讀無符號32位數據

vuc16

_I uint16_t

易揮發只讀無符號16位數據

vuc8

_I uint8_t

易揮發只讀無符號8位數據

stm32f10x.h文件中還包含了常用的布爾形變量定義,如:

複製代碼
1 typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
2 
3 typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
4 
5 #define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))
6 
7 typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;
複製代碼

 

不同版本的標準外設庫的變量定義略有不同,如3.4版本中就沒有之前版本的TRUE和FALSE的定義,用戶也可以根據自己的需求按照上面的格式定義自己的布爾形變量。在使用標準外設庫進行開發遇到相關的定義問題時應首先找到對應的頭文件定義。

4. 使用步驟

前面幾個小節已經詳細介紹了標準外設庫的組成結構以及部分主要文件的功能描述,那麼如果在開發中使用標準外設庫需要哪些描述呢?下面就進行簡要的介紹,這兒介紹的使用方法是與開發環境無關的,在不同的開發環境中可能在操作方式上略有不同,但是總體的流程都是一樣的,下一小節將介紹在MDK ARM開發環境下使用標準外設庫的詳細過程。

首先新建一個項目並設置工具鏈對應的啓動文件,可以使用標準外設庫中提供的模板,也可以自己根據自己的需求新建。標準外設庫中已經提供了不同工具鏈對應的文件,位於STM32F10x_StdPeriph_Lib_V3.4.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup目錄下。

其次按照使用產品的具體型號選擇具體的啓動文件,加入工程。文件主要按照使用產品的容量進行區分,根據產品容量進行選擇即可。每個文件的具體含義可以在“stm32f10x.h”文件中找到對應的說明,摘錄如下:

複製代碼
 1 #if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL)
 2 
 3 /* #define STM32F10X_LD */ /*!< STM32F10X_LD: STM32 Low density devices */
 4 
 5 /* #define STM32F10X_LD_VL */ /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */
 6 
 7 /* #define STM32F10X_MD */ /*!< STM32F10X_MD: STM32 Medium density devices */
 8 
 9 /* #define STM32F10X_MD_VL */ /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */ /* #define STM32F10X_HD */ /*!< STM32F10X_HD: STM32 High density devices */
10 
11 /* #define STM32F10X_HD_VL */ /*!< STM32F10X_HD_VL: STM32 High density value line devices */
12 
13 /* #define STM32F10X_XL */ /*!< STM32F10X_XL: STM32 XL-density devices */
14 
15 /* #define STM32F10X_CL */ /*!< STM32F10X_CL: STM32 Connectivity line devices */
16 
17 #endif
18 
19 /* Tip: To avoid modifying this file each time you need to switch between these
20 
21 devices, you can define the device in your toolchain compiler preprocessor.
22 
23 - Low-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers
24 
25 where the Flash memory density ranges between 16 and 32 Kbytes.
26 
27 - Low-density value line devices are STM32F100xx microcontrollers where the Flash
28 
29 memory density ranges between 16 and 32 Kbytes.
30 
31 - Medium-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers
32 
33 where the Flash memory density ranges between 64 and 128 Kbytes.
34 
35 - Medium-density value line devices are STM32F100xx microcontrollers where the
36 
37 Flash memory density ranges between 64 and 128 Kbytes.
38 
39 - High-density devices are STM32F101xx and STM32F103xx microcontrollers where
40 
41 the Flash memory density ranges between 256 and 512 Kbytes.
42 
43 - High-density value line devices are STM32F100xx microcontrollers where the
44 
45 Flash memory density ranges between 256 and 512 Kbytes.
46 
47 - XL-density devices are STM32F101xx and STM32F103xx microcontrollers where
48 
49 the Flash memory density ranges between 512 and 1024 Kbytes.
50 
51 - Connectivity line devices are STM32F105xx and STM32F107xx microcontrollers.
52 
53 */
複製代碼

 

“stm32f10x.h”是整個標準外設庫的入口文件,這個文件包含了STM32F10x全系列所有外設寄存器的定義(寄存器的基地址和佈局)、位定義、中斷向量表、存儲空間的地址映射等。爲了是這個文件適用於不同系列的產品,程序中是通過宏定義來實現不同產品的匹配的,上面這段程序的註釋中已經詳細給出了每個啓動文件所對應的產品系列,與之對應,也要相應的修改這個入口文件,需要根據所使用的產品系列正確的註釋/去掉相應的註釋define。在這段程序的下方同樣有這樣的一個註釋程序/*#define USE_STDPERIPH_DRIVER*/ 用於選擇是否使用標準外設庫,如果保留這個註釋,則用戶開發程序可以基於直接訪問“stm32f10x.h”中定義的外設寄存器,所有的操作均基於寄存器完成,目前不使用固件庫的單片機開發,如51、AVR、MSP430等其實都是採用此種方式,通過在對應型號的頭文件中進行外設寄存器等方面的定義,從而在程序中對相應的寄存器操作完成相應的功能設計。

如果去掉/*#define USE_STDPERIPH_DRIVER*/的註釋,則是使用標準外設庫進行開發,用戶需要使用在文件“stm32f10x_conf.h”中,選擇要用的外設,外設同樣是通過註釋/去掉註釋的方式來選擇。示例程序如下:

複製代碼
 1 /* Uncomment the line below to enable peripheral header file inclusion */
 2 
 3 #include "stm32f10x_adc.h"
 4 
 5 /* #include "stm32f10x_bkp.h" */
 6 
 7 /* #include "stm32f10x_can.h" */
 8 
 9 /* #include "stm32f10x_cec.h" */
10 
11 /* #include "stm32f10x_crc.h" */
12 
13 /* #include "stm32f10x_dac.h" */
14 
15 /* #include "stm32f10x_dbgmcu.h" */
16 
17 #include "stm32f10x_dma.h"
18 
19 /* #include "stm32f10x_exti.h" */
20 
21 /* #include "stm32f10x_flash.h" */
22 
23 /* #include "stm32f10x_fsmc.h" */
24 
25 #include "stm32f10x_gpio.h"
26 
27 /* #include "stm32f10x_i2c.h" */
28 
29 /* #include "stm32f10x_iwdg.h" */
30 
31 /* #include "stm32f10x_pwr.h" */
32 
33 #include "stm32f10x_rcc.h"
34 
35 /* #include "stm32f10x_rtc.h" */
36 
37 /* #include "stm32f10x_sdio.h" */
38 
39 /* #include "stm32f10x_spi.h" */
40 
41 /* #include "stm32f10x_tim.h" */
42 
43 /* #include "stm32f10x_usart.h" */
44 
45 /* #include "stm32f10x_wwdg.h" */
46 
47 #include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */
複製代碼

 

上面一段程序來自於例程中的AD採集程序,程序使用了AD和DMA,因此去掉相應的註釋,同時幾乎所有的應用都需要使用復位與時鐘以及通用I/O,因此這兩項是必須的,

而多數程序同樣要使用NVIC中斷IRQ設置和SysTick時鐘源設置,那麼 “misc.h”這一項也是必須的。

上面已經針對具體的產品信號和程序功能進行了針對性的配置,接下來需要配置系統所使用的時鐘,系統時鐘在“system_stm32f10x.c”同樣通過註釋的方式來配置,程序如下:

複製代碼
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)

/* #define SYSCLK_FREQ_HSE HSE_VALUE */

#define SYSCLK_FREQ_24MHz 24000000

#else

/* #define SYSCLK_FREQ_HSE HSE_VALUE */

/* #define SYSCLK_FREQ_24MHz 24000000 */

/* #define SYSCLK_FREQ_36MHz 36000000 */

/* #define SYSCLK_FREQ_48MHz 48000000 */

/* #define SYSCLK_FREQ_56MHz 56000000 */

#define SYSCLK_FREQ_72MHz 72000000

#endif
複製代碼

 

如果這兒沒有明確的定義那麼HSI時鐘將會作爲系統時鐘。

至此,已經配置了系統的主要外部參數,這些參數主要是通過更改相關的宏定義來實現的,有些開發環境,例如Keil支持在軟件設置中加入全局宏定義,因此像芯片系列定義,是否使用固件庫定義等也可以通過軟件添加來實現。

完成了主要參數配置以後就可以進行程序的開發了,標準外設庫開發就可以使用標準外設庫中提供的方便的API函數進行相應的功能設計了。在4.2.2小節中已經介紹了基於標準外設庫開發的優勢,配置完成後,程序中仍然可以直接更改相應寄存器的配置,通過對寄存器的操作可以提高程序的效率,因此可以使用標準外設庫和寄存器操作兩種相結合的方式。

★emouse 思·睿博客文章★ 原創文章轉載請註明:http://emouse.cnblogs.com
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章