上課實(shí)例-gpio控制實(shí)驗(yàn)_第1頁
上課實(shí)例-gpio控制實(shí)驗(yàn)_第2頁
上課實(shí)例-gpio控制實(shí)驗(yàn)_第3頁
上課實(shí)例-gpio控制實(shí)驗(yàn)_第4頁
上課實(shí)例-gpio控制實(shí)驗(yàn)_第5頁
已閱讀5頁,還剩60頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

實(shí)例1

GPIO控制實(shí)驗(yàn)1、新建MDK工程如何新建MDK工程?安裝開發(fā)環(huán)境和調(diào)試驅(qū)動(dòng)程序創(chuàng)建一個(gè)工程并配置工程編寫程序、、調(diào)試選擇工程文件,Project->New

μVision

Project…新建

的新建的工程文件保存在桌面的GPIO\USER文件夾下(先在電腦桌面上新建一GPIO文件夾,在GPIO里面新建一個(gè)USER文件夾),文件名取為

GPIO,名字可以隨便取。創(chuàng)建一個(gè)工程并配置工程選擇

型號(hào)。

選擇STMicroelectronicsSTM32F1

SeriesSTM32F103

STM32F103ZET6(如果使用的是其他系列的

,選擇相應(yīng)的型號(hào)就可以了點(diǎn)擊

OK,

MDK

會(huì)彈出

Manage

Run-TimeEnvironment

框這是

MDK5新增的一個(gè)功能,在這個(gè)界面,可以添加自己需要的組件,從而方便構(gòu)建開發(fā)環(huán)境, 直接點(diǎn)擊

Cancel。到這里,

還只是建了一個(gè)框架,還需要添加啟動(dòng)代碼,以及.c

文件等。USER文件夾下面的Listings和

Objects文件夾是

MDK自動(dòng)生成的文件夾,用于存放編譯過程產(chǎn)生的中間文件。這里, 把兩個(gè)文件夾刪除,新建一個(gè)

OBJ

文件夾,用來存放編譯中間文件。USER

除了用來放工程文件外,定位到

:STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x

下面將里面的三個(gè)文件

stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h,

到 的

USER

之下。STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template

4

個(gè)

件main.c,

stm32f10x_conf.h,

stm32f10x_it.c,stm32f10x_it.h

USER

下面。在工程

下,新建文件夾

CORE、FWLIB、HARDWARE、SYSTEM

、OBJ。CORE

用來存放 文件和啟動(dòng)文件打開 固件庫包,定位到STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport

下面,將文件core_cm3.c和

core_cm3.h

CORE下

。定

到STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm

下面,將里面

startup_stm32f10x_hd.s

文件 到

CORE

下面。不同容量的 使用不同的啟動(dòng)文件,

STM32F103ZET6

是大容量芯片,所以選擇這個(gè)啟動(dòng)文件。對(duì)于103

系列,主要是用其中3

個(gè)啟動(dòng)文件:

startup_stm32f10x_ld.s:適用于小容量產(chǎn)品

startup_stm32f10x_md.s

:適用于中等容量產(chǎn)品

startup_stm32f10x_hd.s:適用于大容量產(chǎn)品這里的容量是指FLASH

的大小.判斷方法如下:小容量:FLASH≤32K中容量:64K≤FLASH≤128K大容量:256K≤FLASH現(xiàn)在看看的CORE

文件夾下面的文件:FWLIB

文件夾用來存放

ST

提供的庫函數(shù)源碼文件。打開 固件庫包,定位到STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver

下面,將 下面的

src,inc

文件夾copy

到剛才建立的

FWLIB

文件夾下面。src存放的是固件庫的.c

文件,inc存放的是對(duì)應(yīng)的.h

文件,每個(gè)外設(shè)對(duì)應(yīng)一個(gè).c

文件和一個(gè).h

頭文件。選擇

Manage

Components

工具將 名字修改為

GPIO,然后在

Groups

一欄刪掉一個(gè)

Source

Group

1,建立5個(gè)

Groups:USER,CORE,FWLIB,HARDWARE,SYSTEM。選擇USER

,然后點(diǎn)擊Add

Files往Group

里面添加需要的文件。USERstm下面需要添加的文件為

main.c,c

。CORE

下面需要添加的文件為core_cm3.c,startup_stm32f10x_hd.s

(注意,默認(rèn)添加的時(shí)候文件類型為.c,也就是添加startup_stm32f10x_hd.s啟動(dòng)文件的時(shí)候,你需要選擇文件類型為All

files

才能看得到這個(gè)文件)選

FWLIB

,

點(diǎn)

擊AddFiles,

到 剛

建立

FWLIB

/src

下面,將里面所有的文件選中(Ctrl+A),然后點(diǎn)擊

Add,然后

Close.

可以看到

Files列

表下面包含 添加的文件。這里 全部添加進(jìn)來是為了后面方便,不用每次添加,當(dāng)然這樣的壞處是工程太大,編譯起來速度慢,用戶可以自行選擇。如果 只用到了其中的某個(gè)外設(shè), 就可以不用添加沒有用到的外設(shè)的庫文件。例如我只用

GPIO,我可以只用添加misc.c

,

stm32f10x_gpio.c,

stm32f10x_rcc.c,stm32f10x_usart.c

,

而其他的可以不用添加。進(jìn)入SYSTEM

文件夾,里面有三個(gè)子文件夾分別為delay,sys,usart。選擇SYSTEM,加入這三個(gè)文件夾下面的.c

文件分別為sys.c,delay.c,usart.c。接下來編譯工程,在編譯之前要選擇編譯中間文件編譯后存放。方法是點(diǎn)擊魔術(shù)棒,然后選擇“Output”選項(xiàng)下面的“Selectfolder

forobjects…”,然后選擇為上面新建的OBJ

目錄。這里大家注意,如果不設(shè)置Output

路徑,那么默認(rèn)的編譯中間文件存放就是MDK自動(dòng)生成的Objects和

Listings

。對(duì)于任何一個(gè)工程, 都需要把工程中有頭文件的路徑都包含進(jìn)來。到的所我?guī)靷僣/c“到選擇:

Use

Simulator,即使用 仿真。選擇:

Run

tomain(),即跳過匯編代碼,直接跳轉(zhuǎn)到

main

函數(shù)開始仿真。2.STM32時(shí)鐘系統(tǒng)STM32

有5個(gè)時(shí)鐘源:HSI、HSE、LSI、LSE、PLL。①

HSI是高速

時(shí)鐘,RC振蕩器,頻率為8MHz,精度不高。②HSE是高速外部時(shí)鐘,可接石英/陶瓷諧振器,或者接外部時(shí)鐘源,頻率范圍為4MHz~16MHz。一般選用8MHz③

LSI是低速

時(shí)鐘,RC振蕩器,頻率為40kHz,提供低功耗時(shí)鐘。④LSE是低速外部時(shí)鐘,接頻率為32.768kHz的石英晶體。⑤PLL為鎖相環(huán)倍頻輸出,其時(shí)鐘輸入源可選擇為HSI/2、HSE或者HSE/2

倍頻可選擇為2~16倍,但是其輸出頻率最大不得超過72MHz。系統(tǒng)時(shí)鐘SYSCLK可來源于三個(gè)時(shí)鐘源:①HSI振蕩器時(shí)鐘②HSE振蕩器時(shí)鐘③PLL時(shí)鐘STM32可以選擇一個(gè)時(shí)鐘信號(hào)輸出到MCO腳(PA8)上,可以選擇為

PLL

輸出的2分頻、HSI、HSE、或者系統(tǒng)時(shí)鐘。任何一個(gè)外設(shè)在使用之前,必須首先使能其相應(yīng)的時(shí)鐘。幾個(gè)重要的時(shí)鐘:

SYSCLK(系統(tǒng)時(shí)鐘):

AHB總線時(shí)鐘

APB1總線時(shí)鐘(低速):速度最高36MHz

APB2總線時(shí)鐘(高速):速度最高72MHz

PLL時(shí)鐘SysTick定時(shí)器Systick定時(shí)器?操作系統(tǒng)還有所有使用了時(shí)基的系統(tǒng),都必須一個(gè)硬件定時(shí)器來產(chǎn)生需要的“滴答”中斷,作為整個(gè)系統(tǒng)的時(shí)基。滴答中斷對(duì)操作系統(tǒng)尤其重要。例如,操作系統(tǒng)可以為多個(gè)任務(wù)不同數(shù)目的時(shí)間片,確保沒有一個(gè)任務(wù)能霸占系統(tǒng);或者把每個(gè)定時(shí)器周期的某個(gè)時(shí)間范圍賜予特定的任務(wù)等,還

有操作系統(tǒng)提供的各種定時(shí)功能,都與這個(gè)滴答定時(shí)器有關(guān)。因此,需要一個(gè)定時(shí)器來產(chǎn)生周期性的中斷,而且最好還讓用戶程序不能隨意

它的寄存器,以維持操作系統(tǒng)“心跳”的節(jié)律。Systick定時(shí)器就是系統(tǒng)滴答定時(shí)器,一個(gè)24

位的倒計(jì)數(shù)定時(shí)器,計(jì)到0

時(shí),將從RELOAD

寄存器中自動(dòng)重裝載定時(shí)初值。只要不把它在SysTick

控制及狀態(tài)寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。SysTick定時(shí)器SysTick定時(shí)器被 在NVIC中,用于產(chǎn)生Systick異常(異常號(hào):15)。SysTick定時(shí)器能產(chǎn)生中斷,CM3為它專門開出一個(gè)異常類型,并且在向量表中有它的一席之地。它使操作系統(tǒng)和其它系統(tǒng)

在CM3器件間的移植變得簡(jiǎn)單多了,因?yàn)樵谒蠧M3產(chǎn)品間,SysTick的處理方式都是相同的。typedef

struct{

IO

uint32_t

CTRL;

IO

uint32_t

LOAD;

IO

uint32_tVAL;

I uint32_t

CALIB;}SysTick_Type;CTRLSysTick

控制和狀態(tài)寄存器LOADSysTick

自動(dòng)重裝載除值寄存器VALSysTick

當(dāng)前值寄存器CALIBSysTick

校準(zhǔn)值寄存器4個(gè)Systick

相關(guān)寄存器:固件庫V3.5中的Systick相關(guān)函數(shù):SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);72MHz/8=9MHz如何定時(shí)1us?fac_us=SystemCoreClock/8000000;

//9fac_ms=(u16)fac_us*1000;SysTick_Config(uint32_t

ticks)//初始化systick,時(shí)鐘為HCLK,并開啟中斷Systick中斷服務(wù)函數(shù):void

SysTick_Handler(void);使用systick延時(shí)計(jì)算出產(chǎn)生1us需要多少個(gè)時(shí)鐘周期fac_us;計(jì)算出RELOAD寄存器的值(也就是產(chǎn)生相應(yīng)延時(shí)所需要的時(shí)鐘周期數(shù));RELOAD=fac_us

*

nus開啟遞減計(jì)數(shù);計(jì)數(shù)到0時(shí),自動(dòng)重裝初值并繼續(xù)計(jì)數(shù),同時(shí)觸發(fā)中斷關(guān)閉計(jì)數(shù)器,清空計(jì)數(shù)器使用systick延時(shí)nus的設(shè)計(jì)思路:void

delay_us(u32

nus){u32

temp;SysTick->LOAD=nus*fac_us;

//時(shí)間加載SysTick->VAL=0x00; //清空計(jì)數(shù)器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;//開始倒數(shù)

do{temp=SysTick->CTRL;}while(temp&0x01&&!(temp&(1<<16)));//等待時(shí)間到達(dá)SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;

//關(guān)閉計(jì)數(shù)器SysTick->VAL

=0X00;

//清空計(jì)數(shù)器}delay_us()函數(shù)://開始倒數(shù)SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk

;do{temp=SysTick->CTRL;}while(temp&0x01&&!(temp&(1<<16)));//等待時(shí)間到達(dá)SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;//關(guān)閉計(jì)數(shù)器SysTick->VAL

=0X00;

//清空計(jì)數(shù)器}delay_ms()函數(shù)://延時(shí)nms//注意nms的范圍//SysTick->LOAD為24位寄存器,所以,最大延時(shí)為://nms<=0xffffff*8*1000/SYSCLK

(2^24/9)us=1864135.11us//SYSCLK單位為Hz,nms單位為ms//對(duì)72M條件下,nms<=1864void

delay_ms(u16

nms){u32

temp;SysTick->LOAD=(u32)nms*fac_ms;//時(shí)間加載(SysTick->LOAD為24bit)SysTick->VAL

=0x00;

//清空計(jì)數(shù)器3.

GPIO(PA,PB,PC,PD,PE,PF,PG)每個(gè)GPIO端口有7

個(gè)寄存器來控制(見開發(fā)指南P134-139)2個(gè)32位配置寄存器(GPIOx_CRL,GPIOx_CRH),2個(gè)32位數(shù)據(jù)寄存器(GPIOx_IDR和GPIOx_ODR),1個(gè)32位置位/復(fù)位寄存器(GPIOx_BSRR),1個(gè)16位復(fù)位寄存器(GPIOx_BRR)1個(gè)32位鎖定寄存器(GPIOx_LCKR)。在固件庫中,GPIO

端口操作對(duì)應(yīng)的庫函數(shù)函數(shù)以及相關(guān)定義在文件stm32f10x_gpio.h

和stm32f10x_gpio.c

中。STM32F103ZET6一共有7組IO口每組IO口有16個(gè)IO-一共16X7=112個(gè)IOGPIOA---GPIOGGPIO

初始化函數(shù)在固件庫開發(fā)中,操作寄存器CRH和CRL

來配置IO

口的模式和速度是通過GPIO

初始化函數(shù)完成:void

GPIO_Init(GPIO_TypeDef*

GPIOx,

GPIO_InitTypeDef*

GPIO_InitStruct);第一個(gè)參數(shù)是用來指定GPIO,取值范圍為

GPIOA~GPIOG。第二個(gè)參數(shù)為初始化參數(shù)結(jié)構(gòu)體指針,結(jié)構(gòu)體類型為GPIO_InitTypeDef。typedef

struct{ uint16_tGPIO_Pin;GPIOSpeed_TypeDef

GPIO_Speed;GPIOMode_TypeDef

GPIO_Mode;}GPIO_InitTypeDef;void

student_Init(char

name[10],

char

sex,

int

age,

int

num);如果 這個(gè)函數(shù)的參數(shù)隨著開發(fā)不斷的增多,那么就要不斷的修改函數(shù)的定義,

給開發(fā)帶來很多的麻煩。如果使用到結(jié)構(gòu)體就能解決這個(gè)問題了。結(jié)構(gòu)體可以將多個(gè)變量組合為一個(gè)有機(jī)的整體。上面的函數(shù),

char

name[10],

char

sex,

int

age,

int

num這些參數(shù),對(duì)于學(xué)生而言,是一個(gè)有機(jī)整體,所以 可以將他們通過定義一個(gè)結(jié)構(gòu)體來組合在一個(gè)。結(jié)構(gòu)體的定義structstudent{char

name[10];charsex;int

age;int

num;struct

結(jié)構(gòu)體名{成員列表;}變量名列表;在結(jié)構(gòu)體申明的時(shí)候可以定義變量,也可以申明之后定義,方法是:struct

結(jié)構(gòu)體名字結(jié)構(gòu)體變量列表;structstudent{char

name[10];charsex;int

age;int

num;}

student

1,

student2;

;struct

student

student

1,

student

2;typedef類型別名typedef

用于為現(xiàn)有類型創(chuàng)建一個(gè)新的名字,或稱為類型別名,用來簡(jiǎn)化變量的定義。typedef

在MDK

用得最多的是定義結(jié)構(gòu)體的類型別名和枚舉類型。structstudent{char

name[10];charsex;int

age;int

num;}

;struct

student

student

1,

student

2;typedef

struct{charname[10];charsex;int

age;int

num;}student;student

student

1,

student

2;定義結(jié)構(gòu)體的類型typedef

struct{ uint16_t

GPIO_Pin;GPIOSpeed_TypeDef

GPIO_Speed;GPIOMode_TypeDef

GPIO_Mode;}GPIO_InitTypeDef;typedef

為結(jié)構(gòu)體定義一個(gè)別名GPIO_InitTypeDef

,這樣可以通過GPIO_InitTypeDef來定義結(jié)構(gòu)體變量:GPIO_InitTypeDef

GPIO_InitStructure;結(jié)構(gòu)體成員變量的 方法是:結(jié)構(gòu)體變量名字.成員名比如要

GPIO_InitStructure

的成員

GPIO_Pin

,方法是:GPIO_InitStructure.

GPIO_

PIO_Pin_5;參數(shù)GPIO_Speed是IO口速度設(shè)置,有三個(gè)可選值,在MDK中同樣是通過枚舉類型定義typedefenum{GPIO_Speed_10MHz,GPIO_Speed_2MHz,GPIO_Speed_50MHz}GPIOSpeed_TypeDef;參數(shù)GPIO_Mode;確定初始化的IO的輸入輸出模式,

其取值范圍為枚舉類型GPIOMode_TypeDef的枚舉值:typedef

enum{

GPIO_Mode_AIN

=

0x0, //模擬輸入GPIO_Mode_IN_FLOATING=

0x04,

//浮空輸入//下拉輸入//上拉輸入//開漏輸出//通用推挽輸出//復(fù)用開漏輸出//復(fù)用推挽GPIO_Mode_IPD

=0x28,GPIO_Mode_IPU

=0x48,GPIO_Mode_Out_OD

=

0x14,GPIO_Mode_Out_PP

=

0x10,GPIO_Mode_AF_OD

=

0x1C,GPIO_Mode_AF_PP

=

0x18}GPIOMode_TypeDef;淘寶:http:/技術(shù)(FT)GPIO基本結(jié)構(gòu)GPIO的輸入工作模式1—輸入浮空模式淘寶:http:/技術(shù)GPIO的輸入工作模式2—輸入上拉模式淘寶:http:/技術(shù)GPIO的輸入工作模式3—輸入下拉模式淘寶:http:/技術(shù)GPIO的輸入工作模式4—模擬模式淘寶:http:/技術(shù)GPIO的輸出工作模式1—開漏輸出模式淘寶:http:/技術(shù)GPIO的輸出工作模式2—開漏復(fù)用輸出模式淘寶:http:/技術(shù)GPIO的輸出工作模式3—推挽輸出模式淘寶:http:/技術(shù)GPIO的輸出工作模式4—推挽復(fù)用輸出模式淘寶:http:/技術(shù)要求:實(shí)現(xiàn)LED0

、LED1間隔200ms亮滅閃爍;led.h

led.cled.h中#include

"sys.h"sys.h中#include

"stm32f10x.h“stm32f10x.h中#include

"core_cm3.h“#include

"system_stm32f10x.h"#include

<stdint.h>#include

"stm32f10x_conf.h

"#include

"stm32f10x_iwdg.h"#include

"stm32f10x_pwr.h"#include

"stm32f10x_rcc.h"#include

"stm32f10x_rtc.h"#include

"stm32f10x_sdio.h"#include

"stm32f10x_spi.h"stm32f10x_conf.h中#include

"stm32f10x_adc.h"#include

"stm32f10x_bkp.h"#include

"stm32f10x_can.h"#include

"stm32f10x_cec.h"#include

"stm32f10x_crc.h"#include

"stm32f10x_dac.h"#include

"stm32f10x_dbgmcu.h"

#include

"stm32f10x_tim.h"#include

"stm32f10x_dma.h"#include

"stm32f10x_exti.h"#include

"stm32f10x_flash.h“#include

"stm32f10x_fsmc.h"#include

"stm32f10x_gpio.h"#include

"stm32f10x_i2c.h"#include

"stm32f10x_usart.h"#include

"stm32f10x_wwdg.h"#include

"misc.h"stm32f10x.h中定義:typedef

int8_t

s8;typedef

int16_t

s16;typedef

int32_t

s32;typedef

uint8_t

u8;typedef

uint16_t

u16;typedef

uint32_t

u32;stdint.h中定義:typedef

signed

charint8_t;typedeftypedefsigned

short

intsigned

intint16_t;int32_t;typedef

unsignedtypedef

unsignedtypedef

unsignedcharshortintintuint8_t;uint16_t;uint32_t;void

RCC_APB2PeriphClockCmd(uint32_tRCC_APB2Periph,

FunctionalState

NewState)void

GPIO_SetBits(GPIO_TypeDef*

GPIOx,uint16_tGPIO_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論