STM32F10xGPIO.docx
《STM32F10xGPIO.docx》由会员分享,可在线阅读,更多相关《STM32F10xGPIO.docx(33页珍藏版)》请在冰豆网上搜索。
![STM32F10xGPIO.docx](https://file1.bdocx.com/fileroot1/2023-4/16/ede41064-dccb-4090-b746-e83395cbba7b/ede41064-dccb-4090-b746-e83395cbba7b1.gif)
STM32F10xGPIO
GPIO寄存器结构.............................................................120
GPIO库函数.................................................................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驱动可以用作多个用途,包括管脚设置,单位设置/重置,锁定机制,从端口管脚读入或者向端口管
脚写入数据。
SectionGPIO寄存器结构描述了固件函数库所使用的数据结构,Section固件库函数介绍了函数库里的所有函数。
GPIO寄存器结构
GPIO寄存器结构,GPIO_TypeDef和AFIO_TypeDef,在文件“中定义如下:
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)0x)
#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
GPIO库函数
Table179.例举了GPIO的库函数【见首页】
函数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);函数GPIO_AFIODeInit
函数名
GPIO_AFIODeInit
函数原形
voidGPIO_AFIODeInit(void)
功能描述
将复用功能(重映射事件控制和EXTI设置)重设为缺省值
输入参数
无
输出参数
无
返回值
无
先决条件
无
被调用函数
RCC_APB2PeriphResetCmd()
例:
/*ResetstheAlternatefunctionsregisterstotheirdefaultresetvalues*/
GPIO_AFIODeInit();
函数原型如下:
voidGPIO_AFIODeInit(void)
{
RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO,ENABLE);函数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定义于文件“”:
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_Pin_All;
=GPIO_Speed_10MHz;
=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);函数GPIO_StructInit
函数名
GPIO_StructInit
函数原形
voidGPIO_StructInit(GPIO_InitTypeDef*GPIO_InitStruct)
功能描述
把GPIO_InitStruct中的每一个参数按缺省值填入
输入参数
GPIO_InitStruct:
指向结构GPIO_InitTypeDef的指针,待初始化
输出参数
无
返回值
无
先决条件
无
被调用函数
无
Table188.给出了GPIO_InitStruct各个成员的缺省值
Table188.GPIO_InitStruct缺省值
成员
缺省值
定义值
GPIO_Pin
GPIO_Pin_All
0xFFFF
GPIO_Speed
GPIO_Speed_2MHz
0x2
GPIO_Mode
GPIO_Mode_IN_FLOATING
0x04
例:
/*InitializetheGPIOInitStructureparameters*/
GPIO_InitTypeDefGPIO_InitStructure;
GPIO_StructInit(&GPIO_InitStructure);
函数原型如下:
voidGPIO_StructInit(GPIO_InitTypeDef*GPIO_InitStruct)
{
/*ResetGPIOinitstructureparametersvalues*/
GPIO_InitStruct->GPIO_Pin=GPIO_Pin_All;
GPIO_InitStruct->GPIO_Speed=GPIO_Speed_2MHz;函数GPIO_ReadInputDataBit
函数名
GPIO_ReadInputDataBit
函数原形
u8GPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,u16GPIO_Pin)
功能描述
读取指定端口管脚的输入
输入参数1
GPIOx:
x可以是A,B,C,D,E,来选择GPIO外设
输入参数2
GPIO_Pin:
待读取的端口位
输出参数
无
返回值
输入端口管脚值
先决条件
无
被调用函数
无
例:
/*ReadstheseventhpinoftheGPIOBandstoreitinReadValuevariable*/
u8ReadValue;
ReadValue=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7);函数GPIO_ReadInputData
函数名
GPIO_ReadInputData
函数原形
u16GPIO_ReadInputData(GPIO_TypeDef*GPIOx)
功能描述
读取指定的GPIO端口输入
输入参数
GPIOx:
x可以是A,B,C,D,E,来选择GPIO外设
输出参数
无
返回值
GPIO输入数据端口值
先决条件
无
被调用函数
无
例:
/*ReadtheGPIOCinputdataportandstoreitinReadValuevariable*/
u16ReadValue;
ReadValue=GPIO_ReadInputData(GPIOC);
函数原型如下:
u16GPIO_ReadInputData(GPIO_TypeDef*GPIOx)
{
/*Checktheparameters*/
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
return((u16)GPIOx->IDR);函数GPIO_ReadOutputDataBit
函数名
GPIO_ReadOutputDataBit
函数原形
u8GPIO_ReadOutputDataBit(GPIO_TypeDef*GPIOx,u16GPIO_Pin)
功能描述
读取指定端口管脚的输出
输入参数1
GPIOx:
x可以是A,B,C,D,E,来选择GPIO外设
输入参数2
GPIO_Pin:
待读取的端口位
输出参数
无
返回值
输出端口管脚值
先决条件
无
被调用函数
无
例:
/*Readsth