?

基于固件庫的STM32F107的程序設計方法探討

2015-05-04 08:54張明華
數字技術與應用 2014年12期
關鍵詞:程序設計

張明華

摘要:隨著半導體技術的快速發展,一代又一代的微控制器芯片應運而生。與傳統的8位或者16位單片機相比,32位的ARM芯片的內核和外設功能更加強大,結構更加復雜,帶來的后果就是寄存器數量和配置難度增加。文章以意法半導體公司生產的STM32F107為例,對此類微控制器芯片的編程方法做了詳細的探討,并給初學者提出了相應的建議。

關鍵詞:MCU 程序設計 固件庫

中圖分類號:TP311.1 文獻標識碼:A 文章編號:1007-9416(2014)12-0171-01

目前,STM32F107的程序設計有兩種方法:一種是直接操作寄存器;另外一種是調用固件庫。究竟哪一種才是最適合的編程方法,傳統的單片機開發者和初學者的觀點分歧很大。本文對這兩類編程方法做了詳細的探討。

1 固件庫介紹

固件庫,就是STM32F10x Standard Peripherals Firmware Library的意思,簡稱STM32固件庫。它是意法半導體公司針對STM32系列MCU發布的一組函數庫,并且符合CMSIS標準[1]。STM32固件庫是一個函數包,由程序、數據結構和宏組成,包括了STM32系列MCU標準外設的性能特征。每個外設驅動都由一組函數組成,而這組函數覆蓋了該外設所有功能。每個器件的開發都由一個通用API驅動,API對該驅動程序的結構,函數和參數名稱都進行了標準化。所有的驅動源代碼都符合“Strict ANSI-C”標準,因此它不受不同開發環境的影響有較好的移植性。

2 直接操作寄存器

簡單來講,直接操作寄存器就是在寄存器的配置時,計算配置字的二進制數值,直接寫入寄存器。為了實現PD2管腳不斷地輸出高低電平,編程步驟如下。

(1)將RCC_APB2ENR寄存器的第5位即GPIOD口時鐘位置1,開啟GPIOD時鐘。

(2)計算PD2管腳設置為推挽輸出時的配置字為0x00000300,并寫入GPIOD_CRL寄存器中。

(3)通過向GPIOD_BSRR寄存器寫入0x00000004來實現PD2管腳輸出高電平。

(4)通過向GPIOD_BRR寄存器寫入0x00000004來實現PD2管腳輸出低電平。

部分代碼如下:

int main(void)

{

RCC->APB2ENR|=1<<5;

GPIOD->CRL&=0xfffff0ff;

GPIOD->CRL|=0x00000300;

while(1)

{ GPIOD->BSRR=0x00000004;

GPIOD->BRR=0x00000004;

}

}

這種方法與傳統51等單片機的編程方法類似,效率也比較高,應用程序代碼少,執行速度快。但是在編程以前,我們必須要做好功課,因為每個外設的寄存器都不是一樣的。另外,對于32位寄存器來講,想要記住每一位所代表的功能幾乎是不可能的。

3 調用固件庫

對于STM32F10x系列MCU來講,固件庫都是通用的,并且包括了所有標準外設的基本功能函數。所以,編程者可以直接調用固件庫函數來進行外設的配置和使用。另外,意法半導體公司在《STM32固件庫使用手冊》中也給出了標準外設的配置步驟[2]。

(1)在main.c中,聲明一個結構體PPP_InitTypeDef。

例如: PPP_InitTypeDef PPP_InitStructure; 這里PPP_InitStructure是一個位于內存中的工作變量,用來初始化一個或者多個外設PPP。

(2)為變量PPP_InitStructure的各個結構成員填入允許的值??梢圆捎靡韵?種方式:

1)按照如下程序設置整個結構體PPP_InitStructure.member1 = val1; PPP_InitStructure.member2 = val2; 如果有多個成員則繼續賦值。

2)僅設置結構體中的部分成員:這種情況下,用戶應當首先調用函數PPP_SturcInit(..)來初始化變量PPP_InitStructure,然后再修改其中需要修改的成員。這樣可以保證其他成員的值(多為缺省值)被正確填入。

(3)調用函數PPP_Init(..)來初始化外設PPP。

(4)在這一步,外設PPP已被初始化??梢哉{用函數PPP_Cmd(..)來使能外設。

(5)可以通過調用一系列函數來使用外設。每個外設都擁有各自的功能函數。

注意,在設置一個外設前,必須調用以下一個函數來使能它的時鐘: RCC_AHBPeriphClockCmd(RCC_AHBPeriph_PPPx, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_PPPx, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_PPPx, ENABLE);

按照上述步驟,將實現PD2管腳翻轉的程序改寫如下:

int main(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

GPIO_Init(GPIOD,&GPIO_InitStructure);

while(1)

{

GPIO_SetBits(GPIOD, GPIO_Pin_2);

GPIO_ResetBits(GPIOD, GPIO_Pin_2);

}

}

如果有一定的英文和C語言編程基礎,從上述程序不難看出其實現功能。正是因為有固件庫的存在,編程者只需要調用庫函數和標準的宏定義便可實現相應的功能,并不需要了解實際寄存器的配置字。盡管在庫函數中,仍然是操作寄存器的方式,但計算配置字的工作由庫函數代勞,大大減輕了程序員的工作量和出錯幾率。

4 結語

直接操作寄存器效率高,代碼少。調用固件庫則更加簡單和快速,程序易讀性好。其實,這兩種方法并沒有明顯的界限。目前大部分直接操作寄存器的代碼也沒有完全脫離固件庫,即寄存器定義和地址等仍然調用固件庫的定義,但是配置字自己寫。對于那些在代碼大小和執行速度方面有嚴格要求的應用程序,會直接操作寄存器以減少函數的嵌套等,提高效率。

本文推薦初學者使用調用STM32固件庫的編程方法,這樣既可以較快地掌握外設的使用,又可以加快學習和開發速度。因為對于初學者來說,效率并沒有那么重要,重要的還是能夠盡快入門。

參考文獻

[1]劉同法.ARM Cortex-M3內核微控制器快速入門與應用[M].北京:北京航空航天大學出版社,2009.

[2]意法半導體公司.STM32固件庫使用手冊.endprint

猜你喜歡
程序設計
基于SolidWorks和VBA的電機階梯軸建模程序設計
高職Java程序設計課程體系建設思考
基于Visual Studio Code的C語言程序設計實踐教學探索
從細節入手,談PLC程序設計技巧
基于LabVIEW的車載充電機控制程序設計
淺談基于C語言的計算機軟件程序設計
高職高專院校C語言程序設計教學改革探索
OBE理念下基于Greenfoot的Java程序設計課程教學改革
模塊化程序設計在一體化檢定平臺中的應用
PLC梯形圖程序設計技巧及應用
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合