【STM32】学习笔记:GPIO输入输出

目录

1、GPIO简介

2、GPIO基本结构

3、GPIO初始化函数

(1) RCC_APB2PeriphClockCmd()

(2) GPIO_InitTypeDef

(3) GPIO_Init()

(4)GPIO初始化例程

4、GPIO输出函数

(1) GPIO_SetBits()

(2) GPIO_ResetBits()

(3) GPIO_WriteBit()

(4) GPIO_Write()

5、GPIO读取函数

(1) GPIO_ReadInputData()

(2) GPIO_ReadInputDataBit()

(3) GPIO_ReadOutputData()

(4) GPIO_ReadOutputDataBit()


1、GPIO简介

  • GPIO(General Purpose InPut Output)通用输入输出口

  • 可配置8种输入输出模式

  • 引脚电平:0~3.3V,部分引脚可容忍5V

  • 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等

  • 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等

2、GPIO基本结构

3、GPIO初始化函数

(1) RCC_APB2PeriphClockCmd()

启动GPIO时钟使能

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

(2) GPIO_InitTypeDef

定义GPIO结构体变量,包含GPIO_Pin、GPIO_Speed、GPIO_Mode三个变量

typedef struct
{
  uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.
                                      This parameter can be any value of @ref GPIO_pins_define */

  GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.
                                      This parameter can be a value of @ref GPIOSpeed_TypeDef */

  GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.
                                      This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;
  • GPIO_Pin:定义GPIO输出引脚,如GPIO_Pin_0

  • GPIO_Speed:定义GPIO输出最大翻转速度,分别为GPIO_Speed_10MHz、GPIO_Speed_2MHz、GPIO_Speed_50MHz

  • GPIO_Mode:定义GPIO输出模式,有8种模式

    常量名作用
    GPIO_Mode_AIN模拟输入
    GPIO_Mode_IN_FLOATING浮空输入,默认电平浮空
    GPIO_Mode_IPD下拉输入,默认低电平
    GPIO_Mode_IPU上拉输入,默认高电平
    GPIO_Mode_Out_OD开漏输出,强低电平驱动
    GPIO_Mode_Out_PP推挽输出,强高低电平驱动
    GPIO_Mode_AF_OD复用开漏
    GPIO_Mode_AF_PP复用推挽

(3) GPIO_Init()

GPIO结构体初始化,关联GPIOx和引脚GPIO_Pin_x

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

(4)GPIO初始化例程

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);    //外设总线时钟使能
    
GPIO_InitTypeDef GPIO_InitStruct;   //定义GPIO变量结构体
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;    //选定2号引脚
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; //选择推挽模式
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;    //选择GPIO翻转速度
​
GPIO_Init(GPIOA,&GPIO_InitStruct);  //初始化,关联GPIOA端口

4、GPIO输出函数

(1) GPIO_SetBits()

置位,使指定的GPIOx端口的GPIO_Pin置为高位

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

例如,指定GPIOA端口的2号引脚为高电平(需要提前初始化配置)

GPIO_SetBits(GPIOA, GPIO_Pin_2);

(2) GPIO_ResetBits()

复位,使指定的GPIOx端口的GPIO_Pin置为低位

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

例如,指定GPIOA端口的2号引脚为低电平

GPIO_ResetBits(GPIOA, GPIO_Pin_2);

(3) GPIO_WriteBit()

写位,使指定的GPIOx端口的GPIO_Pin置为指定位

void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)

例如,指定GPIOA端口的2号引脚为高电平

GPIO_ResetBits(GPIOA, GPIO_Pin_2,1);

(4) GPIO_Write()

写端口,使指定的GPIOx端口置为指定位

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)

例如,指定GPIOA端口的2号引脚为高电平(对应引脚需提前初始化配置)

GPIO_Write(GPIOA, 0x0004);    //0000 0000 0000 0100

5、GPIO读取函数

这里在初始时GPIO的工作模式要选择输入模式,有模拟输入、浮空输入、上拉输入和下拉输入

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);    //外设总线时钟使能
    
GPIO_InitTypeDef GPIO_InitStruct;   //定义GPIO变量结构体
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;    //选定2号引脚
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;    //选择上拉输入模式
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;    //选择GPIO翻转速度
​
GPIO_Init(GPIOA,&GPIO_InitStruct);  //初始化,关联GPIOA端口

(1) GPIO_ReadInputData()

读出指定端口输入的数字量,读取的值为uint16_t

uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)

例如,读取端口GPIOA输入的值

data = GPIO_ReadInputData(GPIOA);

(2) GPIO_ReadInputDataBit()

读出指定端口引脚输入的数字量,读取的值为uint8_t型(通常可视为仅有0和1)

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

例如,读取端口GPIOA端口中的2号引脚输入的值

data = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2);

(3) GPIO_ReadOutputData()

读出指定端口输出的值,该函数常用于输出模式下,用于查看当前引脚的输出情况,由于读取的是输出数据寄存器ODR,所以不受输入的影响,读取的值为uint8_t

uint8_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

例如,读取端口GPIOA端口输出的值

data = GPIO_ReadOutputData(GPIOA,GPIO_Pin_2);

(4) GPIO_ReadOutputDataBit()

读出指定端口引脚输出的值,读取的值为uint8_t

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

例如,读取端口GPIOA端口中的2号引脚输出的值

data = GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2);
  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值