GPIO知识梳理(简单)

GPIO总结

GPIO工作方式

四种输入模式
输入浮空:多用于外部按键输入,io状态不确定完全由外部输入决定
输入上拉:IO口输入设定为高电平输入(1)
输入下拉:IO口输入设定为低电平输入(0)
模拟输入:应用ADC模拟输入

四种输出模式(都包含上拉下拉两种格式)
开漏输出:只可以输出强高低电平,高电平需要靠外部电阻拉高,适合做电流型驱动
开漏复用功能:复用功能的开漏输出GPIO_AF_OD——片内外设功能(TX1,MOSI,MISO,SCK,SS)
推挽式输出:可以输出强高低电平,连接数字器件
推挽式复用功能:复用功能的推挽输出GPIO_AF_PP ——片内外设功能(I2C的SCL,SDA)

四种最大输出速度
2MHZ
25MHZ
50MHZ
100MHZ

5V容忍:在支持5V容忍的io口可以在接入5V电压后仍正常工作

GPIO端口的寄存器

4个32位配置寄存器:
GPIO 端口 模式 寄存器 (GPIOx_MODER) 1
GPIO 端口 输出类型 寄存器 (GPIOx_OTYPER)2
GPIO 端口 输出速度 寄存器 (GPIOx_OSPEEDR)3
GPIO 端口 上拉/下拉 寄存器 (GPIOx_PUPDR)4
2个32位数据寄存器:
GPIO 端口 输入数据 寄存器 (GPIOx_IDR)
GPIO 端口 输出数据 寄存器 (GPIOx_ODR)

GPIO 端口 置位/复位 寄存器 (GPIOx_BSRR)
GPIO 端口 配置锁定 寄存器 (GPIOx_LCKR)
GPIO 复用功能 低位寄存器 (GPIOx_AFRL)
GPIO 复用功能 高位寄存器 (GPIOx_AFRH)

代码梳理

stm32f4xx_gpio.h

在这个头文件中,前面大部分都是宏定义,可以暂时不同太在意。
在这个头文件的最后是函数的定义

void GPIO_DeInit(GPIO_TypeDef* GPIOx);

/* Initialization and Configuration functions *********************************/
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);	//初始化函数,用来设置4个配置寄存器(可以看上面GPIO端口的寄存器),包括模式、类型、速度、上下拉。   
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

/* GPIO Read and Write functions **********************************************/
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);	//读取某个GPIO输入电平函数
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);	//读取输入某组GPIO电平函数
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);	//读取某个GPIO输出电平函数
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);	//读取某组GPIO输出电平函数
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);	//设置某个GPIO口输出为高电平的函数(可以调用一次设置多个GPIO口)
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);	//设置某个GPIO口输出为低电平输出电平函数(可以调用一次设置多组GPIO口)
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);	//设置某个GPIO口输出电平的函数(只能设置一个,可高可低)
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);	//设置某组GPIO口输出电平的函数(只能设置一组,可高可低)
void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

/* GPIO Alternate functions configuration function ****************************/
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF); 	//GPIO口复用
GPIO_Init 函数

完整函数名字:

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

函数定义中GPIO_TypeDef* GPIOx GPIO_InitTypeDef* GPIO_InitStruct 是结构体指针(c语言知识)。

在函数中有调用6个这样的函数

assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));
assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
assert_param(IS_GPIO_PUPD(GPIO_InitStruct->GPIO_PuPd));
//下面这两个在函数中后面一点
assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));
assert_param(IS_GPIO_OTYPE(GPIO_InitStruct->GPIO_OType));

其中assert_param();是进行有效性判断,我们可以通过这六行函数得知我们可以设定的值的范围是哪些。
我们可以通过对IS_GPIO_xx进行宏定义的有效性查看(在调用GPIO_Init();函数时填入怎么样的入口参数)。
通过查看结构体 GPIO_InitTypeDef的定义,可以得知结构体有哪些参数可以改变。

使用范例:

GPIO_InitTypeDef  GPIO_InitStructure;	//定义传入的结构体

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟。想正常运行需要时钟配置但与  GPIO_Init需要传入的参数无关。  

//GPIOF9初始化设置,设置结构题成员变量
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIO

  1. 00:输入(复位状态)
    01:通用输出模式
    10:复用功能模式
    11:模拟模式 ↩︎

  2. 0:输出推挽(复位状态)
    1:输出开漏 ↩︎

  3. 00:2MHz(低速)
    01:25MHz(中速)
    10:50MHz(快速)
    11:30pF时为100MHz(高速)(15pF时为80MHz输出(最大速度)) ↩︎

  4. 00:无上拉或下拉
    01:上拉
    10:下拉
    11:保留 ↩︎

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值