GPIO,全称为通用输入输出接口(General-Purpose Input/Output),是嵌入式系统中常见的接口之一。它提供了一种灵活的方式来连接和控制外部设备和电路,使得CPU可以读取这些设备的状态、向其发送控制信号,或者与其进行数据交换。

可配置八种输入输出模式:

  1. GPIO浮空输入_IN_FLOATING模式
  2. GPIO带上拉输入_IPU 模式
  3. GPIO带下拉输入_IPD 模式
  4. GPIO模拟输入_AIN 模式
  5. GPIO开漏输出_OUT_OD 模式
  6. GPIO推挽输出_OUT_PP模式
  7. GPIO开漏复用输出_AF_OD模式
  8. GPIO推挽复用输出_AF_PP模式

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

输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器模拟通信协议输出时序等
输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等

                

可以看到GPIO全部挂载在APB2总线上,且仅在低16位有对应的端口

GPIO位结构

 输入模式(图13中上方虚线框块:输入驱动器

        浮空输入:数字输入,上下开关都断开

        上拉输入:数字输入,上开关导通,下开关断开;电阻阻值较大,弱上拉

        下拉输入:数字输入,上开关断开,下开关导通;电阻阻值较大,弱下拉

        模拟输入:模拟输入,施密特触发器无效状态,一般在ADC时使用

其中肖特基触发器貌似应该是施密特触发器,故经过施密特触发器整形后是波形作为数字量,可直接斜入输入数据寄存器,而模拟输入接收模拟量,故接到触发器前

输出模式 (上方虚线框块:输出驱动器(均为数字输出

        推挽输出:P-MOS和N-MOS均有效;数据寄存器为1时,上通下断,输出高电平;为0反之。高低电平均有较强的驱动能力,故该模式也叫强推输出模式

        开漏输出:P-MOS无效,N-MOS工作;数据寄存器为1时,下管断开,为高阻模式

        关闭状态:输出关闭,端口电平由外部信号来控制

        复用开漏输出:由片上外设控制,高电平为高阻态,低电平接VSS

        复用推挽输出:由片上外设控制,高电平接VDD,低电平接VSS

 位设置/清除寄存器:用于单独操作输出数据寄存器的某一位,而不影响其他位

GPIO寄存器

端口配置寄存器

每个端口由四位进行配置,故配置寄存器分为端口配置低寄存器(GPIOx_CRL)端口配置高寄存器(GPIOx_CRH),配置方式:

端口输入寄存器(GPIOx_IDR)

低16位对应16个引脚,高16位没有使用

端口输出寄存器(GPIOx_ODR)

低16位对应16个引脚,高16位没有使用

端口位设置/清除寄存器(GPIOx_BSRR)

高16位用于进行位清除,低16位用于位设置

端口位清除寄存器(GPIOx_BRR) 

低16位用于位清除,与端口位设置/清除寄存器(GPIOx_BSRR)的高16位作用相同,用于方便操作

端口配置锁定寄存器(GPIOx_LCKR) 

用来锁定端口位的配置

GPIO初始化配置

步骤1:使用RCC开启GPIO时钟

void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);

        以上函数为RCC常用函数,分别用于使能或失能AHBP、APB2、APB1外设时钟

步骤2:使用GPIO_Init()函数初始化GPIO

void GPIO_DeInit(GPIO_TypeDef* GPIOx);
void GPIO_AFIODeInit(void);
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
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);

        GPIO_DeInit()  用于复位指定的GPIO外设

        GPIO_AFIODeInit()  复位AFIO外设

        GPIO_Init()  用结构体的参数初始化GPIO口

        GPIO_StructInit()  把结构体变量赋默认值

步骤3:使用输出或输入函数控制GPIO口

         其余Read和Set、Reset函数用于控制GPIO读写

示例

	//用于整点原子精英版点亮LED灯

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能APB2
	
	GPIO_InitTypeDef GPIO_InitStructure;                 //定义GPIO_InitTypeDef结构体,用于初始化
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //推挽输出模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;            //PB5
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //速度50MHz
	GPIO_Init(GPIOB, &GPIO_InitStructure);               //初始化

	GPIO_ResetBits(GPIOB, GPIO_Pin_5);                   //低电平点亮

 

作者:陽临

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 GPIO篇

发表回复