一、什么是GPIO?
GPIO(通用输入输出接口):
1.GPIO 功能概述
GPIO 是通用输入/输出(General Purpose I/O)的简称,既能当输入口使用,又能当输出口使用。端口,就是元器件上的一个引脚,可以通过软件去控制。
在大多数的时候,我们将IO口可以看为一个电子开关,通过向IO寄存器中写入相应的值,其输出的电平就随着寄存器的变化而变化,这是IO口的输出,在大多数的单片机中,需要去配置单片机的IO模式,是输入还是输出。
即需要预先初始化,配置GPIO的参数,再去使用GPIO。在51单片机中不支持这样的操作,即不能配置GPIO的参数,但在32我们就必须去配置GPIO从而完成某种功能。
输出功能 :继电器、 LED、蜂鸣器等的控制
输入功能 :传感器状态、高低电平等信息的读取
复用功能 :片内外设的对外接口
时序模拟 :模拟 SPI、I2C 和 UART 等常用接口的时序
2.端口和引脚
(1)端口(PORT): 独立的外设子模块,包括多个引脚,通过多个硬件寄存器控制引脚。
GPIO 模块由端口 GPIOA、GPIOB、GPIOC 等多个独立的子模块构成。
例如:端口 GPIOA 包括 PA0 ~ PA15 这 16 个引脚,通过 10 个硬件寄存器控制引脚工作。
(2)引脚(PIN): 对应微控制器的一个管脚,归属于端口,由端口寄存器的对应位控制。
PA0,属于端口 GPIOA,输出电平由端口 GPIOA 的输出数据寄存器 GPIOA_ODR 的第 0 位决定。
3.GPIO电路
- 注: VDD_FT 对5V容忍I/O脚是特殊的,它与VDD不同
4.GPIO的8种工作模式
- 输入浮空:输入用,完全浮空,IO状态不定,由外部环境决定
- 输入上拉:输入用 ,内部下拉,IO默认是高电平
- 输入下拉:空闲时,IO默认是低电平
- 模拟功能:专门用于模拟信号的输入输出,如ADC/DAC
- 开漏输出:不能输出高电平,必须由外部或内部上拉电阻才能输出高电平,如软件IIC的SDL、SCL等
- 推挽输出:驱动能力强,25ma 通用输出
- 开漏式复用功能: 可输出高低电平,片上外设功能(硬件IIC的SDL、SCL等)
- 推挽式复用功能:可输出高低电平,驱动力强,由其他外设控制输出
二、GPIO配置步骤
1、点亮LED代码演示
#include "stm32f10x.h" // Device header
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能时钟
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init (GPIOA ,&GPIO_InitStruct);
GPIO_ResetBits(GPIOA ,GPIO_Pin_0);
while(1)
{
}
}
2、GPIO配置步骤
(1)使能时钟(使用RCC开启GPIO的时钟)
以上三个是最为常用的外设时钟控制
RCC AHB外设时钟控制
RCC APB2外设时钟控制
RCC APB1外设时钟控制
在点灯代码中我们使用的是 :RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE)
右键点击就可以跳转到rcc.c文件里面的函数定义
第一个参数就是选择哪个外设(蓝笔),第二个参数就是使能或失能(红笔)
(2)使用GPIO_Init函数初始化GPIO
GPIO_Init (GPIOA ,&GPIO_InitStruct)
这个函数的作用是通过结构体的参数(GPIO_InitStruct)来定义GPIO口(GPIOA);
所以接下来我们需要定义一个结构体变量,然后给结构体赋值,最后调用这个函数,也就是代码里面的:GPIO_InitTypeDef GPIO_InitStruct;其中GPIO_InsStruct为结构体的名字。
上图中这四个为GPIO的读取函数,紧接着的下面的四个为GPIO的写入函数;通过这8个函数就可以实现对GPIO口的读写。GPIO_ResetBits(GPIOA ,GPIO_Pin_0);这里就是对IOtg
然后我们要复制结构体的名字通过点(.)把它的子成员引出,也就是
GPIO_InitStruct.GPIO_Mode
GPIO_InitStruct.GPIO_Pin
GPIO_InitStruct.GPIO_Speed
然后进行赋值:GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
怎么样进行赋值呢?还是老样子先跳转到函数定义处:
然后
进行模式选择;其他的速度以及引脚也是同理进行操作选择复制即可。