文章目录

前言
一、GPIO口整体介绍
GPIO简介
GPIO的结构
GPIO的8种工作方式
GPIO的4种输入方式
浮空输入
上拉输入
下拉输入
模拟输入
GPIO的4种输出方式
开漏输出
推挽输出
复用开漏输出
复用推挽输出
二、GPIO的库函数以及初始化方法
GPIO库函数
初始化GPIO

  1. 使用RCC开启GPIO的时钟
  2. 使用GPIO_Init()函数初始化GPIO
  3. 使用输出或输入的函数控制GPIO

三、总结

前言

最近开始了STM32的学习,已经学习了一段时间了,来对学习过的内容进行一个总结,这篇来对STM32的GPIO,即STM32里最常用的地方,通用输入输出口做一个总结,把自己的经验和遇到的问题分享给大家。


一、GPIO口整体介绍

GPIO简介

  • GPIO是通用输入输出口,可以对输入/输出数据进行缓冲、隔离或者锁存。就拿STMF103C8T6来说,可用的GPIO口有GPIOA、GPIOB、GPIOC等GPIO口,每个端口的编号为15-0。相应的端口号就是GPIOA0、GPIOA1…GPIO15.
  • 每个引脚都有许多功能,最基本的输入/输出功能可以驱动LED、产生PWM、驱动蜂鸣器等。引脚配置为输入模式时,具有外部中断功能。引脚可以重映射,复用的端口具有GPIO功能。例如让PA15、PA14、PA15这三个引脚来当作通用输入输出口来使用,即GPIO口。
  • 可以配置为8种输入输出模式
  • GPIO口的引脚电平:0-3.3V,部分引脚可以容忍5v

GPIO的结构

每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL, GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)组成。
下方为GPIO端口位结构

GPIO的8种工作方式

分别为上拉输入、下拉输入、模拟输入、浮空输入、开漏输出、推挽输出、复用开漏输出、复用推挽输出。不同的模式下IO口具有不同的驱动能力和不同的功能。我们来通过IO口的位结构来说明这八种方式。

GPIO的4种输入方式

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

主要由TTL肖特基触发器、带开关的上拉电阻和下拉电阻组成,输入信号同时送给输入数据寄存器也送给片上外设,GPIO输入模式下没有复用功能。

浮空输入

浮空输入就是GPIO内部既无上拉电阻也无下拉电阻。GPIO内部的上拉电阻和下拉电阻开关都断开。该模式下,引脚默认输入位高阻态,即浮空,不确定。IO口电平由外部输入信号决定。

上拉输入
上拉输入就是GPIO内部有上拉电阻。GPIO内部的上拉电阻开关打开,下拉电阻断开,该模式下,引脚上拉,当没有外部输入时默认输入高电平.

下拉输入

下拉输入就是GPIO内部有下拉电阻。GPIO内部的下拉电阻开关打开,上拉电阻断开,该模式下,引脚下拉,当没有外部输入时默认输入低电平.

模拟输入
GPIO口无效,输入输出寄存器全部失效,引脚直接接入内部的ADC。用于外部模拟信号的输入。

GPIO的4种输出方式

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

开漏输出
开漏输出模式下,P-MOS无效,N-MOS有效。
开漏输出模式下,只有低电平才有驱动能力,高电平无驱动能力,引脚只能输出低电平,可以作为通信协议的驱动方式比如I2C通信的引脚,使用开漏输出模式。

  • 当输出数据寄存器写1,N-MOS断开,输出控制相当于断开,也就是高阻态
  • 当输出数据寄存器写0,N-MOS导通,输出控制相当于接VSS,输出为低电平

推挽输出
推挽输出模式下,P-MOS和N-MOS均有效。
推挽输出模式下,STM32对IO口具有绝对的控制权,引脚可以输出高低电平。

  • 当输出数据寄存器写1,上管导通,下管断开,输出控制接到VDD,输出为高电平
  • 当输出数据寄存器写0,上管断开,下管导通,输出控制接到VSS,输出为低电平

复用开漏输出
这种模式下,引脚不再是普通的IO口,不仅具有开漏输出的特点,还具有片内外设的功能。例如IO口用作USART的数据发送端TX或者接收端RX时,使用该模式。
复用推挽输出

这种模式下,引脚不再是普通的IO口,不仅具有推挽输出的特点,还具有片内外设的功能。例如IO口用作I2C的SCL或者SDA时,使用该模式。

二、GPIO的库函数以及初始化方法

GPIO库函数

红框里的为较为常用的几个库函数

初始化GPIO

1. 使用RCC开启GPIO的时钟

这里最常用的就是AHB、APB2、APB1外设时钟控制
而GPIO口时钟控制一般在APB2

这个时候我们根据下方的库函数可以开启GPIO的时钟。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   //使用RCC开启GPIOA的时钟
2. 使用GPIO_Init()函数初始化GPIO



下方采用的是GPIOA0初始化,采用的模式为推挽输出

    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;  //推免输出
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; 
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);  //GPIOB初始化 
3. 使用输出或输入的函数控制GPIO

就是采用以下六个函数

 	//设置GPIO管脚的高低电平
    GPIO_SetBits(GPIOA, GPIO_Pin_0);  //PA0口置高电平
    GPIO_ResetBits(GPIOA, GPIO_Pin_0);  //PA0口置低电平
    GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);   //Bit_RESET 清除端口值,也就是置低电平
   	GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);     //Bit_SET  设置端口值 也就是置高电平
   	GPIO_Write(GPIOA,~0x0001);   //0000 0000 0000 0001  给端口寄存器相应位置值

通过以上三步走,GPIO口就可以实现输入/输出的功能,相应的IO口被设置为高低电平。

三、总结

GPIO口本质上就和51单片机的IO口差不多,但是GPIO口的功能更多,有八种模式可以选择

在初始化GPIO口时,可以选择输入输出模式,当需要IO口输出高低电平时,使用输出模式,当需要读取IO口的高低电平时,使用输入模式。

还有就是对输出寄存器写1,对应的引脚输出为高电平,写0,对应的引脚输出为低电平。对输入寄存器读取为1,证明对应的端口是高电平,读取为0,证明对应的端口是低电平。

列举几种常用的外设对应的方式,LED可以使用推挽输出或者是开漏输出来驱动,按键一般配置为上拉输入或者是下拉输入模式。传感器模块也可以选择上拉输入或者是浮空输入。

但是要根据不同的情况选择不同的模式,来实现相应的功能。

再者,GPIO口的配置,一般都是三步走,开启时钟,GPIO初始化,对相应的IO口置高低电平。

最后行文仓促,如有错误,欢迎指正。