STM32F10xGPIO.docx

上传人:b****7 文档编号:8951871 上传时间:2023-02-02 格式:DOCX 页数:41 大小:30.23KB
下载 相关 举报
STM32F10xGPIO.docx_第1页
第1页 / 共41页
STM32F10xGPIO.docx_第2页
第2页 / 共41页
STM32F10xGPIO.docx_第3页
第3页 / 共41页
STM32F10xGPIO.docx_第4页
第4页 / 共41页
STM32F10xGPIO.docx_第5页
第5页 / 共41页
点击查看更多>>
下载资源
资源描述

STM32F10xGPIO.docx

《STM32F10xGPIO.docx》由会员分享,可在线阅读,更多相关《STM32F10xGPIO.docx(41页珍藏版)》请在冰豆网上搜索。

STM32F10xGPIO.docx

STM32F10xGPIO

10.1GPIO寄存器结构.............................................................120

10.2GPIO库函数.................................................................122

No

函数名

描述

1

GPIO_DeInit

将外设GPIOx寄存器重设为缺省值

2

GPIO_AFIODeInit

将复用功能(重映射事件控制和EXTI设置)重设为缺省值

3

GPIO_Init

根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器

4

GPIO_StructInit

把GPIO_InitStruct中的每一个参数按缺省值填入

5

GPIO_ReadInputDataBit

读取指定端口管脚的输入

6

GPIO_ReadInputData

读取指定的GPIO端口输入

7

GPIO_ReadOutputDataBit

读取指定端口管脚的输出

8

GPIO_ReadOutputData

读取指定的GPIO端口输出

9

GPIO_SetBits

设置指定的数据端口位

10

GPIO_ResetBits

清除指定的数据端口位

11

GPIO_WriteBit

设置或者清除指定的数据端口位

12

GPIO_Write

向指定GPIO数据端口写入数据

13

GPIO_PinLockConfig

锁定GPIO管脚设置寄存器

14

GPIO_EventOutputConfig

选择GPIO管脚用作事件输出

15

GPIO_EventOutputCmd

使能或者失能事件输出

16

GPIO_PinRemapConfig

改变指定管脚的映射

17

GPIO_EXTILineConfig

选择GPIO管脚用作外部中断线路

10通用输入/输出(GPIO)

GPIO驱动可以用作多个用途,包括管脚设置,单位设置/重置,锁定机制,从端口管脚读入或者向端口管

脚写入数据。

Section10.1GPIO寄存器结构描述了固件函数库所使用的数据结构,Section10.2固件库函数介绍了函数库里的所有函数。

10.1GPIO寄存器结构

GPIO寄存器结构,GPIO_TypeDef和AFIO_TypeDef,在文件“stm3210x_map.h中定义如下:

typedefstruct

{

vu32CRL;vu32CRH;vu32IDR;vu32ODR;

vu32BSRR;

vu32BRR;

vu32LCKR;

}GPIO_TypeDef;

typedefstruct

{

vu32EVCR;vu32MAPR;

vu32EXTICR[4];

}AFIO_TypeDef;

Table178.例举了GPIO所有寄存器

Table178.GPIO寄存器

寄存器

描述

CRL

端口配置低寄存器

CRH

端口配置高寄存器

IDR

端口输入数据寄存器

ODR

端口输出数据寄存器

BSRR

端口位设置/复位寄存器

BRR

端口位复位寄存器

LCKR

端口配置锁定寄存器

EVCR

事件控制寄存器

MAPR

复用重映射和调试I/O配置寄存器

EXTICR

外部中断线路0-15配置寄存器

五个GPIO外设声明于文件:

...

#definePERIPH_BASE((u32)0x40000000)

#defineAPB1PERIPH_BASEPERIPH_BASE

#defineAPB2PERIPH_BASE(PERIPH_BASE+0x10000)

#defineAHBPERIPH_BASE(PERIPH_BASE+0x20000)

...

#defineAFIO_BASE(APB2PERIPH_BASE+0x0000)

#defineGPIOA_BASE(APB2PERIPH_BASE+0x0800)#defineGPIOB_BASE(APB2PERIPH_BASE+0x0C00)#defineGPIOC_BASE(APB2PERIPH_BASE+0x1000)#defineGPIOD_BASE(APB2PERIPH_BASE+0x1400)#defineGPIOE_BASE(APB2PERIPH_BASE+0x1800)

#ifndefDEBUG

...

#ifdef_AFIO

#defineAFIO((AFIO_TypeDef*)AFIO_BASE)

#endif/*_AFIO*/

#ifdef_GPIOA

#defineGPIOA((GPIO_TypeDef*)GPIOA_BASE)

#endif/*_GPIOA*/

#ifdef_GPIOB

#defineGPIOB((GPIO_TypeDef*)GPIOB_BASE)

#endif/*_GPIOB*/

#ifdef_GPIOC

#defineGPIOC((GPIO_TypeDef*)GPIOC_BASE)

#endif/*_GPIOC*/

#ifdef_GPIOD

#defineGPIOD((GPIO_TypeDef*)GPIOD_BASE)

#endif/*_GPIOD*/

#ifdef_GPIOE

#defineGPIOE((GPIO_TypeDef*)GPIOE_BASE)

#endif/*_GPIOE*/

...

#else/*DEBUG*/

...

#ifdef_AFIO

EXTAFIO_TypeDef*AFIO;

#endif/*_AFIO*/

#ifdef_GPIOA

EXTGPIO_TypeDef*GPIOA;

#endif/*_GPIOA*/

#ifdef_GPIOB

EXTGPIO_TypeDef*GPIOB;

#endif/*_GPIOB*/

#ifdef_GPIOC

EXTGPIO_TypeDef*GPIOC;

#endif/*_GPIOC*/

#ifdef_GPIOD

EXTGPIO_TypeDef*GPIOD;

#endif/*_GPIOD*/

#ifdef_GPIOE

EXTGPIO_TypeDef*GPIOE;

#endif/*_GPIOE*/

...

#endif

使用Debug模式时,初始化指针AFIO,GPIOA,GPIOB,GPIOC,GPIOD和GPIOE

于文件:

#ifdef_GPIOA

GPIOA=(GPIO_TypeDef*)GPIOA_BASE;

#endif/*_GPIOA*/

#ifdef_GPIOB

GPIOB=(GPIO_TypeDef*)GPIOB_BASE;

#endif/*_GPIOB*/

#ifdef_GPIOC

GPIOC=(GPIO_TypeDef*)GPIOC_BASE;

#endif/*_GPIOC*/

#ifdef_GPIOD

GPIOD=(GPIO_TypeDef*)GPIOD_BASE;

#endif/*_GPIOD*/

#ifdef_GPIOE

GPIOE=(GPIO_TypeDef*)GPIOE_BASE;

#endif/*_GPIOE*/

#ifdef_AFIO

AFIO=(AFIO_TypeDef*)AFIO_BASE;

#endif/*_AFIO*/

为了访问GPIO寄存器,_GPIO,_AFIO,_GPIOA,_GPIOB,_GPIOC,_GPIOD和_GPIOE必须在文件中定义如下:

#define_GPIO

#define_GPIOA

#define_GPIOB

#define_GPIOC

#define_GPIOD

10.2GPIO库函数

Table179.例举了GPIO的库函数【见首页】

10.2.1函数GPIO_DeInit

Table180.函数GPIO_DeInit

函数名

GPIO_DeInit

函数原形

voidGPIO_DeInit(GPIO_TypeDef*GPIOx)

功能描述

将外设GPIOx寄存器重设为缺省值

输入参数

GPIOx:

x可以是A,B,C,D,E,来选择GPIO外设

输出参数

返回值

先决条件

被调用函数

RCC_APB2PeriphResetCmd()

例:

/*ResetstheGPIOAperipheralregisterstotheirdefaultresetvalues*/

GPIO_DeInit(GPIOA);

函数原型如下:

voidGPIO_DeInit(GPIO_TypeDef*GPIOx)

{

/*Checktheparameters*/

assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

switch(*(u32*)&GPIOx)

{

caseGPIOA_BASE:

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA,ENABLE);//0x00000004

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA,DISABLE);

break;

/*

voidRCC_APB2PeriphResetCmd(u32RCC_APB2Periph,FunctionalStateNewState)

{

/*Checktheparameters*/

assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));

assert_param(IS_FUNCTIONAL_STATE(NewState));

if(NewState!

=DISABLE){RCC->APB2RSTR|=RCC_APB2Periph;}

else{RCC->APB2RSTR&=~RCC_APB2Periph;}

}

*/

caseGPIOB_BASE:

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB,ENABLE);//0x00000008

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB,DISABLE);

break;

caseGPIOC_BASE:

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC,ENABLE);//0x00000010

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC,DISABLE);

break;

caseGPIOD_BASE:

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD,ENABLE);//0x00000020

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD,DISABLE);

break;

caseGPIOE_BASE:

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE,ENABLE);//0x00000040

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE,DISABLE);

break;

caseGPIOF_BASE:

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF,ENABLE);//0x00000080

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF,DISABLE);

break;

caseGPIOG_BASE:

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG,ENABLE);//0x00000100

RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG,DISABLE);

break;

default:

break;

}

}

10.2.2函数GPIO_AFIODeInit

Table181.函数GPIO_AFIODeInit

函数名

GPIO_AFIODeInit

函数原形

voidGPIO_AFIODeInit(void)

功能描述

将复用功能(重映射事件控制和EXTI设置)重设为缺省值

输入参数

输出参数

返回值

先决条件

被调用函数

RCC_APB2PeriphResetCmd()

例:

/*ResetstheAlternatefunctionsregisterstotheirdefaultresetvalues*/

GPIO_AFIODeInit();

函数原型如下:

voidGPIO_AFIODeInit(void)

{

RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO,ENABLE);//0x00000001

RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO,DISABLE);

}

10.2.3函数GPIO_Init

Table182.函数GPIO_Init

函数名

GPIO_Init

函数原形

voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct)

功能描述

根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器

输入参数1

GPIOx:

x可以是A,B,C,D,E,来选择GPIO外设

输入参数2

GPIO_InitStruct:

指向结构GPIO_InitTypeDef的指针,包含了外设GPIO的配置信息

输出参数

返回值

先决条件

被调用函数

GPIO_InitTypeDefstructure定义于文件“stm2f10x_gpio.h”:

typedefstruct

{

u16GPIO_Pin;

GPIOSpeed_TypeDefGPIO_Speed;

GPIOMode_TypeDefGPIO_Mode;

}GPIO_InitTypeDef;

GPIO_Pin:

该参数选择待设置的GPIO管脚,使用操作符可以一次选中多个管脚。

可以使用下表中的任意组合。

Table183.GPIO_Pin值

参数GPIO_Pin值

描述

#define

GPIO_Pin_None

无管脚被选中

0x0000

GPIO_Pin_0

选中管脚0

0x0001

GPIO_Pin_1

选中管脚1

0x0002

GPIO_Pin_2

选中管脚2

0x0004

GPIO_Pin_3

选中管脚3

0x0008

GPIO_Pin_4

选中管脚4

0x0010

GPIO_Pin_5

选中管脚5

0x0020

GPIO_Pin_6

选中管脚6

0x0040

GPIO_Pin_7

选中管脚7

0x0080

GPIO_Pin_8

选中管脚8

0x0100

GPIO_Pin_9

选中管脚9

0x0200

GPIO_Pin_10

选中管脚10

0x0400

GPIO_Pin_11

选中管脚11

0x0800

GPIO_Pin_12

选中管脚12

0x1000

GPIO_Pin_13

选中管脚13

0x2000

GPIO_Pin_14

选中管脚14

0x4000

GPIO_Pin_15

选中管脚15

0x8000

GPIO_Pin_All

选中全部管脚

0xFFFF

【备注】:

如下寄存器可用本表:

IDR[输入数据]、ODR[输出数据]、BSRR[位设置/复位]、BRR[位复位]、LCKR[锁定管脚]。

GPIO_Speed:

用以设置选中管脚的速率。

Table184.给出了该参数可取的值

Table184.GPIO_Speed值

参数GPIO_Speed值

描述/GPIOx_CRL/H

定义值

端口意义

--

--

0

输入模式

GPIO_Speed_10MHz

最高输出速率10MHz

1

输出频率

GPIO_Speed_2MHz

最高输出速率2MHz

2

GPIO_Speed_50MHz

最高输出速率50MHz

3

GPIO_Mode:

用以设置选中管脚的工作状态。

Table185.给出了该参数可取的值

Table185.GPIO_Mode值

参数GPIO_Mode参数

描述/CRL/H

定义值

备注1

备注2

输入模式:

0b00

GPIO_Mode_AIN

模拟输入

0x00

AnalogInput

GPIO_Mode_IN_FLOATING

浮空输入

0x04

FloatingInput

直接输入[复位默认]

GPIO_Mode_IPD

下拉输入

0x28

Pull_DownInput

输入端与电源间接有电阻

GPIO_Mode_IPU

上拉输入

0x48

Pull_UpInput

输入端与地间接有电阻

输出模式:

>0b00

GPIO_Mode_Out_PP

推挽输出

0x10

Pull_PushOutput

PNP_C极和NPN_C极相连输出

GPIO_Mode_Out_OD

开漏输出

0x14

OpenDrainOutput

漏极不接电源,作为输出端

GPIO_Mode_AF_PP

复用推挽输出

0x18

AFPull_PushOutput

GPIO_Mode_AF_OD

复用开漏输出

0x1C

AFOpenDrainOutput

【注意】:

当某管脚设置为上拉或者下拉输入模式,使用寄存器Px_BSRR和PxBRRGPIO_Mode允许同时设置GPIO方向(输入/输出)和对应的输入/输出设置:

位[7:

4]对应GPIO方向,位[4:

0]对应配置。

GPIO方向有如下索

-GPIO输入模式=0x00

-GPIO输出模式=0x01

Table186.给出了所有GPIO_Mode的索引和编码

Table186.GPIO_Mode的索引和编码

GPIO方向

索引

模式

寄存器设置

模式代码

备注

GPIOInput

0x00

GPIO_Mode_AI

0x00

0x00

CNF=0b00

GPIO_Mode_IN_FLOATING

0x04

0x04

CNF=0b01[复位默认]

GPIO_Mode_IPD

0x08

0x28

CNF=0b10

0b11此时保留

GPIO_Mode_IPU

0x08

0x48

GPIOOutput

0x01

GPIO_Mode_Out_PP

0x00

0x10

CNF=0b00

GPIO_Mode_Out_OD

0x04

0x14

CNF=0b01

GPIO_Mode_AF_PP

0x08

0x18

CNF=0b10

GPIO_Mode_AF_OD

0x0C

0x1C

CNF=0b11

例:

/*ConfigurealltheGPIOAinInputFloatingmode*/

GPIO_InitTypeDefGPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA,&GPIO_InitStructure);

函数原型如下:

voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct)

{

u32currentmode=0x00,currentpin=0x00,pinpos=0x00,pos=0x00;

u32tmpreg=0x00,pinmask=0x00;

/*Checktheparameters*/

assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));

assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));

/*--------在使用本函数之前,必须对GPIO_TypeDef结构体的三个参数进行初始化【见上面实例代码】---------*/

/*----------------------------GPIOModeConfiguration-----------------------*/

currentmode=((u32)GPIO_InitStruct->GPIO_Mode)&((u32)0x0F);//I/O方式模式:

如上拉输入、开漏输出等。

if((((u32)GPIO_InitStruct->GPIO_Mode)&((u32)0x10))!

=0x00)//为输出模式,配置输出频率。

否则不管。

{//输出方式模式:

推挽、开漏、复用推挽、复用开漏。

/*Checktheparameters*/

assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));//输出频率模式:

10M为0x1;2M为0x2;50M为0x3。

/*Outputmode*/

currentmode

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1