国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于固件庫的STM32F107的程序設(shè)計(jì)方法探討

2015-05-04 08:54:40張明華
關(guān)鍵詞:程序設(shè)計(jì)

張明華

摘要:隨著半導(dǎo)體技術(shù)的快速發(fā)展,一代又一代的微控制器芯片應(yīng)運(yùn)而生。與傳統(tǒng)的8位或者16位單片機(jī)相比,32位的ARM芯片的內(nèi)核和外設(shè)功能更加強(qiáng)大,結(jié)構(gòu)更加復(fù)雜,帶來的后果就是寄存器數(shù)量和配置難度增加。文章以意法半導(dǎo)體公司生產(chǎn)的STM32F107為例,對(duì)此類微控制器芯片的編程方法做了詳細(xì)的探討,并給初學(xué)者提出了相應(yīng)的建議。

關(guān)鍵詞:MCU 程序設(shè)計(jì) 固件庫

中圖分類號(hào):TP311.1 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-9416(2014)12-0171-01

目前,STM32F107的程序設(shè)計(jì)有兩種方法:一種是直接操作寄存器;另外一種是調(diào)用固件庫。究竟哪一種才是最適合的編程方法,傳統(tǒng)的單片機(jī)開發(fā)者和初學(xué)者的觀點(diǎn)分歧很大。本文對(duì)這兩類編程方法做了詳細(xì)的探討。

1 固件庫介紹

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

2 直接操作寄存器

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

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

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

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

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

部分代碼如下:

int main(void)

{

RCC->APB2ENR|=1<<5;

GPIOD->CRL&=0xfffff0ff;

GPIOD->CRL|=0x00000300;

while(1)

{ GPIOD->BSRR=0x00000004;

GPIOD->BRR=0x00000004;

}

}

這種方法與傳統(tǒng)51等單片機(jī)的編程方法類似,效率也比較高,應(yīng)用程序代碼少,執(zhí)行速度快。但是在編程以前,我們必須要做好功課,因?yàn)槊總€(gè)外設(shè)的寄存器都不是一樣的。另外,對(duì)于32位寄存器來講,想要記住每一位所代表的功能幾乎是不可能的。

3 調(diào)用固件庫

對(duì)于STM32F10x系列MCU來講,固件庫都是通用的,并且包括了所有標(biāo)準(zhǔn)外設(shè)的基本功能函數(shù)。所以,編程者可以直接調(diào)用固件庫函數(shù)來進(jìn)行外設(shè)的配置和使用。另外,意法半導(dǎo)體公司在《STM32固件庫使用手冊(cè)》中也給出了標(biāo)準(zhǔn)外設(shè)的配置步驟[2]。

(1)在main.c中,聲明一個(gè)結(jié)構(gòu)體PPP_InitTypeDef。

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

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

1)按照如下程序設(shè)置整個(gè)結(jié)構(gòu)體PPP_InitStructure.member1 = val1; PPP_InitStructure.member2 = val2; 如果有多個(gè)成員則繼續(xù)賦值。

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

(3)調(diào)用函數(shù)PPP_Init(..)來初始化外設(shè)PPP。

(4)在這一步,外設(shè)PPP已被初始化。可以調(diào)用函數(shù)PPP_Cmd(..)來使能外設(shè)。

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

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

按照上述步驟,將實(shí)現(xiàn)PD2管腳翻轉(zhuǎn)的程序改寫如下:

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語言編程基礎(chǔ),從上述程序不難看出其實(shí)現(xiàn)功能。正是因?yàn)橛泄碳斓拇嬖?,編程者只需要調(diào)用庫函數(shù)和標(biāo)準(zhǔn)的宏定義便可實(shí)現(xiàn)相應(yīng)的功能,并不需要了解實(shí)際寄存器的配置字。盡管在庫函數(shù)中,仍然是操作寄存器的方式,但計(jì)算配置字的工作由庫函數(shù)代勞,大大減輕了程序員的工作量和出錯(cuò)幾率。

4 結(jié)語

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

本文推薦初學(xué)者使用調(diào)用STM32固件庫的編程方法,這樣既可以較快地掌握外設(shè)的使用,又可以加快學(xué)習(xí)和開發(fā)速度。因?yàn)閷?duì)于初學(xué)者來說,效率并沒有那么重要,重要的還是能夠盡快入門。

參考文獻(xiàn)

[1]劉同法.ARM Cortex-M3內(nèi)核微控制器快速入門與應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2009.

[2]意法半導(dǎo)體公司.STM32固件庫使用手冊(cè).endprint

猜你喜歡
程序設(shè)計(jì)
基于SolidWorks和VBA的電機(jī)階梯軸建模程序設(shè)計(jì)
高職Java程序設(shè)計(jì)課程體系建設(shè)思考
基于Visual Studio Code的C語言程序設(shè)計(jì)實(shí)踐教學(xué)探索
從細(xì)節(jié)入手,談PLC程序設(shè)計(jì)技巧
電子制作(2019年9期)2019-05-30 09:42:04
基于LabVIEW的車載充電機(jī)控制程序設(shè)計(jì)
電子測試(2018年13期)2018-09-26 03:29:16
淺談基于C語言的計(jì)算機(jī)軟件程序設(shè)計(jì)
電子制作(2017年24期)2017-02-02 07:14:40
高職高專院校C語言程序設(shè)計(jì)教學(xué)改革探索
OBE理念下基于Greenfoot的Java程序設(shè)計(jì)課程教學(xué)改革
模塊化程序設(shè)計(jì)在一體化檢定平臺(tái)中的應(yīng)用
PLC梯形圖程序設(shè)計(jì)技巧及應(yīng)用
富锦市| 峡江县| 仁寿县| 平果县| 万源市| 武义县| 固原市| 汤阴县| 藁城市| 汝南县| 托克逊县| 台州市| 永顺县| 元阳县| 多伦县| 鄂托克前旗| 会理县| 白沙| 商南县| 正宁县| 织金县| 无棣县| 山阴县| 香港 | 冕宁县| 灵寿县| 西安市| 上蔡县| 通河县| 游戏| 大埔县| 长阳| 会昌县| 襄樊市| 琼结县| 盐池县| 扎鲁特旗| 江永县| 宜春市| 丹凤县| 西青区|