-
GPIO概述
1.1 GPIO口作用
1.2 STM32的GPIO口
1.3 何谓寄存器
1.4 STM32的GPIO口特征 -
STM32的GPIO口框架
2.1 普通输出功能
2.2 普通输入功能
2.2 模拟功能
2.2 复用功能
GPIO概述
本文章以STM32F401RE芯片为例
GPIO口作用
单片机与外界进行数据交流的窗口
数据交流:收 发 IO:接收信息 发送信息
IO也可以模拟各种时序(协议)
STM32的GPIO口
1.命名与数量
端口号+管脚号
端口:A~H(根据不同的芯片范围不同的)
管脚号:0~15 6*16=96 (一个端口最多有16个管脚)
例如:PH0 PH1 接晶振
数量:81个 有些端口不是16个管脚
2. 输入输出的四大模式
GPIO有接收数据与发送数据的功能
输入模式:外界到单片机 四种模式
上拉输入:接收的数字量(0 1) 具有上拉功能 空闲高
下拉输入:接收的数字量(0 1) 具有下拉功能 空闲低
浮空输入:按键判断
模拟输入:输入的模拟量
输出模式:单片机到外界 四种模式
通用推挽输出 通用开漏输出 复用推挽输出 复用开漏输出
通用:IO直接向外输出0/1
复用:除了IO以外的其他片上外设做数据输出时
推挽:既能输出0也能输出1
开漏:只能输出0 不能输出1 因为P-MOS管一直处于高阻态
上拉电阻 防止电流倒灌 防止电流损坏器件
线与功能-----》与门
什么时候用开漏:一些通信协议(IIC 单总线…)
何谓寄存器
1. 什么是寄存器
8/16/32位的整型存储空间
2.对寄存器的操作
对寄存器操作,由图可知,每种寄存器都有在芯片内存当中都占有一部分空间,跟C语言当中一样,想访问操作寄存器当中的数据,都得用解地址符号得到它的起始地址,在对其中所需的器件,外设等进行位操作。
3. 常见的寄存器及作用
数据寄存器、状态寄存器、控制寄存器……
数据寄存器:数据的收发
状态寄存器:描述外设的工作状态
控制寄存器:控制外设的模式与工作状态
STM32的GPIO口特征
● 受控 I/O 多达 16 个
● 输出状态:推挽或开漏 + 上拉/下拉
● 从输出数据寄存器 (GPIOx_ODR) 或外设(复用功能输出)输出数据
● 可为每个 I/O 选择不同的速度
● 输入状态:浮空、上拉/下拉、模拟
● 将数据输入到输入数据寄存器 (GPIOx_IDR) 或外设(复用功能输入)
● 置位和复位寄存器 (GPIOx_BSRR),对 GPIOx_ODR 具有按位写权限
● 锁定机制 (GPIOx_LCKR),可冻结 I/O 配置
● 模拟功能
● 复用功能输入/输出选择寄存器(一个 I/O 最多可具有 16 个复用功能)
● 快速翻转,每次翻转最快只需要两个时钟周期
● 引脚复用非常灵活,允许将 I/O 引脚用作 GPIO 或多种外设功能中的一种
STM32的GPIO口框架
保护二极管可调节输入的电压保持电压在芯片要求电压范围内
普通输出功能
普通输入功能
模拟功能
模拟输入与输出不会经过数据寄存器,和TTL施密特触发器,对于模拟功能而言,需要接收发送的是模拟信号,而数据寄存器和TTL施密特触发器接收发送的是数字信号
复用功能
由GPIO口输出模式可知,复用功能是用于除IO口以外的片上外设做数据输出使用的,这里的IO只是作为这些外设与芯片外进行数据输入输出的桥梁,应该用它们自身的数据寄存器,不经过IO的数据寄存器
STM32的GPIO口相关寄存器
GPIO 端口模式寄存器 (GPIOx_MODER) (x = A…I)
GPIO 端口输出类型寄存器 (GPIOx_OTYPER) (x = A…I)
GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR) (x = A…I/)
GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR) (x = A…I/)
GPIO 端口输入数据寄存器 (GPIOx_IDR) (x = A…I)
GPIO 端口输出数据寄存器 (GPIOx_ODR) (x = A…I)
注:x为管脚号
看寄存器需要看什么:
复位值:初始值
功能说明
寄存器地址偏移问题
每个GPIO组之间相差1024字节(1k)
每个寄存器之间相差4字节(可查看芯片手册观察偏移值)
寄存器访问方法
直接地址访问
GPIOA_MODER 0x4002 0000
GPIOB_MODER 0x4002 0400
GPIOA_OTYPER 0x4002 0004
GPIOB_OTYPER 0x4002 0404
宏定义
#define GPIOA_MODER *(unsigned int *) 0x4002 0000
#define GPIOB_MODER *(unsigned int ) 0x4002 0400
#define GPIOA_OTYPER (unsigned int ) 0x4002 0004
#define GPIOB_OTYPER (unsigned int *) 0x4002 0404
ST官方封装宏
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000)
#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000)
#define PERIPH_BASE ((uint32_t)0x40000000)
GPIOA=0x40000000+0x00020000+0x0000=0x40020000