目录
配置GPIO
配置GPIO一共分为四步
1.开外设时钟
想开启一个外设的时钟就需要知道它受哪个总线控制,那我们可以参考STM32F4xx参考手册,其中的2.3节为存储器映射,表2为寄存器边界地址,通过它我们可以知道GPIO外设全部挂载在AHB1总线上。代码如下;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
2.定义外设初始化结构体
一般调用外设初始化函数中,需要先定义描述该外设配置参数的结构体,然后由初始化函数来根据结构体的变量参数配置外设,GPIO的结构体就可以在stm32f4xx_gpio.h中找到,名为GPIO_InitTypeDef
3.配置结构体成员
其中包含5个结构体变量
GPIO_Pin:需要配置的引脚,如果想同时配置多个引脚直接把变量直接用或连接即可
GPIO_Mode:模式选择,F4共有4个模式
GPIO_Mode_IN 输入模式
GPIO_Mode_OUT 输出模式
GPIO_Mode_AF 复用模式
GPIO_Mode_AN 模拟模式
GPIO_Speed:引脚的翻转速度——仅输出模式配置
GPIO_OType:输出类型,共有两个选项——仅输出模式配置
GPIO_OType_PP 推挽输出
GPIO_OType_OD 开漏输出
GPIO_PuPd:上下拉选项
GPIO_PuPd_NOPULL 浮空
GPIO_PuPd_UP 上拉
GPIO_PuPd_DOWN 下拉
4.调用初始化函数
标准库中,关于一个外设的所有函数一般都在其.h文件最后面
GPIO的初始化函数则为 GPIO_Init 第一个参数为GPIO选项,第二个参数为结构体指针
GPIO函数
函数声明
/* 将GPIO配置设置为默认复位状态 ****/
void GPIO_DeInit(GPIO_TypeDef* GPIOx);
/* 初始化和配置功能*/
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
/* GPIO读写功能*/
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
/* GPIO 备用功能配置功能*/
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF);
函数解释
GPIO_DeInit :把GPIO配置为一个默认设置
GPIO_Init:按结构体初始化GPIO
GPIO_StructInit:把GPIO的结构体配置为默认设置
GPIO_PinLockConfig:锁住GPIO引脚配置寄存器
GPIO_ReadInputDataBit 这四个函数为读取输入端口或输出端口的电平
GPIO_ReadInputData 后缀有Bit的为一次读一位,没有的一次读16位
GPIO_ReadOutputDataBit
GPIO_ReadOutputData
GPIO_SetBits:使指定端口置位为1
GPIO_ResetBits:使指定端口复位为0
GPIO_WriteBit:配置一个端口高低电平
GPIO_Write:配置16个端口高低电平
GPIO_ToggleBits:翻转指定端口
GPIO_PinAFConfig:配置端口的复用功能
应用例子
led
void LED_GPIO_Init(void)
{
/**
* 外设初始化步骤:
* 1.开外设时钟
* 2.定义外设初始化结构体
* 3.配置结构体成员
* 4.调用初始化函数
*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
GPIO_InitTypeDef GPIO_Init_Structure;
GPIO_Init_Structure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init_Structure.GPIO_OType = GPIO_OType_PP;
GPIO_Init_Structure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_9;
GPIO_Init_Structure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init_Structure.GPIO_Speed = GPIO_Low_Speed;
GPIO_Init(GPIOF,&GPIO_Init_Structure);
}
按键及其检测
void Key_GPIO_Init(void)
{
/**
* 外设初始化步骤:
* 1.开外设时钟
* 2.定义外设初始化结构体
* 3.配置结构体成员
* 4.调用初始化函数
*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
GPIO_InitTypeDef GPIO_Init_Structure;
GPIO_Init_Structure.GPIO_Mode = GPIO_Mode_IN;
GPIO_Init_Structure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
GPIO_Init_Structure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOE,&GPIO_Init_Structure);
}
uint8_t Key_Scan(GPIO_TypeDef *GPIOx,uint16_t GPIO_pin)
{
if(GPIO_ReadInputDataBit(GPIOx,GPIO_pin) == KEY_ON)
{
Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOx,GPIO_pin) == KEY_ON);
Delay_ms(20);
return KEY_ON;
}
if(GPIO_ReadInputDataBit(GPIOx,GPIO_pin) == KEY_OFF)
{
Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOx,GPIO_pin) == KEY_OFF);
Delay_ms(20);
return KEY_OFF;
}
}