第2章 STM32-GPIO
2.1 GPIO的概述
2.1.1 什么是GPIO?GPIO的作用?
-
GPIO:通用输入输出控制器。
-
GPIO的作用:芯片用来控制或采集外部器件的相关信息
2.1.2 GPIO的特征
- 输入状态:浮空、上拉/下拉、模拟
- 输出状态:推挽或开漏 + 上拉、下拉
- 将数据输入到输入数据寄存器 (GPIOx_IDR) 或外设(复用功能输入)
- 从输出数据寄存器 (GPIOx_ODR) 或外设(复用功能输出)输出数据
- 置位和复位寄存器 (GPIOx_BSRR),对 GPIOx_ODR 具有按位写权限
- 模拟功能
- 复用功能输入 /输出选择寄存器(一个 I/O 最多可具有 16 个复用功能)
- 输入数据寄存器 (GPIOx_IDR) 每隔 1 个 AHB1 时钟周期捕获一次 I/O 引脚的数据。
- 所有 GPIO 引脚都具有内部弱上拉及下拉电阻,可根据 GPIOx_PUPDR 寄存器中的值来打开 /关闭。
2.1.3 GPIO 功能描述
- 输入浮空
- 输入上拉
- 输入下拉
- 模拟功能
- 具有上拉或下拉功能的开漏输出
- 具有上拉或下拉功能的推挽输出
- 具有上拉或下拉功能的复用功能推挽
- 具有上拉或下拉功能的复用功能开漏
注意:每个 I/O 端口位均可*编程,但 I/O 端口寄存器必须按 32 位字、半字或字节进行访问
2.1.4 5V容忍原理
2.1.5 I/O 引脚复用器和映射
微控制器 I/O 引脚通过一个复用器连接到板载外设 /模块,该复用器一次仅允许一个外设的复用功能 (AF) 连接到 I/O 引脚
- <1>完成复位后,所有 I/O 都会连接到系统的复用功能 0 (AF0)。
- <2>外设的复用功能映射到 AF1 至 AF13。
- <3>Cortex™-M4F EVENTOUT 映射到 AF15
2.2 GPIO的框架
2.2.1 输入配置
- 输出缓冲器被关闭
- 施密特触发器输入被打开
- 根据 GPIOx_PUPDR 寄存器中的值决定是否打开上拉和下拉电阻
- 输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
- 对输入数据寄存器的读访问可获取 I/O 状态
2.2.2 输出配置
- 输出缓冲器被打开:
- 开漏模式:输出寄存器中的“0”可** N-MOS,而输出寄存器中的“1 ”会使端口保持高组态 (Hi-Z)(P-MOS 始终不**)。
- 推挽模式:输出寄存器中的“0”可** N-MOS,而输出寄存器中的“1 ”可**P-MOS。
- 施密特触发器输入被打开
- 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻
- 输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
- 对输入数据寄存器的读访问可获取 I/O 状态
- 对输出数据寄存器的读访问可获取最后的写入值
2.2.3 复用功能
-
可将输出缓冲器配置为开漏或推挽
-
输出缓冲器由来自外设的信号驱动(发送器使能和数据)
-
施密特触发器输入被打开
-
根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻
-
输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
-
对输入数据寄存器的读访问可获取 I/O 状态
复用与通用的对比:
2.2.4 模拟功能
- 输出缓冲器被禁止。
- 施密特触发器输入停用, I/O 引脚的每个模拟输入的功耗变为零。施密特触发器的输出被 强制处理为恒定值 (0)。
- 弱上拉和下拉电阻被关闭。
- 对输入数据寄存器的读访问值为“0”。
2.3 GPIO相关寄存器
2.3.1 GPIO寄存器
每个IO口有10个寄存器控制
4 个 32 位配置寄存器
-
GPIOx_MODER
-
GPIOx_OTYPER
-
GPIOx_OSPEEDR
-
GPIOx_PUPDR
2 个 32 位数据寄存器
- GPIOx_IDR
- GPIOx_ODR
1 个 32 位置位 /复位寄存器
- GPIOx_BSRR
1 个 32 位锁定寄存器
- GPIOx_LCKR
2 个 32 位复用功能选择寄存器
- GPIOx_AFRL
- GPIOx_AFRH
2.3.2 寄存器相关缩写
2.4 软件设计
2.4.1 LED灯
-
1.开时钟
-
2.初始化GPIO
-
3.点亮灯
2.4.2 蜂鸣器
- 1.开时钟
- 2.初始化GPIO
- 3.开启蜂鸣器
2.4.3 按键
-
1.开时钟
-
2.初始化GPIO
-
3.按键识别
延时消抖 松手检测
2.5 补充
2.5.1 IO口与端口
GPIO口以分组形式存在,每组(端口)有16个IO口。
-
I/O口:某个具体引脚
-
端口:16个I/O口组成
2.5.2 变量与寄存器的异同
相同点:
- 变量与寄存器都向内存申请空间,可以存储数据,都有相应地址。
不同点:
-
变量地址随时变化,寄存器地址永远固定;
-
变量可以存储浮点类型数据,寄存器不能存储浮点类型数据。
2.5.3 各类电平
CMOS电平:
-
3.3V 逻辑1
-
0.0V 逻辑0
TTL电平:
-
5.0V 逻辑1
-
0.0V 逻辑0
485/232电平:
-
-15V~-3V 逻辑1
-
3V~15V 逻辑0
差分信号:
-
定义:有两条线,通过两条线的电压差作为逻辑0/1。
-
好处:传输距离很远。衰减一致,保证逻辑。
2.5.4 问答
<1>为什么使用模块化编程?
-
降低代码冗余度,提高代码的利用率
-
便于阅读和维护
<2>为什么使用条件编译?
- 为了使代码更加灵活
<3>头文件使用条件编译的作用?
- 防止头文件重复引入
<4>注释的作用?
- 提高代码的阅读性
<5>头文件一般有什么东西?
- 头文件
- 函数声明
- 宏
- 变量声明
- 变量(不建议)
<6>按键按下为什么要延时消抖?
- 按键按下瞬间,按键从一个稳定状态变化到另一个稳定状态之间,有一个不稳定的过程,延时是为了越过不稳定状态存在的时间,一般为10ms。
<7>按键如何保持一次性?
- 松手检测:设置一个静态标志位,用于松手检测。
<8>知识领悟
- 寄存器是编程人员的编程接口,对于MCU而言,不管你如何封装,一切配置,终究归于寄存器配置;而操作寄存器的本质是对操作地址。