版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第4章 LED燈控制與Keil MDK工程框架,1,STM32F103通用目的輸入輸出口,2,STM32F103庫函數(shù)用法,3,Keil MDK工程框架,4,LED燈閃爍實(shí)例,目 錄,,4.1,STM32F103通用目的輸入輸出口,,圖4-1 GPIO端口結(jié)構(gòu),,這里的x=A,B,...,G,各個(gè)GPIO端口寄存器的基地址可查圖2-4,每個(gè)寄存器的讀寫操作必須按整個(gè)字(32位)進(jìn)行,,,注:(1) ODR=1:上拉,ODR=0:
2、下拉,(2) 01/10/11依次對應(yīng)最大輸出頻率為10MHz/2MHz/50MHz,圖4-4 端口置位/清零寄存器GPIOx_RSRR,圖中的BRy和BSz寫入0無效;BRy寫入1,則清零相應(yīng)的端口管腳;BSz寫入1,則置位相應(yīng)的端口管腳。例如,使GPIOE的第5管腳輸出高電平,則使用語句“GPIOE_RSRR=(1uL<<5);”;使GPIOE端口的第11管腳輸出低電平,則使用語句“GPIOE_RSRR = (
3、1uL<<11)<<16;”。如果使用端口輸出數(shù)據(jù)寄存器GPIOE_ODR,則上述兩個(gè)操作為“讀出—修改—寫回”處理,其語句為“GPIOE_ODR &=~(1uL<<5);”和“GPIOE_ODR |= (1uL<<11)”,顯然,直接寫寄存器GPIOE_RSRR速度更快。,上述使用GPIOx_RSRR清零某個(gè)GPIO端口的特定管腳時(shí),有一個(gè)左移16位(“<<16”)
4、的操作,因?yàn)榍辶慵拇嫫魑挥贕PIOx_RSRR的高16位,為了省掉這個(gè)操作,GPIO模塊還具有一個(gè)16位的端口清零寄存器GPIOx_BRR(偏移地址:0x14,復(fù)位值為0x0),每位記為BRy(y=0,1,...,15),各位寫入0無效,寫入1清零相應(yīng)的端口管腳。例如,使GPIOE端口的第11管腳輸出低電平,則可使用語句“GPIOE_BRR = (1uL<<11);”。配置鎖定寄存器GPIOx_LCKR(偏移地址:0x1
5、8,復(fù)位值為0x0),用于鎖定配置寄存器GPIOx_CRL和GPIOx_CRH的值,如圖4-5所示。,圖4-5 配置鎖定寄存器GPIOx_LCKR,在圖4-5中,LCK[15:0]對應(yīng)著GPIO端口的16個(gè)管腳,例如,LCKy=1,則GPIO端口的第y腳的配置被鎖定,如果LCKy=0,則其配置是可以更新的。一旦某個(gè)GPIO管腳的配置被鎖定,只有再次“復(fù)位GPIO口”,才能解鎖。鎖定某個(gè)管腳的配置的方法為,使該管腳對應(yīng)的LCKy為1,然
6、后,向LCKK順序執(zhí)行:寫入1、寫入0、寫入1、讀出0、讀出1(其間LCK[15:0]的值不能改變)。例如,要鎖定GPIOE端口的第5腳和第11腳的配置,則使用以下語句:,GPIOE_LCKR =(1uL<<11) | (1uL<<5); GPIOE_LCKR = (1uL<<16) | (1uL<<11) | (1uL<<5); GPIOE_LCKR = (1
7、uL<<11) | (1uL<<5); GPIOE_LCKR = (1uL<<16) | (1uL<<11) | (1uL<<5); v1 = GPIOE_LCKR; v2 = GPIOE_LCKR; //(這里v1和v2為無符號32位整型)。 上面提到的“復(fù)位GPIO口”是由復(fù)位與時(shí)鐘控制模塊(RCC)管理的,此外,GPIO模塊(或其他外設(shè)模塊)在
8、使用前,必須通過RCC給相應(yīng)的模塊提供時(shí)鐘源,相關(guān)的寄存器有APB2外設(shè)復(fù)位寄存器(RCC_APB2RSTR,偏移地址:0x0C)和APB2外設(shè)時(shí)鐘有效寄存器(RCC_APB2ENR,偏移地址:0x18),由圖2-4可知,RCC模塊的基地址為0x4002 1000。,圖4-6 APB2外設(shè)復(fù)位寄存器RCC_APB2RSTR,圖4-7 APB2外設(shè)時(shí)鐘有效寄存器RCC_APB2ENR,APB2外設(shè)復(fù)位寄存器RCC_APB2RSTR(復(fù)
9、位值為0x0)和APB2外設(shè)時(shí)鐘有效寄存器RCC_APB2ENR(復(fù)位值為0x0)如圖4-6和圖4-7所示。,對于圖4-6中的RCC_APB2RSTR寄存器,各位寫入0無效,寫入1則復(fù)位相應(yīng)的片上外設(shè);對于圖4-7的RCC_APB2ENR寄存器,各位寫入0關(guān)閉相應(yīng)外設(shè)的時(shí)鐘,寫入1開放相應(yīng)外設(shè)的時(shí)鐘。例如,要使用GPIOE口,則需要執(zhí)行語句:RCC_APB2ENR |= RCC_APB2ENR | (1uL<<6);
10、啟動GPIOE口的時(shí)鐘源。,AFIO寄存器的基地址為0x4001 0000,STM32F103ZET6共包括7個(gè)AFIO寄存器(復(fù)位值均為0x0):,事件控制寄存器AFIO_EVCR(偏移地址:0x0),替換功能重映射寄存器AFIO_MAPR(偏移地址:0x04),外部中斷配置寄存器AFIO_EXTICR1(偏移地址:0x08),外部中斷配置寄存器AFIO_EXTICR2(偏移地址:0x0C),外部中斷配置寄存器AFIO_EXTICR3
11、(偏移地址:0x10),外部中斷配置寄存器AFIO_EXTICR4(偏移地址:0x14),替換功能重映射寄存器AFIO_MAPR2(偏移地址:0x1C),表4-1 事件控制寄存器AFIO_EVCR,事件控制寄存器AFIO_EVCR如表4-1所示。,表4-2 替換功能重映射寄存器AFIO_MAPR,表4-3 外部中斷配置寄存器AFIO_EXTICR1~4,替換功能重映射寄存器AFIO_MAPR2只有第10位有效,其余位保留。第10位
12、符號為FSMC_NADV,可讀可寫屬性,為0表示FSMC_NADV與外部端口PB7相連接;為1表示FSMC_NADV無連接。,,4.2,STM32F103庫函數(shù)用法,意法半導(dǎo)體公司針對STM32F10x微控制器的全部外設(shè)提供了可以抽象訪問的庫函數(shù),所謂的“抽象訪問”是指當(dāng)訪問片內(nèi)外設(shè)時(shí),不需要關(guān)心片內(nèi)外設(shè)寄存器的地址和各位的函義,而是通過庫函數(shù)定義的見名知義的常量和函數(shù)調(diào)用直接訪問,,由表4-4可知,庫函數(shù)全部的文件都是開源的C語言代碼
13、,常量定義和函數(shù)聲明位于.h文件中,函數(shù)體位于.c文件中,例如,在stm32f10x_gpio.h中有以下宏定義語句和函數(shù)聲明:,而在相應(yīng)的stm32f10x_gpio.c文件中有以下函數(shù): 程序段4-4 stm32f10x_gpio.c文件中的GPIO_SetBits函數(shù)1 void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)2 {3
14、 /* Check the parameters */4 assert_param(IS_GPIO_ALL_PERIPH(GPIOx));5 assert_param(IS_GPIO_PIN(GPIO_Pin));6 7 GPIOx->BSRR = GPIO_Pin;8 },程序段4-3中,GPIO_Pin_5為常數(shù)(1uLBSRR = (1uL<<
15、5);”,用庫函數(shù)方式為“GPIO_SetBits(GPIOB, GPIO_Pin_5);”,顯然后者封裝了寄存器的各種信息,可讀性更好,更接近自然語言。如果使用庫函數(shù)進(jìn)行工程設(shè)計(jì),需要對表4-4中的文件,特別.h文件中每個(gè)常量和函數(shù)的含義做細(xì)致的研究,這需要花一定的時(shí)間。,,4.3,Keil MDK工程框架,本書使用了Keil MDK v5.20集成開發(fā)環(huán)境(官網(wǎng)www.kei.com),本書中的全部工程可以使用于Keil MDK v
16、5.20及其后續(xù)版本。 在D盤下新建文件夾,命名為“STM32F103ZET6工程” ,本書所有工程均保存在該文件夾內(nèi)。然后,在文件夾“STM32F103ZET6工程”內(nèi)創(chuàng)建一個(gè)子文件夾“工程01”,用于保存本節(jié)創(chuàng)建的工程。在該子文件夾下新建三個(gè)子文件夾“PRJ”、“USER”和“BSP”,其中,“USER”文件夾用于保存應(yīng)用程序文件及其頭文件;“BSP”文件夾用于保存板級支持包文件,即STM32F103芯片外設(shè)驅(qū)動文件及其
17、頭文件;“PRJ”文件夾用于保存工程文件。,圖4-8 工程01文件夾結(jié)構(gòu),安裝好Keil MDK后,會在桌面上顯示快捷圖標(biāo)“Keil MDK uVision5”,鼠標(biāo)左鍵雙擊該圖標(biāo)進(jìn)入圖4-9所示窗口。,圖4-9 Keil MDK工作主界面,在圖4-9中,單擊“芯片支持包安裝快捷鈕”進(jìn)入圖4-10所示界面。,圖4-10 芯片支持包在線安裝窗口,圖4-10中的“Device”一欄中顯示了Keil MDK開發(fā)環(huán)境所支持的芯片系列。在
18、圖4-10中,至少要安裝圖中所示的STM32F103系列的芯片支持包,前文提到的stm23f10x.h文件就位于該支持包內(nèi)。 回到圖4-9,在其中單擊菜單“Project | New μVision Project...”(“|”后的表示子菜單項(xiàng)),彈出圖4-11所示窗口。,圖4-11 創(chuàng)建新工程對話框,在圖4-10中,選擇目錄“D:\STM32F103ZET6工程\工程01\PRJ”,然后,在“文件名”一項(xiàng)中,輸入工程文件名
19、為“MyPrj”,點(diǎn)擊“保存(S)”進(jìn)入圖4-12所示窗口。,圖4-12 選擇目標(biāo)芯片型號對話框,在圖4-12中,選擇芯片STM32F103ZE,在“Description”中將顯示該芯片的資源情況。在圖4-12中單擊“OK”按鈕進(jìn)入圖4-13所示窗口。 在圖4-13中,選中“Core”、“DSP”、“GPIO”和“Startup”,依次表示向工程中添加Cortex-M3內(nèi)核支持庫、數(shù)字信號處理算法庫、通用目的輸入輸出口驅(qū)動庫
20、和芯片啟動代碼文件。當(dāng)使用數(shù)字信號處理算法庫中的函數(shù)時(shí),需要在用戶程序文件中包括頭文件“arm_math.h”,DSP算法庫中包含了大量經(jīng)過優(yōu)化的數(shù)學(xué)函數(shù),可實(shí)現(xiàn)代數(shù)運(yùn)算、復(fù)數(shù)運(yùn)算、矩陣運(yùn)算、數(shù)字濾波器和統(tǒng)計(jì)處理等,例如,浮點(diǎn)數(shù)的正弦、余弦和開方運(yùn)算分別對應(yīng)著以下三個(gè)函數(shù): float32_t y = arm_sin_f32(float32_t x); float32_t y = arm_cos_f32(float
21、32_t x); arm_sqrt_f32(float32_t x,float32_t *y);,這里,float32表示32位的浮點(diǎn)數(shù)據(jù)類型,上述三個(gè)函數(shù)對應(yīng)的數(shù)學(xué)函數(shù)式依次為y=sin(x)、y=cos(x)和*y= 𝑥 。 在圖4-13中,單擊“OK”按鈕進(jìn)入圖4-14所示窗口。,圖4-13 添加運(yùn)行時(shí)(Run-Time)環(huán)境,圖4-14 工程01工作界面-I,在圖4-14中,工程管理器
22、顯示新建的工程為MyPrj,保存為“D:\STM32F103ZET6工程\工程01\PRJ\MyPrj.uvprojx”。可修改工程管理器中的目標(biāo)“Target 1”和分組“Source Group 1”的名稱,單擊“工程管理快捷鈕”進(jìn)入圖4-15所示窗口。,在圖4-15中,將原來的目標(biāo)“Target 1”修改為“STM32F103ZET6”,即所使用的芯片型號;將原來的分組“Source Group 1”刪除,新建兩個(gè)分組“USER”
23、和“BSP”(注意,這里的分組名與工程在硬件中的保存目錄名沒有直接的關(guān)系)。點(diǎn)擊“OK”按鈕進(jìn)入圖4-16所示窗口。,圖4-15 編輯工程管理器中的各項(xiàng),圖4-16 工程01工作界面-II,在圖4-16中,工程管理器中有兩個(gè)分組,即“USER”和“BSP”,這兩個(gè)分組分別用于管理用戶程序文件和板級支持包文件。圖4-16中顯示了常用的快捷按鈕,如“新建文檔按鈕”用于打開一個(gè)文檔輸入窗口進(jìn)行程序編輯;“在線調(diào)試快捷鈕”用于在線仿真調(diào)試;
24、“編譯、編譯鏈接、全部編譯鏈接”三個(gè)快捷鈕分別用于編譯當(dāng)前活躍文件、編譯鏈接修改過的源文件和全部編譯鏈接整個(gè)工程文件;“下載工程可執(zhí)行代碼到目標(biāo)芯片”用于將編譯鏈接成功后的.hex目標(biāo)代碼寫入到STM32F103ZET6芯片的Flash存儲器中。在圖4-16中,鼠標(biāo)右鍵單擊“STM32F103ZET6”,在其彈出的菜單中選擇“Options for Target 'STM32F103ZET6'... Alt+F7”,進(jìn)入
25、到圖4-17所示窗口。,圖4-17 目標(biāo)選項(xiàng)卡,在圖4-17中,選中“IROM1”,長度為0x80000(即512kB FLASH);選中“IRAM1”,長度為“0x10000”(即64kB SRAM)。在圖4-17中,選擇“Output”頁面,進(jìn)入圖4-18所示窗口。,在圖4-18中,設(shè)定工程生成的目標(biāo)文件名為MyPrj,所在的路徑為“.\Objects\MyPrj”,即工程所在路徑下的“D:\STM32F103ZET6工程\工程0
26、1\PRJ\Objects\MyPrj”,然后,選中“Create HEX File”復(fù)選框,表示編譯鏈接后產(chǎn)生HEX格式的目標(biāo)文件。在圖4-18中選擇“C/C++”選項(xiàng)卡,進(jìn)入圖4-19所示窗口。,圖4-18 “Output”輸出目標(biāo)文件路徑和格式選項(xiàng)卡,圖4-19 “C/C++”選項(xiàng)卡,圖4-20 “Debug”選項(xiàng)卡,在圖4-19中,“Include Paths”中指定工程編譯時(shí)搜索文件的路徑,這里的“.”表示工程所在的路徑
27、,即“D:\STM32F103ZET6工程\工程01\PRJ\”,“..”表示工程所在路徑的上一個(gè)路徑,即“D:\STM32F103ZET6工程\工程01\”。然后,在圖4-19中選擇“Debug”選項(xiàng)卡,進(jìn)入圖4-20所示窗口。,在圖4-20中,由于這里使用了ULINK2仿真器,所以選擇了“ULINK2/ME Cotex Debugger”,選中“Run to main()”表示在線真調(diào)試時(shí),程序計(jì)數(shù)器指針PC自動跳轉(zhuǎn)到main函數(shù)執(zhí)
28、行,否則,PC將跳轉(zhuǎn)到匯編語言編寫的啟動文件startup_stm32f10x_hd.s中的Reset_Handler標(biāo)號去執(zhí)行。在圖4-20中單擊“Settings”按鈕進(jìn)入圖4-21所示窗口。,圖4-21 ULINK2仿真連接對話框,圖4-22 FLASH編程算法選擇對話框,如果STM32F103戰(zhàn)艦V3開發(fā)板已上電,且ULINK2連接正常,則圖4-21中將顯示Cortex-M3的IDCODE為“0x1BA01477”,表示連接
29、正常。STM32F103ZET6支持JTAG和SW兩種調(diào)試方式,圖4-21中的“Port”可選SW或JTAG。在圖4-21中選擇“Flash Download”選項(xiàng)卡,進(jìn)入圖4-22所示窗口。 在圖4-22中,添加FLASH編程算法“STM32F10x High-density Flash”,然后,單擊“OK”按鈕回到圖4-20,在圖4-20中單擊“OK”按鈕回到圖4-16,這樣基于Keil MDK軟件開發(fā)環(huán)境的工程框架就配置好
30、了。,4.4 LED燈閃爍實(shí)例,在STM32F103戰(zhàn)艦V3開發(fā)板集成了2個(gè)LED燈,如圖3-12所示。由圖3-12、圖3-3和圖3-6可知,LED0燈由PB5控制,LED1燈由PE5控制。下面介紹LED燈閃爍控制的工程設(shè)計(jì)實(shí)例。,4.4.1 寄存器類型工程實(shí)例,在圖4-16基礎(chǔ)上,新建文件led.c和led.h保存在子文件夾“BSP”下。然后,新建文件main.c、includes.h和vartypes.h,保存在子文件夾“USE
31、R”下。接著,將led.c文件添加到工程管理器的“BSP”分組下,將main.c文件添加到工程管理器的“USER”分組下,如圖4-23所示。注意,圖4-23中工程管理器中的分組名與子文件夾的名稱是相同的,但是二者沒有聯(lián)系,分組名可以使用各種符號和漢字。,圖4-23 工程01工作界面-III,下面依次介紹工程01中的各個(gè)文件,如程序段4-5至程序段4-9所示。 程序段4-5 文件vartypes.h1 //Filen
32、ame: vartypes.h2 3 #ifndef _VARTYPES_H4 #define _VARTYPES_H5 6 typedef unsigned char Int08U;7 typedef signed char Int08S;8 typedef unsigned short Int16U;9 typedef signed short
33、 Int16S;10 typedef unsigned int Int32U;11 typedef signed int Int32S;,12 13 typedef float Float32;14 15 typedef enum {LED_ON,LED_OFF} LEDState;16 17 #endif,頭文件vartypes.h是用戶自定
34、義的變量類型文件。程序段4-5中,第3、4行和第17行構(gòu)成預(yù)編譯處理,由于頭文件vartypes.h被工程中的多個(gè)源文件包括,使用預(yù)編譯處理指令可保證該頭文件僅被包括一次。第6~11行依次定義了自定義變量類型:無符號8位整型、有符號8位整型、無符號16位整型、有符號16位整型、無符號32位整型和有符號32位整型。第13行定義了32位浮點(diǎn)型自定義變量類型。第15行定義了枚舉型自定義類型,用于定義LED燈的狀態(tài),LED_ON和LED_OFF
35、分別用于表示LED燈的開和關(guān)的狀態(tài)。,程序段4-6 文件includes.h1 //Filename: includes.h2 3 #include "stm32f10x.h"4 5 #include "vartypes.h"6 #include "led.h",頭文件includes.h是工程中總的包括頭文件,包括
36、了工程中用到的其余全部頭文件,該includes.h頭文件被全部用戶源文件所包括。程序段4-6中第3行包括了系統(tǒng)頭文件stm32f10x.h,該頭文件中宏定義了STM32F103ZET6芯片的全部片內(nèi)外設(shè)的寄存器。第5行包括了頭文件vartypes.h,該頭文件為用戶自定義的變量卷類型頭文件。第6行包括了闊大文件led.h,該頭文件聲明了源文件led.c中定義的函數(shù)的原型。,程序段4-7 文件main.c1 //File
37、name: main.c2 3 #include "includes.h"4 5 void Delay(Int32U);6 7 int main(void)8 {9 LEDInit();10 for(;;)11 {12 LED(0,LED_ON);13 LED(1,LED_OFF);14
38、 Delay(500);,15 LED(0,LED_OFF);16 LED(1,LED_ON);17 Delay(500);18 }19 }20 21 void Delay(Int32U u)22 {23 Int32U i,j;24 for(i=0;i<u;i++)25 for(j=0;j<12000;j++);
39、26 },程序段4-8 文件led.h1 //Filename: led.h2 3 #include "vartypes.h"4 5 #ifndef _LED_H6 #define _LED_H7 8 void LEDInit(void);9 void LED(Int08U,LEDState);10 11
40、 #endif,本書工程中,每個(gè)源文件都有一個(gè)對應(yīng)的頭文件,用于聲明源文本中定義的函數(shù)。第3行包括了頭文件vartypes.h,因?yàn)榈?行的函數(shù)聲明用到了自定義變量類型Int08U和LEDState;第8行聲明了LEDInit函數(shù);第9行聲明了LED函數(shù)。,程序段4-9 文件led.c1 //Filename: led.c2 3 #include "includes.h"4
41、 5 void LEDInit(void)6 {,7 RCC->APB2ENR |= (1uLCRL |= (1uLCRL &=~((1uLCRL |= (1uLCRL &=~((1uLBRR = (1uL<<5);,22 else23 GPIOB->BSRR = (1uLBRR = (1uLBSRR = (1uL<<
42、5);30 break;31 default:32 break;33 }34 },文件led.c是LED燈的驅(qū)動文件,包括了兩個(gè)函數(shù),即LEDInit和LED。第8~9行配置PB5為推挽輸出,最大速率為10MHz(參見圖4-2);第11~12行配置PE5為推挽輸出,最大速率為10MHz(參見圖4-2)。第15~34行為LED函數(shù),該函數(shù)有兩個(gè)參數(shù)w和s,w取0表示LED0
43、,w取1表示LED1;s取值LED_ON,表示相應(yīng)的LED燈點(diǎn)亮,s取值LED_OFF,表示相應(yīng)的LED燈熄滅。在LED函數(shù)中,第17行判斷w的值,如果為0,則第20~24行被執(zhí)行,如果第20行為真,則第21行點(diǎn)亮LED0,否則熄滅LED0(第23行);如果w的值為1,則第26~30行被執(zhí)行,如果第26行為真,則點(diǎn)亮LED1(第27行),否則熄滅LED1(第29行)。 工程01的執(zhí)行過程如圖4-24所示、,圖4-24 工程0
44、1的執(zhí)行流程,由圖4-24可知,工程01上電復(fù)位后,首先執(zhí)行位于文件system_stm32f10x.c中的SystemInit函數(shù),用于將STM32F103ZET6的時(shí)鐘由8MHz調(diào)整到72MHz(除此之外,在啟動文件startup_stm32f10x_hd.s中還為C語言函數(shù)分配了堆棧空間);然后,轉(zhuǎn)到main函數(shù)執(zhí)行;進(jìn)入到main函數(shù)后,首先調(diào)用LEDInit函數(shù)初始化LED燈的控制;接著進(jìn)入無限循環(huán)體,依次循環(huán)執(zhí)行“LED0亮
45、、LED1滅——延時(shí)約1秒——LED0滅、LED1亮——延時(shí)約1秒”。其中,LED0亮和LED1滅是main函數(shù)調(diào)用led.c文件中的LED函數(shù)實(shí)現(xiàn)的,延時(shí)函數(shù)Delay位于主文件main.c中,由for循環(huán)實(shí)現(xiàn)。,本小節(jié)借助調(diào)用庫函數(shù)的方式實(shí)現(xiàn)工程01的功能。 在“工程01”基礎(chǔ)上,新建“工程02”,保存在目錄“D:\STM32F103ZET6工程”下,此時(shí)的“工程02”與“工程01”完全相同。將STM32F10x的庫函數(shù)文件
46、復(fù)制到目錄“D:\STM32F103ZET6工程\工程02”下,此時(shí),“工程02”的目錄結(jié)構(gòu)如圖4-25所示,這里STM32F103的庫函數(shù)可從意法半導(dǎo)體官網(wǎng)www.st.com上下載,或從www.openedv.com上下載。然后,復(fù)制文件stm32f10x_conf.h到目錄“D:\STM32F103ZET6工程\工程02\ STM32F10x_FWLib”下,該文件包括了目錄“D:\STM32F103ZET6工程\工程02\ ST
47、M32F10x_FWLib\inc”中的全部頭文件。,圖4-25 工程02目錄和文件結(jié)構(gòu),圖4-25中的src子目錄包括了表4-4中“庫函數(shù)文件”一欄中的全部文件,inc子目錄包括了表4-4中“庫函數(shù)頭文件”一欄中的全部文件。,在工程02中,修改圖4-19所示的“C/C++”選項(xiàng)卡,如圖4-26所示,即添加兩個(gè)全局的宏定義常量STM32F10X_HD和USE_STDPERIPH_DRIVER,并且,編譯的搜索路徑改為“..\BSP;.
48、.\USER;.\RTE;..\STM32F10x_FWLib;..\STM32F10x_FWLib\inc”。 這里添加的宏定義常量USE_STDPERIPH_DRIVER,是因?yàn)樵谖募tm32f10x.h中有以下語句:,程序段4-10 文件stm32f10x.h中的語句1 #ifdef USE_STDPERIPH_DRIVER#include "stm32f10x_conf.h“3 #e
49、ndif,由于庫函數(shù)文件是針對STM23F10x全系列的微控制器,宏定義常量STM32F10X_HD表示僅使得那些STM32F103ZET6相關(guān)的常量和函數(shù)有效。,圖4-26 “C/C++”選項(xiàng)卡,在工程管理器中,新建分組“LIB”,將目錄“D:\STM32F103ZET6工程\工程02\ STM32F10x_FWLib\src”下的文件“stm32f10x_gpio.c”和“stm32f10x_rcc.c”添加到分組“LI
50、B”下(當(dāng)然,可以將src子目錄下的全部文件都添加到分組LIB下,這里僅添加了本工程中用到的源文件),如圖4-27所示。,圖4-27 工程02工作窗口,相對于工程01的文件,工程02只需要修改led.c文件,如程序段4-11所示。 程序段4-11 文件led.c1 //Filename: led.c2 3 #include "includes.h"4 5
51、 void LEDInit(void)6 {7 GPIO_InitTypeDef g;8 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);9 10 g.GPIO_Pin = GPIO_Pin_5;,11 g.GPIO_Mode = GPIO_Mode_Out_PP;12
52、 g.GPIO_Speed = GPIO_Speed_50MHz;13 GPIO_Init(GPIOB, &g);14 15 g.GPIO_Pin = GPIO_Pin_5;16 g.GPIO_Mode = GPIO_Mode_Out_PP;17 g.GPIO_Speed = GPIO_Speed_50MHz;18 GPIO_Init(GPIOE, &g)
53、;19 }20 21 void LED(Int08U w, LEDState s) //w-which(1or2), s-state(LED_ONorLED_OFF),22 {23 switch(w)24 {25 case 0:26 if(s==LED_ON)27 GPIO_ResetBits(GPIOB,GPIO_Pin_5);28
54、else29 GPIO_SetBits(GPIOB, GPIO_Pin_5);30 break;31 case 1:32 if(s==LED_ON)33 GPIO_ResetBits(GPIOE,GPIO_Pin_5);34 else35 GPIO_SetBits(GPIOE, GPIO_Pin_5);,36
55、 break;37 default:38 break;39 }40 },對比程序段4-9可知,這里的程序段4-11中,第8行調(diào)用RCC_APB2PeriphClockCmd庫函數(shù)打開PB口和PE口的時(shí)鐘源。第7行定義變量g,第10~12行為結(jié)構(gòu)體變量g賦值,這里的類型GPIO_InitTypeDef定義在庫函數(shù)頭文件stm32f10x_gpio.h中,如下所示:,程序段4-12
56、 頭文件stm32f10x_gpio.h中的類型GPIO_InitTypeDef定義1 typedef enum2 { 3 GPIO_Speed_10MHz = 1,4 GPIO_Speed_2MHz, 5 GPIO_Speed_50MHz6 }GPIOSpeed_TypeDef;7,8 typedef enum9
57、 { GPIO_Mode_AIN = 0x0, GPIO_Mode_IN_FLOATING = 0x04,11 GPIO_Mode_IPD = 0x28,12 GPIO_Mode_IPU = 0x48,13 GPIO_Mode_Out_OD = 0x14,14
58、 GPIO_Mode_Out_PP = 0x10,15 GPIO_Mode_AF_OD = 0x1C,16 GPIO_Mode_AF_PP = 0x1817 }GPIOMode_TypeDef;,18 19 typedef struct20 {21 uint16_t GPIO_Pin; 22
59、 GPIOSpeed_TypeDef GPIO_Speed; 23 GPIOMode_TypeDef GPIO_Mode; 24 }GPIO_InitTypeDef;2526 #define GPIO_Pin_5 ((uint16_t)0x0020),結(jié)合程序段4-12可知,程序段4-11中,第10~12行為配置GPIO口的屬性,第13行調(diào)用GP
60、IO_Init庫函數(shù)將GPIOB口按設(shè)定的屬性初始化;同理,第15~18行,初始化GPIOE口。GPIO_Init函數(shù)的定義位于庫函數(shù)文件stm32f10x_gpio.c中。 對比程序段4-9的函數(shù)LED,這里程序段4-11的LED函數(shù)中調(diào)用庫函數(shù)GPIO_ResetBits清零端口,調(diào)用庫函數(shù)GPIO_SetBits置位端口,這兩個(gè)庫函數(shù)的定義位于庫函數(shù)文件stm32f10x_gpio.c中。,4.5 本章小結(jié),本章介紹了S
61、TM32F103ZET6微控制器的GPIO口結(jié)構(gòu)及其寄存器,同時(shí),也討論了替換功能AFIO的寄存器以及復(fù)位與時(shí)鐘控制模塊中與GPIO口相關(guān)的寄存器。然后,闡述了庫函數(shù)的用法,并討論了寄存器類型的工程與庫函數(shù)類型的工程的區(qū)別。最后,介紹了Keil MDK工程框架,以LED燈閃爍為例,詳細(xì)介紹了寄存器類型工程和庫函數(shù)類型工程的程序設(shè)計(jì)方法。對于庫函數(shù)類型工程,需要初始者有一個(gè)長時(shí)間的適應(yīng)過程,需要花一定的時(shí)間學(xué)習(xí)表4-4中列出的庫函數(shù)文件和
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- led燈控制器
- 駁《無極燈與led燈》
- 制藥工程學(xué)第04章
- led燈與普通燈的比較
- 第04章 廠房與設(shè)施
- led燈
- 無極燈缺點(diǎn)與led燈優(yōu)點(diǎn)對比
- 高壓鈉燈與led燈
- led燈有幾種?led燈如何選擇?
- 第04章 雇主
- 第04章-順序
- led燈帶價(jià)格?led燈帶功率如何?
- led燈如何節(jié)能?led燈如何選購好?
- led燈珠報(bào)價(jià)?led燈珠的分類?
- 美學(xué)原理馬工程第04章技術(shù)美
- led燈知識
- led燈產(chǎn)品
- led環(huán)形燈
- led燈結(jié)構(gòu)
- led顯示燈
評論
0/150
提交評論