文章目录
- 1. GPIO的基本概念及寄存器介绍
-
- 1.1 GPIO接口介绍
- 1.2 GPIO功能复用
- 1.3 GPIO寄存器介绍
-
- 1.3.1 GPIO 端口模式寄存器 (GPIOx_MODER) (x = A..I)
- 1.3.2 GPIO 端口输出类型寄存器 (GPIOx_OTYPER) (x = A..I)
- 1.3.3 GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR) (x = A..I)
- 1.3.4 GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR) (x = A..I/)
- 1.3.5 GPIO 端口输入数据寄存器 (GPIOx_IDR) (x = A..I)
- 1.3.6 GPIO 端口输出数据寄存器 (GPIOx_ODR) (x = A..I)
- 1.3.7 GPIO 端口置位/复位寄存器 (GPIOx_BSRR) (x = A..I)
- 1.3.8 GPIO 端口配置锁定寄存器 (GPIOx_LCKR) (x = A..I)
- 1.3.9 GPIO 复用功能低位寄存器 (GPIOx_AFRL) (x = A..I)
- 1.3.10 GPIO 复用功能高位寄存器 (GPIOx_AFRH) (x = A..I)
- 2. 点灯
- 2.3 库函数实现
- 4. 按键
1. GPIO的基本概念及寄存器介绍
1.1 GPIO接口介绍
通用输入输出接口GPIO是嵌入式系统、单片机开发过程中最常用的接口,用户可以通过编程灵活的对接口进行控制,实现对电路板上LED、数码管、按键等常用设备控制驱动,也可以作为串口的数据收发管脚,或AD的接口等复用功能使用。因此其作用和功能是非常重要的。
上图(STM32F4x7-Datasheet的41页)片的 GPIO 被分成很多组,每组最多有 16个引脚,如型号为 STM32F407IGT6 型号的芯片有 GPIOA、GPIOB、GPIOC 至 GPIOI共 9组 GPIO,芯片一共 176 个引脚,其中 GPIO就占了一大部分,所有的 GPIO引脚都有基本的输入输出功能。
1.2 GPIO功能复用
GPIO除了输入和输出这两个功能还以后可能有很多其他功能,具体每个引脚有什么功能可以查看STM32F4x7-Datasheet的3.6节
以GA0为例,可以作为定时器的通道,也可以做串口的连接数据的管脚,一共有六种复用功能。那我们一个引脚可以最多有多少个功能呢?我们看到上图最上面从AF0到AF15一共最多有16个功能
1.3 GPIO寄存器介绍
我们要控制GPIO的本质就是控制GPIO里的寄存器。每一组GPIO端口都有一套寄存器去配置它自己的功能,首先介绍下GPIO常用寄存器
- 4个32位配置寄存器
GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR GPIOx_PUPDR - 2个32位数据寄存器
GPIOx_IDR 、GPIOx_ODR - 1 个32 位置位 / 复位寄存器
GPIOx_BSRR - 2 个 32 位复用功能配置寄存器
GPIOx_AFRH 、GPIOx_AFRL
1.3.1 GPIO 端口模式寄存器 (GPIOx_MODER) (x = A…I)
一共有32位,这个寄存器把32位分成16个组,每一个组控制一个引脚MODER0控制PA0,…,MODER15配置PA15
每一组有四种状态00、01、10、11,具体作用如上图所示
1.3.2 GPIO 端口输出类型寄存器 (GPIOx_OTYPER) (x = A…I)
0-15位有效,16-31位是保留,没用的。0-15位一位控制一个引脚。当GPIOx_MODER的某个引脚为01也就是输出模式的时候,这个寄存器控制那个引脚的输出模式
- 0:输出推挽
- 1:输出开漏
要了解这两种输出模式的区别,需要看GPIO工作原理图,这篇文章也很好的解释了两者的区别
简单说两者的比较
推挽输出 | 开漏输出 | |
---|---|---|
高电平驱动能力 | 强 | 由外部上拉电阻提供 |
低电平驱动能力 | 强 | 强 |
电平跳变速度 | 快 | 由外部上拉电阻决定,电阻越小,反应越快,功耗越大 |
线与功能 | 不支持 | 支持 |
电平转换 | 不支持 | 支持 |
1.3.3 GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR) (x = A…I)
当我们选择输出模式的时候,可以输出高低电平,高低电平的速度是可以选择的。低速节能高速能传输宽容度更高。要保证选择的速度要大于实际的最高速度,以免信号失真
1.3.4 GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR) (x = A…I/)
可以设置上拉和下拉电阻。上拉电阻和下拉电阻可以拿到一个稳定的电平状态。上拉电阻的话默认高电平,下拉电阻的话默认低电平
1.3.5 GPIO 端口输入数据寄存器 (GPIOx_IDR) (x = A…I)
在输入模式下,感知外部的高低电平,0-15分别控制16个引脚
1.3.6 GPIO 端口输出数据寄存器 (GPIOx_ODR) (x = A…I)
控制输出,默认是0x00000000,全都是低电平
1.3.7 GPIO 端口置位/复位寄存器 (GPIOx_BSRR) (x = A…I)
BSRR是用来辅助 GPIO 端口输出数据寄存器 (GPIOx_ODR)的。如果我们要对ODR的第15位进行置位我们可以通过ODR