999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

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

2015-05-04 08:54:40張明華
數字技術與應用 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

主站蜘蛛池模板: 99精品视频播放| 亚洲国产成人超福利久久精品| 国产美女自慰在线观看| 中文字幕资源站| aⅴ免费在线观看| 99国产在线视频| 热热久久狠狠偷偷色男同| 亚洲国产日韩视频观看| 一级毛片基地| 国产成人夜色91| 国产麻豆永久视频| 在线亚洲天堂| 欧美日韩精品一区二区视频| 在线va视频| 女同久久精品国产99国| 欧美一区福利| 成人a免费α片在线视频网站| 综合社区亚洲熟妇p| 国产一级毛片yw| 黄色网页在线观看| 亚洲精品无码AV电影在线播放| 免费中文字幕一级毛片| 久久99热66这里只有精品一| 色久综合在线| 欧美一级高清视频在线播放| 自拍中文字幕| 欧美日韩激情在线| 国产区精品高清在线观看| 免费无码AV片在线观看中文| 日韩精品无码免费一区二区三区| 她的性爱视频| 国产免费久久精品44| 丰满人妻中出白浆| 亚洲精品国产自在现线最新| 免费国产高清视频| 老司机aⅴ在线精品导航| 99伊人精品| 久久不卡国产精品无码| 重口调教一区二区视频| 999精品色在线观看| 97国产在线视频| 国模视频一区二区| 亚州AV秘 一区二区三区| 麻豆精品久久久久久久99蜜桃| 日韩成人在线网站| 国产精品成人一区二区不卡| 国产麻豆aⅴ精品无码| 91亚洲免费视频| 在线观看亚洲天堂| 亚洲国产日韩视频观看| 国产资源免费观看| 久热中文字幕在线| 亚洲aaa视频| 久久精品亚洲专区| 欧美五月婷婷| 九色视频一区| 亚洲欧美天堂网| 全部无卡免费的毛片在线看| 女同国产精品一区二区| 欧美福利在线播放| 嫩草国产在线| 国产微拍一区| 国产经典三级在线| 久久99久久无码毛片一区二区| 国产日本视频91| 无码内射中文字幕岛国片 | 激情亚洲天堂| 日韩av高清无码一区二区三区| 久久www视频| 国产在线小视频| 日日噜噜夜夜狠狠视频| 国产成人1024精品| 国内精自视频品线一二区| www精品久久| 亚洲精品无码日韩国产不卡| 国产日韩欧美成人| 又污又黄又无遮挡网站| 久久精品免费国产大片| 国产无码精品在线播放| 美女毛片在线| 久久国产精品嫖妓| 国产乱子伦精品视频|