LED燈控制與KeilMDK工程框架.ppt_第1頁
LED燈控制與KeilMDK工程框架.ppt_第2頁
LED燈控制與KeilMDK工程框架.ppt_第3頁
LED燈控制與KeilMDK工程框架.ppt_第4頁
LED燈控制與KeilMDK工程框架.ppt_第5頁
已閱讀5頁,還剩79頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第4章 LED燈控制與Keil MDK工程框架,1,STM32F103通用目的輸入輸出口,2,STM32F103庫函數(shù)用法,3,Keil MDK工程框架,4,LED燈閃爍實例,目 錄,4.1,STM32F103通用目的輸入輸出口,圖4-1 GPIO端口結(jié)構(gòu),這里的xA,B,.,G,各個GPIO端口寄存器的基地址可查圖2-4,每個寄存器的讀寫操作必須按整個字(32位)進行,注:(1) ODR=1:上拉,ODR=0:下拉,(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(1uL5);”; 使GPIOE端口的第11管腳輸出低電平,則使用語句“GPIOE_RSRR = (1uL11)16;”。 如果使用端口輸出數(shù)據(jù)寄存器GPIOE_ODR,則上述兩個操作為“讀出修改寫回”處理,其語句為“GPIOE_ODR ”和“GPIOE_ODR |= (1uL11)”,顯然,直接寫寄存器GPIOE_RSRR速度更快。,上述使用GPIOx_RSRR清零某個GPIO端口的特定管腳時,有一個左移16位(“16”)的操作,因為清零寄存器位于GPIOx_RSRR的高16位,為了省掉這個操作,GPIO模塊還具有一個16位的端口清零寄存器GPIOx_BRR(偏移地址:0x14,復(fù)位值為0x0),每位記為BRy(y=0,1,.,15),各位寫入0無效,寫入1清零相應(yīng)的端口管腳。 例如,使GPIOE端口的第11管腳輸出低電平,則可使用語句“GPIOE_BRR = (1uL11);”。 配置鎖定寄存器GPIOx_LCKR(偏移地址:0x18,復(fù)位值為0x0),用于鎖定配置寄存器GPIOx_CRL和GPIOx_CRH的值,如圖4-5所示。,圖4-5 配置鎖定寄存器GPIOx_LCKR,在圖4-5中,LCK15:0對應(yīng)著GPIO端口的16個管腳,例如,LCKy1,則GPIO端口的第y腳的配置被鎖定,如果LCKy=0,則其配置是可以更新的。一旦某個GPIO管腳的配置被鎖定,只有再次“復(fù)位GPIO口”,才能解鎖。鎖定某個管腳的配置的方法為,使該管腳對應(yīng)的LCKy為1,然后,向LCKK順序執(zhí)行:寫入1、寫入0、寫入1、讀出0、讀出1(其間LCK15:0的值不能改變)。例如,要鎖定GPIOE端口的第5腳和第11腳的配置,則使用以下語句:,GPIOE_LCKR =(1uL11) | (1uL5); GPIOE_LCKR = (1uL16) | (1uL11) | (1uL5); GPIOE_LCKR = (1uL11) | (1uL5); GPIOE_LCKR = (1uL16) | (1uL11) | (1uL5); v1 = GPIOE_LCKR; v2 = GPIOE_LCKR; /(這里v1和v2為無符號32位整型)。 上面提到的“復(fù)位GPIO口”是由復(fù)位與時鐘控制模塊(RCC)管理的,此外,GPIO模塊(或其他外設(shè)模塊)在使用前,必須通過RCC給相應(yīng)的模塊提供時鐘源,相關(guān)的寄存器有APB2外設(shè)復(fù)位寄存器(RCC_APB2RSTR,偏移地址:0x0C)和APB2外設(shè)時鐘有效寄存器(RCC_APB2ENR,偏移地址:0x18),由圖2-4可知,RCC模塊的基地址為0x4002 1000。,圖4-6 APB2外設(shè)復(fù)位寄存器RCC_APB2RSTR,圖4-7 APB2外設(shè)時鐘有效寄存器RCC_APB2ENR,APB2外設(shè)復(fù)位寄存器RCC_APB2RSTR(復(fù)位值為0x0)和APB2外設(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è)的時鐘,寫入1開放相應(yīng)外設(shè)的時鐘。 例如,要使用GPIOE口,則需要執(zhí)行語句: RCC_APB2ENR |= RCC_APB2ENR | (1uL6); 啟動GPIOE口的時鐘源。,AFIO寄存器的基地址為0x4001 0000,STM32F103ZET6共包括7個AFIO寄存器(復(fù)位值均為0x0):,事件控制寄存器AFIO_EVCR(偏移地址:0x0),替換功能重映射寄存器AFIO_MAPR(偏移地址:0x04),外部中斷配置寄存器AFIO_EXTICR1(偏移地址:0x08),外部中斷配置寄存器AFIO_EXTICR2(偏移地址:0x0C),外部中斷配置寄存器AFIO_EXTICR3(偏移地址:0x10),外部中斷配置寄存器AFIO_EXTICR4(偏移地址:0x14),替換功能重映射寄存器AFIO_MAPR2(偏移地址:0x1C),表4-1 事件控制寄存器AFIO_EVCR,事件控制寄存器AFIO_EVCR如表4-1所示。,表4-2 替換功能重映射寄存器AFIO_MAPR,表4-3 外部中斷配置寄存器AFIO_EXTICR14,替換功能重映射寄存器AFIO_MAPR2只有第10位有效,其余位保留。第10位符號為FSMC_NADV,可讀可寫屬性,為0表示FSMC_NADV與外部端口PB7相連接;為1表示FSMC_NADV無連接。,4.2,STM32F103庫函數(shù)用法,意法半導(dǎo)體公司針對STM32F10x微控制器的全部外設(shè)提供了可以抽象訪問的庫函數(shù),所謂的“抽象訪問”是指當訪問片內(nèi)外設(shè)時,不需要關(guān)心片內(nèi)外設(shè)寄存器的地址和各位的函義,而是通過庫函數(shù)定義的見名知義的常量和函數(shù)調(diào)用直接訪問,,由表4-4可知,庫函數(shù)全部的文件都是開源的C語言代碼,常量定義和函數(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 /* 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 = (1uL5);”,用庫函數(shù)方式為“GPIO_SetBits(GPIOB, GPIO_Pin_5);”,顯然后者封裝了寄存器的各種信息,可讀性更好,更接近自然語言。如果使用庫函數(shù)進行工程設(shè)計,需要對表4-4中的文件,特別.h文件中每個常量和函數(shù)的含義做細致的研究,這需要花一定的時間。,4.3,Keil MDK工程框架,本書使用了Keil MDK v5.20集成開發(fā)環(huán)境(官網(wǎng)),本書中的全部工程可以使用于Keil MDK v5.20及其后續(xù)版本。 在D盤下新建文件夾,命名為“STM32F103ZET6工程” ,本書所有工程均保存在該文件夾內(nèi)。然后,在文件夾“STM32F103ZET6工程”內(nèi)創(chuàng)建一個子文件夾“工程01”,用于保存本節(jié)創(chuàng)建的工程。 在該子文件夾下新建三個子文件夾“PRJ”、“USER”和“BSP”,其中,“USER”文件夾用于保存應(yīng)用程序文件及其頭文件; “BSP”文件夾用于保存板級支持包文件,即STM32F103芯片外設(shè)驅(qū)動文件及其頭文件; “PRJ”文件夾用于保存工程文件。,圖4-8 工程01文件夾結(jié)構(gòu),安裝好Keil MDK后,會在桌面上顯示快捷圖標“Keil MDK uVision5”,鼠標左鍵雙擊該圖標進入圖4-9所示窗口。,圖4-9 Keil MDK工作主界面,在圖4-9中,單擊“芯片支持包安裝快捷鈕”進入圖4-10所示界面。,圖4-10 芯片支持包在線安裝窗口,圖4-10中的“Device”一欄中顯示了Keil MDK開發(fā)環(huán)境所支持的芯片系列。在圖4-10中,至少要安裝圖中所示的STM32F103系列的芯片支持包,前文提到的stm23f10x.h文件就位于該支持包內(nèi)。 回到圖4-9,在其中單擊菜單“Project | New Vision Project.”(“|”后的表示子菜單項),彈出圖4-11所示窗口。,圖4-11 創(chuàng)建新工程對話框,在圖4-10中,選擇目錄“D:STM32F103ZET6工程工程01PRJ”,然后,在“文件名”一項中,輸入工程文件名為“MyPrj”,點擊“保存(S)”進入圖4-12所示窗口。,圖4-12 選擇目標芯片型號對話框,在圖4-12中,選擇芯片STM32F103ZE,在“Description”中將顯示該芯片的資源情況。在圖4-12中單擊“OK”按鈕進入圖4-13所示窗口。 在圖4-13中,選中“Core”、“DSP”、“GPIO”和“Startup”,依次表示向工程中添加Cortex-M3內(nèi)核支持庫、數(shù)字信號處理算法庫、通用目的輸入輸出口驅(qū)動庫和芯片啟動代碼文件。當使用數(shù)字信號處理算法庫中的函數(shù)時,需要在用戶程序文件中包括頭文件“arm_math.h”,DSP算法庫中包含了大量經(jīng)過優(yōu)化的數(shù)學(xué)函數(shù),可實現(xiàn)代數(shù)運算、復(fù)數(shù)運算、矩陣運算、數(shù)字濾波器和統(tǒng)計處理等,例如,浮點數(shù)的正弦、余弦和開方運算分別對應(yīng)著以下三個函數(shù): float32_t y = arm_sin_f32(float32_t x); float32_t y = arm_cos_f32(float32_t x); arm_sqrt_f32(float32_t x,float32_t *y);,這里,float32表示32位的浮點數(shù)據(jù)類型,上述三個函數(shù)對應(yīng)的數(shù)學(xué)函數(shù)式依次為y=sin(x)、y=cos(x)和*y= 。 在圖4-13中,單擊“OK”按鈕進入圖4-14所示窗口。,圖4-13 添加運行時(Run-Time)環(huán)境,圖4-14 工程01工作界面-I,在圖4-14中,工程管理器顯示新建的工程為MyPrj,保存為“D:STM32F103ZET6工程工程01PRJMyPrj.uvprojx”。可修改工程管理器中的目標“Target 1”和分組“Source Group 1”的名稱,單擊“工程管理快捷鈕”進入圖4-15所示窗口。,在圖4-15中,將原來的目標“Target 1”修改為“STM32F103ZET6”,即所使用的芯片型號;將原來的分組“Source Group 1”刪除,新建兩個分組“USER”和“BSP”(注意,這里的分組名與工程在硬件中的保存目錄名沒有直接的關(guān)系)。點擊“OK”按鈕進入圖4-16所示窗口。,圖4-15 編輯工程管理器中的各項,圖4-16 工程01工作界面-II,在圖4-16中,工程管理器中有兩個分組,即“USER”和“BSP”,這兩個分組分別用于管理用戶程序文件和板級支持包文件。圖4-16中顯示了常用的快捷按鈕,如“新建文檔按鈕”用于打開一個文檔輸入窗口進行程序編輯;“在線調(diào)試快捷鈕”用于在線仿真調(diào)試;“編譯、編譯鏈接、全部編譯鏈接”三個快捷鈕分別用于編譯當前活躍文件、編譯鏈接修改過的源文件和全部編譯鏈接整個工程文件;“下載工程可執(zhí)行代碼到目標芯片”用于將編譯鏈接成功后的.hex目標代碼寫入到STM32F103ZET6芯片的Flash存儲器中。在圖4-16中,鼠標右鍵單擊“STM32F103ZET6”,在其彈出的菜單中選擇“Options for Target STM32F103ZET6. Alt+F7”,進入到圖4-17所示窗口。,圖4-17 目標選項卡,在圖4-17中,選中“IROM1”,長度為0x80000(即512kB FLASH);選中“IRAM1”,長度為“0x10000”(即64kB SRAM)。在圖4-17中,選擇“Output”頁面,進入圖4-18所示窗口。,在圖4-18中,設(shè)定工程生成的目標文件名為MyPrj,所在的路徑為“.ObjectsMyPrj”,即工程所在路徑下的“D:STM32F103ZET6工程工程01PRJObjectsMyPrj”,然后,選中“Create HEX File”復(fù)選框,表示編譯鏈接后產(chǎn)生HEX格式的目標文件。在圖4-18中選擇“C/C+”選項卡,進入圖4-19所示窗口。,圖4-18 “Output”輸出目標文件路徑和格式選項卡,圖4-19 “C/C+”選項卡,圖4-20 “Debug”選項卡,在圖4-19中,“Include Paths”中指定工程編譯時搜索文件的路徑,這里的“.”表示工程所在的路徑,即“D:STM32F103ZET6工程工程01PRJ”,“”表示工程所在路徑的上一個路徑,即“D:STM32F103ZET6工程工程01”。然后,在圖4-19中選擇“Debug”選項卡,進入圖4-20所示窗口。,在圖4-20中,由于這里使用了ULINK2仿真器,所以選擇了“ULINK2/ME Cotex Debugger”,選中“Run to main()”表示在線真調(diào)試時,程序計數(shù)器指針PC自動跳轉(zhuǎn)到main函數(shù)執(zhí)行,否則,PC將跳轉(zhuǎn)到匯編語言編寫的啟動文件startup_stm32f10x_hd.s中的Reset_Handler標號去執(zhí)行。在圖4-20中單擊“Settings”按鈕進入圖4-21所示窗口。,圖4-21 ULINK2仿真連接對話框,圖4-22 FLASH編程算法選擇對話框,如果STM32F103戰(zhàn)艦V3開發(fā)板已上電,且ULINK2連接正常,則圖4-21中將顯示Cortex-M3的IDCODE為“0x1BA01477”,表示連接正常。STM32F103ZET6支持JTAG和SW兩種調(diào)試方式,圖4-21中的“Port”可選SW或JTAG。在圖4-21中選擇“Flash Download”選項卡,進入圖4-22所示窗口。 在圖4-22中,添加FLASH編程算法“STM32F10x High-density Flash”,然后,單擊“OK”按鈕回到圖4-20,在圖4-20中單擊“OK”按鈕回到圖4-16,這樣基于Keil MDK軟件開發(fā)環(huán)境的工程框架就配置好了。,4.4 LED燈閃爍實例,在STM32F103戰(zhàn)艦V3開發(fā)板集成了2個LED燈,如圖3-12所示。由圖3-12、圖3-3和圖3-6可知,LED0燈由PB5控制,LED1燈由PE5控制。下面介紹LED燈閃爍控制的工程設(shè)計實例。,4.4.1 寄存器類型工程實例,在圖4-16基礎(chǔ)上,新建文件led.c和led.h保存在子文件夾“BSP”下。然后,新建文件main.c、includes.h和vartypes.h,保存在子文件夾“USER”下。接著,將led.c文件添加到工程管理器的“BSP”分組下,將main.c文件添加到工程管理器的“USER”分組下,如圖4-23所示。注意,圖4-23中工程管理器中的分組名與子文件夾的名稱是相同的,但是二者沒有聯(lián)系,分組名可以使用各種符號和漢字。,圖4-23 工程01工作界面-III,下面依次介紹工程01中的各個文件,如程序段4-5至程序段4-9所示。 程序段4-5 文件vartypes.h 1 /Filename: vartypes.h 2 3 #ifndef _VARTYPES_H 4 #define _VARTYPES_H 5 6 typedef unsigned char Int08U; 7 typedef signed char Int08S; 8 typedef unsigned short Int16U; 9 typedef signed short 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是用戶自定義的變量類型文件。程序段4-5中,第3、4行和第17行構(gòu)成預(yù)編譯處理,由于頭文件vartypes.h被工程中的多個源文件包括,使用預(yù)編譯處理指令可保證該頭文件僅被包括一次。第611行依次定義了自定義變量類型:無符號8位整型、有符號8位整型、無符號16位整型、有符號16位整型、無符號32位整型和有符號32位整型。第13行定義了32位浮點型自定義變量類型。第15行定義了枚舉型自定義類型,用于定義LED燈的狀態(tài),LED_ON和LED_OFF分別用于表示LED燈的開和關(guān)的狀態(tài)。,程序段4-6 文件includes.h 1 /Filename: includes.h 2 3 #include “stm32f10x.h“ 4 5 #include “vartypes.h“ 6 #include “l(fā)ed.h“,頭文件includes.h是工程中總的包括頭文件,包括了工程中用到的其余全部頭文件,該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.c 1 /Filename: main.c 2 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 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;iu;i+) 25 for(j=0;j12000;j+); 26 ,程序段4-8 文件led.h 1 /Filename: led.h 2 3 #include “vartypes.h“ 4 5 #ifndef _LED_H 6 #define _LED_H 7 8 void LEDInit(void); 9 void LED(Int08U,LEDState); 10 11 #endif,本書工程中,每個源文件都有一個對應(yīng)的頭文件,用于聲明源文本中定義的函數(shù)。 第3行包括了頭文件vartypes.h,因為第9行的函數(shù)聲明用到了自定義變量類型Int08U和LEDState; 第8行聲明了LEDInit函數(shù);第9行聲明了LED函數(shù)。,程序段4-9 文件led.c 1 /Filename: led.c 2 3 #include “includes.h“ 4 5 void LEDInit(void) 6 ,7 RCC-APB2ENR |= (1uLCRL |= (1uLCRL ,22 else 23 GPIOB-BSRR = (1uLBRR = (1uLBSRR = (1uL5); 30 break; 31 default: 32 break; 33 34 ,文件led.c是LED燈的驅(qū)動文件,包括了兩個函數(shù),即LEDInit和LED。 第89行配置PB5為推挽輸出,最大速率為10MHz(參見圖4-2); 第1112行配置PE5為推挽輸出,最大速率為10MHz(參見圖4-2)。 第1534行為LED函數(shù),該函數(shù)有兩個參數(shù)w和s,w取0表示LED0,w取1表示LED1;s取值LED_ON,表示相應(yīng)的LED燈點亮,s取值LED_OFF,表示相應(yīng)的LED燈熄滅。 在LED函數(shù)中,第17行判斷w的值,如果為0,則第2024行被執(zhí)行,如果第20行為真,則第21行點亮LED0,否則熄滅LED0(第23行);如果w的值為1,則第2630行被執(zhí)行,如果第26行為真,則點亮LED1(第27行),否則熄滅LED1(第29行)。 工程01的執(zhí)行過程如圖4-24所示、,圖4-24 工程01的執(zhí)行流程,由圖4-24可知,工程01上電復(fù)位后,首先執(zhí)行位于文件system_stm32f10x.c中的SystemInit函數(shù),用于將STM32F103ZET6的時鐘由8MHz調(diào)整到72MHz(除此之外,在啟動文件startup_stm32f10x_hd.s中還為C語言函數(shù)分配了堆棧空間);然后,轉(zhuǎn)到main函數(shù)執(zhí)行;進入到main函數(shù)后,首先調(diào)用LEDInit函數(shù)初始化LED燈的控制;接著進入無限循環(huán)體,依次循環(huán)執(zhí)行“LED0亮、LED1滅延時約1秒LED0滅、LED1亮延時約1秒”。其中,LED0亮和LED1滅是main函數(shù)調(diào)用led.c文件中的LED函數(shù)實現(xiàn)的,延時函數(shù)Delay位于主文件main.c中,由for循環(huán)實現(xiàn)。,本小節(jié)借助調(diào)用庫函數(shù)的方式實現(xiàn)工程01的功能。 在“工程01”基礎(chǔ)上,新建“工程02”,保存在目錄“D:STM32F103ZET6工程”下,此時的“工程02”與“工程01”完全相同。將STM32F10x的庫函數(shù)文件復(fù)制到目錄“D:STM32F103ZET6工程工程02”下,此時,“工程02”的目錄結(jié)構(gòu)如圖4-25所示,這里STM32F103的庫函數(shù)可從意法半導(dǎo)體官網(wǎng)上下載,或從上下載。然后,復(fù)制文件stm32f10x_conf.h到目錄“D:STM32F103ZET6工程工程02 STM32F10x_FWLib”下,該文件包括了目錄“D:STM32F103ZET6工程工程02 STM32F10x_FWLibinc”中的全部頭文件。,圖4-25 工程02目錄和文件結(jié)構(gòu),圖4-25中的src子目錄包括了表4-4中“庫函數(shù)文件”一欄中的全部文件,inc子目錄包括了表4-4中“庫函數(shù)頭文件”一欄中的全部文件。,在工程02中,修改圖4-19所示的“C/C+”選項卡,如圖4-26所示,即添加兩個全局的宏定義常量STM32F10X_HD和USE_STDPERIPH_DRIVER,并且,編譯的搜索路徑改為“BSP;USER;.RTE;STM32F10x_FWLib;STM32F10x_FWLibinc”。 這里添加的宏定義常量USE_STDPERIPH_DRIVER,是因為在文件stm32f10x.h中有以下語句:,程序段4-10 文件stm32f10x.h中的語句 1 #ifdef USE_STDPERIPH_DRIVER #include “stm32f10x_conf.h“ 3 #endif,由于庫函數(shù)文件是針對STM23F10x全系列的微控制器,宏定義常量STM32F10X_HD表示僅使得那些STM32F103ZET6相關(guān)的常量和函數(shù)有效。,圖4-26 “C/C+”選項卡,在工程管理器中,新建分組“LIB”,將目錄 “D:STM32F103ZET6工程工程02 STM32F10x_FWLibsrc”下的文件 “stm32f10x_gpio.c” 和 “stm32f10x_rcc.c” 添加到分組“LIB”下 (當然,可以將src子目錄下的全部文件都添加到分組LIB下,這里僅添加了本工程中用到的源文件),如圖4-27所示。,圖4-27 工程02工作窗口,相對于工程01的文件,工程02只需要修改led.c文件,如程序段4-11所示。 程序段4-11 文件led.c 1 /Filename: led.c 2 3 #include “includes.h“ 4 5 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 g.GPIO_Speed = GPIO_Speed_50MHz; 13 GPIO_Init(GPIOB, 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 else 29 GPIO_SetBits(GPIOB, GPIO_Pin_5); 30 break; 31 case 1: 32 if(s=LED_ON) 33 GPIO_ResetBits(GPIOE,GPIO_Pin_5); 34 else 35 GPIO_SetBits(GPIOE, GPIO_Pin_5);,36 break; 37 default: 38 break; 39 40 ,對比程序段4-9可知,這里的程序段4-11中,第8行調(diào)用RCC_APB2Pe

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論