STM32F10xGPIO.docx
《STM32F10xGPIO.docx》由会员分享,可在线阅读,更多相关《STM32F10xGPIO.docx(47页珍藏版)》请在冰豆网上搜索。
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|