STM32之GPIO

GPIO简介

GPIO是通用输入输出端口(General Purpose Input Output)的简称,简单来说就是STM32可控制的引脚,STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。STM32芯片的GPIO被分成很多组,每组有16个引脚,所有的GPIO引脚都有基本的输入输出功能。

  • 共有8种输入输出模式

  • 引脚电平:0V~3V,部分引脚可容忍5V(引脚定义中带FT的)

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

GPIO框图剖析

image.png

输入输出模式

输入模式

  1. 浮空输入:读取引脚电平,引脚悬空,则电平不确定(使用时接连续信号)
  2. 上拉输入:读取引脚电平,内接上拉电阻,悬空默认高电平
  3. 下拉输入:读取引脚电平,内接下拉电阻,悬空默认低电平
  4. 模拟输入:GPIO无效,引脚直接接入内部ADC

输出模式

  1. 开漏输出:可输出引脚电平,高电平为高阻态,低电平接VSS
  2. 推挽输出:可输出引脚电平,高电平为VDD,低电平接VSS
  3. 复用开漏输出:由片上外设控制,高电平为高阻态,低电平接VSS
  4. 复用推挽输出:由片上外设控制,高电平为VDD,低电平接VSS

使用模拟输入时会关闭其他数字输入,其他7个模式中全部输入功能都是有效的

输出速度:限制输出引脚的最大反转速度

输出模式下,有2MHz、10MHz、50MHz。

输出代码

1
2
3
4
5
6
7
8
9
GPIO_InitTypeDef  GPIO_InitStructure;					//定义初始化结构体

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PC端口时钟

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //配置端口,Pin13引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //配置模式,设置推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //配置速度,设置速度为50MHz

GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化GPIOA的参数为以上结构体

定义初始化结构体,只需要一次,配置模式、速度的语句相同时,可以只出现一次

完整使用

gpio.c

1
2
3
4
5
6
7
8
9
10
11
12
#include "gpio.h"

void GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}

gpio.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifndef __GPIO_H
#define __GPIO_H
#include "sys.h"

#define LED0 PCout(13) //宏定义
void GPIO_Init(void);

void GPIO1(void) //声明函数
{
GPIO_SetBits(GPIOC,GPIO_Pin_13);
}


#endif

函数中改变输出

GPIO_ResetBits(GPIOC,GPIO_Pin_13); //设置低电平

GPIO_SetBits(GPIOC,GPIO_Pin_13); //设置高电平

调用函数:GPIO1(void)

输入代码

1
2
3
4
5
6
7
8
   GPIO_InitTypeDef  GPIO_InitStructure;				   //定义初始化结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PC端口时钟

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //配置端口,Pin13引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //配置模式,设置下拉输入,IPU是上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //配置速度,输入下无用可不配置

GPIO_Init(GPIOB, &GPIO_InitStructure);

image.png

一般按键使用下接按键的方式,即上面两种接法,需配置为上拉输入模式

读取状态

1
2
GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_12)		//读取PC12输入状态
GPIO_ReadOutputDataBits(GPIOC,GPIO_Pin_12) //读取PC12的输出状态