嵌入式笔记3.1 GPIO(mcu 手册)
- 一、 通用 I/O(GPIO)简介
- 二、针对某 mcu 的 GPIO 详解
- 1. 如何下载MCU的手册
- 2. 需要了解的前置信息
- 3. GPIO寄存器详解
- 简介
- 详解
- GPIO 寄存器组简表
- 1. GPIO 端口模式寄存器(GPIOx_MODER)
- 2. GPIO 端口输出类型寄存器(GPIOx_OTYPER)
- 3. GPIO 端口输出速度寄存器(GPIOx_OSPEEDR)
- 4. GPIO 端口上拉/下拉寄存器(GPIOx_PUPDR)
- 5. GPIO 端口输入数据寄存器(GPIOx_IDR)
- 6. GPIO 端口输出数据寄存器(GPIOx_ODR)
- 7. GPIO 端口置位/复位寄存器(GPIOx_BSRR)
- 8. GPIO 端口锁定寄存器(GPIOx_LCKR)
- 9. GPIO 复用复用功能选择寄存器(低)(GPIOx_AFRL)
- 10. GPIO 复用功能选择寄存器(高)(GPIOx_AFRH)
- 11. GPIO 端口复位寄存器(GPIOx_BRR)
- 4. 时钟控制
一、 通用 I/O(GPIO)简介
输入/输出(Input/Output,I/O)接口,是MCU与外部设备进行数据交换通道。例如,人机交互接口:键盘、显示器等,也有无人介入的接口:串行通信接口、USB 接口等。
通用 I/O 也记为 GPIO(General Purpose I/O),即基本输入/输出,有时也称为并行 I/O 或普通 I/O,它是I/O 的最基本形式。
使用正逻辑:
- 电源(VCC)代表高电平,对应数字信号 “1”;
- 地(GND)代表低电平,对应数字信号 “0”。
作为通用输入引脚, MCU 内部程序可以通过端口寄存器读取该引脚,以确定该引脚是 “1”(高电平)还是“0”(低电平),即开关量的输入。
作为通用输出引脚, MCU 内部程序通过端口寄存器向该引脚输出 “1”(高电平)或 “0”(低电平),即开关量的输出。大多数通用 I/O 引脚可以通过编程来设定其工作方式为输入或输出, 称之为双向通用 I/O。
输出引脚的基本接法
作为通用输出引脚, MCU 内部程序向该引脚输出高电平或低电平来驱动器件工作,即开关量输出。
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082147201-2098114668.png)
如图所示,输出引脚 O1 和 O2 采用不同的方式驱动外部器件:
- 一种接法是 O1 引脚直接驱动发光二极管( LED),当 O1 引脚输出高电平时, LED 不亮;当 O1 引脚输出低电平时, LED 点亮。这种接法的驱动电流一般在 2~ 10mA。
- 另一种接法是 O2 引脚通过一个 NPN 三极管驱动蜂鸣器,当 O2 引脚输出高电平时,三极管导通,蜂鸣器响;当O2 引脚输出低电平时,三极管截止,蜂鸣器不响。这种接法可以用 O2 引脚上的几个毫安的控制电流驱动高达 100mA 的驱动电流。若负载需要更大的驱动电流,就必须采用光电隔离外加其他驱动电路,但对 MCU 编程来说, 这没有任何影响。
上拉下拉电阻与输入引脚的基本接法
芯片输入引脚的外部有 3 种不同的连接方式:带上拉电阻的连接、带下拉电阻的连接和 “悬空” 连接。
- 通俗地说,若 MCU 的某个引脚通过一个电阻接到电源上,这个电阻被称为“上拉电阻”;
- 与之相对应,若 MCU 的某个引脚通过一个电阻接到地上,则相应的电阻被称为“下拉电阻”。
这种做法使悬空的芯片引脚被上拉电阻或下拉电阻初始化为高电平或低电平。根据实际情况,上拉电阻与下拉电阻的取值范围为 1~ 10kΩ,其阻值大小与静态电流及系统功耗有关。
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082147623-1189613760.png)
图所示为一个 MCU 的输入引脚的 3 种外部连接方式。 假设 MCU 内部没有上拉或下拉电阻, 则图中的引脚 I3 上的开关 K3 就不适合采用悬空方式连接, 这是因为 K3 断开时,引脚 I3 的电平不确定。在图中, R1>>R2, R3<<R4,各电阻的典型取值为 R1=20kΩ, R2=1kΩ, R3=10kΩ, R4=200kΩ。
二、针对某 mcu 的 GPIO 详解
本节以STM32L431芯片为例
需要的文档:
1. 如何下载MCU的手册
- 下载用户手册:
进入STM32开发者社区 > STM32 MCU开发者社区 > MCU产品组合后通过筛选找到目标型号 MCU :
进入目标型号 MCU 详情即可下载用户手册:
- 如何下载参考手册
进入STM32开发者社区搜索界面,输入 MCU 型号前几个符号,如 stm32l4,选择资源,即可看到参考手册:
2. 需要了解的前置信息
2.1 引脚信息(GPIO)及硬件最小系统
通过查看 STM32L431 的数据手册可以知道 STM32L431 的引脚配置:
- 目录位置:
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082148065-1474889690.png)
- 具体信息:
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082148500-1597668059.png)
芯片引脚分为两大部分:
- 我们为芯片服务的引脚——硬件最小系统引脚。主要包括:电源类引脚、复位引脚、晶振引脚、写入器接口引脚等。
- 芯片为我们服务的引脚——对外提供服务引脚。主要是 I/O 端口类资源。
STM32L431 硬件最小系统引脚表::
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082149569-2061774383.png)
对外提供服务引脚表:
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082150668-1349537632.png)
硬件最小系统
MCU 的硬件最小系统是指使内部程序得以运行的、规范的、可复用的核心构件系统。
- 芯片要能工作,必须有电源与工作时钟
- 要有复位电路,提供不掉电情况下MCU重新启动的手段。
- 要提供写入器的接口电路,能够把程序下载到电路板上的空白芯片中。
STM32L431硬件最小系统图:
- 电源:
电源为什么分布于各边?可保持芯片电流平衡。
在电源引出脚为什么接滤波电容?大电容滤低频波,小电容滤高频波。滤波电容要靠近芯片引脚,便于去除干扰。
- 滤波电容:
接在直流电源的正、负极之间,以滤除直流电源中不需要的交流成分,使直流电变平滑。当电源信号中存在高频噪声或干扰时,滤波电容可以通过存储电荷和释放电荷的方式来平滑电压波动,从而减少高频噪声的传递提供更稳定的直流电压供电给其他电路元件。
- 复位引脚:
复位引脚为RESET(7),低电平时引起MCU复位。
冷复位和热复位:
芯片从无电状态到上电状态的复位属于冷复位,冷复位后MCU内部RAM的内容是随机的。
芯片处于带电状态时的复位属于热复位。热复位后MCU内部RAM的内容会保持复位前的内容不丢失。
外部复位和内部复位:
外部复位有上电复位、按下 “复位” 按钮复位。
内部复位有看门狗定时器复位、低电压复位、软件复位等。
异步复位与同步复位:
异步复位源通常是紧要事件,因此复位控制逻辑会立即有效,不会等到当前总线周期结束后再复位。异步复位的优点是不需额外单元门和走线延迟的设计从而简洁,不依赖于时钟、有没有时钟都能复位。缺点是板级或系统复位产生的噪声或毛刺可能引发伪复位。异步复位源有上电、低电压复位等。
同步复位是等到当前总线周期结束之后、下一个系统时钟的上升沿时才起作用,以保护数据的完整性。同步复位的优点是保证电路是100% 同步的,时钟沿可以作为过滤毛刺的手段。缺点是可能需要一个脉冲展宽器,时钟设计复杂在低功耗设计常常使用时钟门控,时钟关断时不能同步复位。同步复位源有看门狗定时器、软件等。
- 晶振电路:
把石英晶体切下薄片,在晶片两极外加电压后晶体会产生变形,反过来如外力使晶片变形,则两极上金属片又会产生电压,即具有压电效应。如果给晶片加上适当的交变电压,晶片就会产生谐振。利用这种能把电能和机械能相互转化的晶体,在共振的状态下工作可以提供稳定、精确的单频振荡这就是晶体振荡器,即晶振。晶振频率稳定,因此可以提供稳定的脉冲,广泛应用于微芯片的时钟电路里。
- 上拉电阻和下拉电阻
上拉电阻:将一个不确定的信号(高或低电平),通过一个电阻与电源VCC相连,固定在高电平。
下拉电阻:将一个不确定的信号(高或低电平),通过一个电阻与地GND相连,固定在低电平。
上(下)拉电阻用于输入信号引脚时,通常的作用是将信号线强制箝位至某个电平,以防止信号线因悬空而出现不确定的状态,继而导致系统出现不期望的状态。
GPIO
64 引脚封装的 STM32L431 芯片的 GPIO 引脚分为 5 个端口,标记为 A、B、C、D、H,共含50个引脚。逻辑1对应高电平,逻辑0对应低电平。GPIO模块使用系统时钟,当作为通用输出时,高/低电平出现在时钟上升沿。
- 端口A有16个引脚,分别记为PTA[0~15]
- 端口B有16个引脚,分别记为PTB[0~15]
- 端口C有16个引脚,分别记为PTC[0~15]
- 端口D有1个引脚,记为 PTD2
- 端口H有1个引脚,记为 PTH3
2.2 内存地址映射信息
同样查看 STM32L431 的数据手册的内存映射信息:
- 目录位置:
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082151237-1363744703.png)
- 地址映射:
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082151756-1849448553.png)
- STM32L4 存储映射表:
32 位地址范围 | 对应内容 | 说明 |
---|---|---|
0x0000_0000 ~ 0x0003_FFFF | Flash,系统存储器或 SRAM | 取决于 BOOT 配置 |
0x0004_0000 ~ 0x07FF_FFFF | 保留 | |
0x0800_0000 ~ 0x0803_FFFF | Flash 存储器 | 256KB |
0x0804_0000 ~ 0x0FFF_FFFF | 保留 | |
0x1000_0000 ~ 0x1000_3FFF | 保留 | 可用作 SRAM2 |
0x1000_4000 ~ 0x1FFE_FFFF | 保留 | |
0x1FFF_0000 ~ 0x1FFF_73FF | OTP 区域和系统存储器 | |
0x1FFF_7400 ~ 0x1FFF_77FF | 保留 | |
0x1FFF_7800 ~ 0x1FFF_780F | 选项字节 | |
0x1FFF_7810 ~ 0x1FFF_FFFF | 保留 | |
0x2000_0000 ~ 0x2000_BFFF | SRAM1 | 48KB |
0x2000_C000 ~ 0x2000_FFFF | SRAM2 | 16KB |
0x2001_0000 ~ 0x3FFF_FFFF | 保留 | |
0x4000_0000 ~ 0x5FFF_FFFF | 系统总线和外围总线 | GPIO(0x4800_0000~0x4800_1FFF) |
0x6000_0000 ~ 0x8FFF_FFFF | 保留 | |
0x9000_0000 ~ 0xBFFF_FFFF | QUADSPI 闪存块和寄存器 | |
0xC000_0000 ~ 0xDFFF_FFFF | 保留 | |
0xE000_0000 ~ 0xFFFF_FFFF | 带 FPU 的 M4 内部外设 |
AHB2总线地址映射信息:
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082152186-1203719548.png)
AHB (Advanced High-performance Bus) 是 ARM 处理器架构中的一种总线标准,用于连接处理器核心、内存和外设。在 ARM 处理器架构中,AHB 被用于实现高性能、低延迟的系统总线。
AHB1 和 AHB2 是 AHB 总线的两个实例,它们通常用于连接不同级别的设备或功能模块,以实现系统中的不同通信需求。
一般来说,AHB1 通常用于连接处理器核心 (CPU)、内存控制器和其他主要系统组件,例如高速存储控制器、DMA (Direct Memory Access) 控制器等。这些设备通常对性能和延迟要求较高。
而 AHB2 则通常用于连接处理器核心之外的外设,如低速外设、串行接口控制器、定时器等。这些设备通常不需要与处理器核心之间的高速数据传输,因此可以使用更低频率的总线来满足其通信需求,从而节省功耗并降低系统成本。
总的来说,AHB1 通常用于连接高性能、低延迟的核心组件,而 AHB2 则用于连接低速外设和功能模块,以实现系统内的数据交换和通信。
3. GPIO寄存器详解
简介
查看 STM32L4xxxx 参考手册 中关于GPIO寄存器信息:
- 目录:
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082152679-2125809137.png)
从目录我们就可以知道每个GPIO端口包含11个32位寄存器:
- 配置寄存器:
- GPIO端口模式寄存器(GPIOx_MODER)
- GPIO端口输出型寄存器(GPIOx_OTYPER)
- GPIO端口输出速度寄存器(GPIOx_OSPEEDR)
- GPIO端口上拉/下拉寄存器(GPIOx_PUPDR)
- 数据寄存器
- GPIO端口输入数据寄存器(GPIOx_IDR)
- GPIO端口输出数据寄存器(GPIOx_ODR)
- 其他寄存器
- GPIO端口位置位/复位寄存器(GPIOx_BSRR)
- GPIO端口配置锁定寄存器(GPIOx_LCKR)
- GPIO复用功能低位寄存器(GPIOx_AFRL)
- GPIO复用功能高位寄存器(GPIOx_AFRH)
- GPIO端口位复位寄存器(GPIOx_BRR)
详解
GPIO 寄存器组简表
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082153213-1807584875.png)
相对地址 | 寄存器名 | 读写允许 | 功能简述 |
---|---|---|---|
0x00 | 模式寄存器(GPIOx_MODER) | rw | 配置引脚功能模式 |
0x04 | 输出类型寄存器(GPIOx_OTYPER) | rw | 配置引脚输出类型 |
0x08 | 输出速度寄存器(GPIOx_OSPEEDR) | rw | 设置引脚输出速度 |
0x0C | 上拉/下拉寄存器(GPIOx_PUPDR) | rw | 设置上拉/下拉 |
0x10 | 输入数据寄存器(GPIOx_IDR) | r | 读取输入引脚电平 |
0x14 | 输出数据寄存器(GPIOx_ODR) | rw | 读取输出引脚电平 |
0x18 | 置位/复位寄存器(GPIOx_BSRR) | w | 置位/复位输出引脚 |
0x1C | 锁定寄存器(GPIOx_LCKR) | rw | 锁定引脚配置 |
0x20 | 复用功能选择寄存器(低)(GPIOx_AFRL) | rw | 0~7 号引脚功能复用 |
0x24 | 复用功能选择寄存器(高)(GPIOx_AFRH) | rw | 8~15 号引脚功能复用 |
0x28 | 复位寄存器(GPIOx_BRR) | w | 复位输出引脚电平 |
1. GPIO 端口模式寄存器(GPIOx_MODER)
Address offset 偏移地址
Reset value 初始值
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082153642-1205769773.png)
位 31:0 模式[15:0][1:0]:端口x 配置I/O 引脚y(y=15~0),配置引脚的工作模式:
- 00--输入模式
- 01--输出模式
- 10--复用功能模式
- 11--模拟模式(重置状态)
2. GPIO 端口输出类型寄存器(GPIOx_OTYPER)
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082154138-751687441.png)
输出模式有2种:
- 0--推挽输出(PP,push-pull)
- 1--开漏输出(OD,open-drain)
该寄存器的高16位保留,必须保持复位值,只用低16位。初值均为0,表示复位后默认设置为推挽输出。
3. GPIO 端口输出速度寄存器(GPIOx_OSPEEDR)
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082154587-1788533739.png)
输出模式有4种:
- 00--低速
- 01--中速
- 10--高速
- 11--超高速
3V供电下,低速为5MHz,中速为25MHz,高速为50MHz,超高速为120MHz
对比:高速配置下输出频率高,噪声大,功耗高,电磁干扰强。低速配置的系统抗 EMI(电磁干扰)能力强。
4. GPIO 端口上拉/下拉寄存器(GPIOx_PUPDR)
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082155013-1424079991.png)
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082155413-1825045981.png)
用于配置GPIOA端口相应引脚的上拉或下拉电阻:
- 00--引脚无上拉或下拉
- 01--引脚上拉
- 10--引脚下拉
- 11--保留
5. GPIO 端口输入数据寄存器(GPIOx_IDR)
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082155803-276526194.png)
用于获取端口相应引脚的输入电平。
ID15~ID0,端口输入数据位,只读。
该寄存器的高16位保留,必须保持复位值,只用低16位。
6. GPIO 端口输出数据寄存器(GPIOx_ODR)
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082156289-89731381.png)
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082156664-1604087558.png)
用于设置端口相应引脚的输出电平。
OD15~OD0,端口输出数据位,可读可写,可通过软件读取和写入。
该寄存器的高16位保留,必须保持复位值,只用低16位。
7. GPIO 端口置位/复位寄存器(GPIOx_BSRR)
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082157111-1694753210.png)
用于对输出位OD置1或清0。
D31~D16,用于端口位的清0:0表示该引脚保持不变,1表示该引脚清0。例如,D27位(BR11)为0,表示OD11引脚信号不变,为1表示OD11引脚信号被清为了0(低电平)。
D15~D0,用于端口位的置1:0表示该引脚保持不变,1表示该引脚置1 。例如,D11位(BS11)为0,表示OD11引脚信号不变,为1表示OD11引脚信号被置为了1(高电平)。
如果 BR 和 BS 同为1,则 BS(置位)优先。
该寄存器为只写。如果去读它则读到0x00000000。
8. GPIO 端口锁定寄存器(GPIOx_LCKR)
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082157590-1949524161.png)
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082158005-2032810595.png)
用于锁定GPIO端口位的配置(控制寄存器或复用功能寄存器)。
D15~D0,用于端口位的锁定:0表示该号端口位不会锁定,1表示该端口位值锁定,在执行下一次MCU复位或外部设备复位前,无法对该端口位的值修改。
D16(LCKK),该位用于锁定端口位的配置。该位可以随时读取。为0: D15~D0的锁定不起作用;为1: D15~D0的锁定起作用。
LCKK置1的方法是给正确的写序列:
WR LCKR[16] = ‘1’ + LCKR[15:0]
WR LCKR[16] = ‘0’ + LCKR[15:0]
WR LCKR[16] = ‘1’ + LCKR[15:0]
RD LCKR
RD LCKR[16] = ‘1’(可选,仅用来验证是否写入了1)
在写这个序列期间, LCKR[15:0]的值不能修改。
如果序列不正确进行,则lock失败。
该寄存器的高15位保留,必须保持复位值。
9. GPIO 复用复用功能选择寄存器(低)(GPIOx_AFRL)
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082158484-1567532667.png)
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082159013-560626992.png)
用于配置GPIO端口第0~7相应引脚的复用功能。
D31~D0:每 4 位为一个引脚的复用功能选择,由软件写入,初值为0。该4位的二进制值0000~1111,分别对应AF0~AF15功能值。该值所对应的复用功能名称可查阅 “数据手册” 第4章表16、17《复用功能表》。
10. GPIO 复用功能选择寄存器(高)(GPIOx_AFRH)
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082159476-91563395.png)
用于配置GPIO端口第8~15相应引脚的复用功能。
使用方法和“GPIO复用功能低位寄存器”一样。
11. GPIO 端口复位寄存器(GPIOx_BRR)
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082159892-333731906.png)
用于对输出位OD清0。
D15~D0,用于端口位的清0:0表示该引脚保持不变,1表示该引脚清0。
例如:D11位(BR11)为0,表示OD11引脚信号不变;为1表示OD11引脚信号被清为了0(低电平)。
该寄存器的高16位保留,必须保持复位值,只用低16位。
该寄存器为只写。如果去读它则读到 0x0000。
4. 时钟控制
使用GPIO端口需要启用对应外设时钟用于控制,因此我们需要通过手册了解外设时钟地址映射和寄存器信息。
- 查看 STM32L431 的数据手册中AHB1总线地址信息:
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082200298-1135525110.png)
RCC 表示 Reset and Clock Control(复位和时钟控制),在 STM32 微控制器中,它是一个重要的功能模块,用于管理系统的复位和时钟控制。具体来说,RCC 模块提供了对时钟系统的控制和配置,包括:
- 系统复位控制:RCC 管理系统的复位信号,包括启动时的复位和在特定条件下的软件复位。它确保在系统启动时各个组件处于已知状态,并能够在需要时将系统恢复到初始状态。
- 时钟源选择:RCC 允许选择主要时钟源,例如内部时钟源(如内部 RC 振荡器或者内部晶体振荡器)或者外部时钟源(如外部晶体振荡器或者外部时钟输入)。这些时钟源将用于驱动微控制器的主时钟。
- 时钟分频:RCC 允许对时钟进行分频,以生成不同频率的时钟信号。这些时钟信号将用于驱动微控制器内部的各个模块,例如 CPU、外设等。
- 时钟使能控制:RCC 允许对不同的时钟信号进行使能或禁用控制,以节省能耗或者提高系统性能。可以通过 RCC 控制各个外设所需的时钟信号,以满足系统的实际需求。
- 查看 STM32L4xxxx 参考手册 中关于RCC寄存器信息:
目录(AHB2总线外设时钟使能控制):
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082200714-953163552.png)
AHB2 时钟使能控制寄存器信息:
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082201199-1453483003.png)
![](https://img2023.cnblogs.com/blog/2638054/202405/2638054-20240509082201627-1663486533.png)
设置IO时钟启用和禁用:
- 0:禁用某端口时钟
- 1:启用某端口时钟