一、基本使用流程
目录
1、使能对应时钟,RCC_APB2Periph_GPIOx(X:A~G)设置为ENABLE
对应函数:
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
2、对应pin脚初始化:
A、定义一个GPIO_InitTypeDef类型的结构体,可命名为GPIO_InitStructure(可自行定义);此结构体包含3个变量,分别是GPIO_Pin,GPIO_Speed,,GPIO_Mode ;
B、对上定义的结构体内的变量进行赋值,即选定IO口,输入输出的模式,上下拉功能,以及端口的输出速率;
C、使用初始化函数,初始化IO口:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
3、对IO口进行操作:
读操作:
A、当配置为普通 GPIO 输入时:可以使用如下两个函数读取IO口电平状态:
读取GPIOx内的一个IO口:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
读取所有GPIOx内所有的IO口:
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
PS:回读是16位的数据,15~0分别对应GPIOx_Pin_15~0;
B、当配置为普通 GPIO 输出时,也可以回读IO口的状态;不过不同的输出模式实际读取的数据位置有所不同,在开漏模式时,读取的是输入数据寄存器,从而得到I/O口状态;在推挽模式时,则是读取输出数据寄存器,可以得到最后一次写的值,函数如下:
读取GPIOx内的一个IO口:
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
读取所有GPIOx内所有的IO口:
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
写操作:
当配置为普通 GPIO 输出时:
同一GPIOx内,多个IO口设置输出高电平:
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
同一GPIOx内,多个IO口设置输出低电平:
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
只能操作单一IO口,输出电平由函数的BitVal确定:
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
对整个GPIOx进行操作,输出电平由函数的PortVal确定:
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
二、举例
1、输入:
选择GPIOA端口的PA1脚为输入脚,上拉输入模式:
void GPIO_PA1_Init()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//拓展:RCC_APB2Periph可以是RCC_APB2Periph_GPIOx任意组合,其中x可以为A~G,使用“|”隔开,如“RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB”
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //选择Pin1脚,
//拓展:GPIO_Pin_x,其中x可以为0~15,All,任意组合,使用“|”隔开,如“GPIO_Pin_1 | GPIO_Pin_15”
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //一般按最快的响应速度
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA1
}
在调用GPIO_PA1_Init()函数初始化后,可以使用函数读取PA1的电平状态,如:
u8 read_Val1;
u16 read_Val2;
read_Val1 = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1); //读取PA1的电平
read_Val2 = GPIO_ReadInputData(GPIOA) & GPIO_Pin_1; //读取PA1的电平
2、输出:
选择GPIOB端口的PB0脚为输出脚,推挽输出模式:
void GPIO_PB0_Init()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //选择Pin0脚,拓展:GPIO_Pin_x,其中x可以为0~15,All,任意组合
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //一般按最快的响应速度
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB0
}
在调用GPIO_PB0_Init()函数初始化后,可以使用函数控制PB0的输出状态,如:
GPIO_SetBits(GPIOB, GPIO_Pin_0);//PB0输出高电平
GPIO_ResetBits(GPIOB, GPIO_Pin_0);//PB0输出低电平
GPIO_WriteBit(GPIOB, GPIO_Pin_0, (BitAction) 0);//PB0输出低电平
GPIO_WriteBit(GPIOB, GPIO_Pin_0, (BitAction) 1);//PB0输出高电平
GPIO_WriteBit(GPIOB, GPIO_Pin_0, (BitAction) 1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_0));//PB0状态翻转