基于 STM32 ——GPIO输出

一、GP IO简介

数字0为低电平:0V

数字1为高电平:3.3V

如果GPIO输出的是模拟量,那GPIO还可以配置成模拟输入模式,再配合内部的SDC外设,就能直接读取端口的模拟电压了;

二、GPIO的基本结构

在STM32中,所有的GPIO都是挂载在APB2外设总线上的;

每个GPIO外设总共有16个引脚,为0到15;

GPIO模块内,主要包括寄存器和驱动器;

1、寄存器 :

就是一段特殊的储存器,内核可以通过APB2总线对寄存器惊醒读写,这样就完成了输出电平和读取电平的功能;

寄存器的每一位对应一个引脚;寄存器是有32位的,因为这里输出端口只有16位,所以只有寄存器的低16位用到了的;,高16位是没有用到

2、驱动器:

是用来增加信号的驱动能力的, 寄存器只负责存储数据,如果要进行点灯,就需要驱动器来负责增大驱动能力;

三、GPIO位结构

1、整体位置关系

整体结构可以分为两个部分,上面为输入,下面为输出

2、上拉、下拉、浮空

如果上面导通、下面断开,就是上拉输入模式,默认为高电平的输入模式;

如果下面导通、上面断开,就是下拉输入模式,默认为低电平的输入模式;

都断开则为浮空模式;

二者阻值都比较大;

3、TTL施密特触发器

工作原理

a.初始状态下,输入端为低电平,PNP二极管导通,NPN二极管截断,输出端为高电平。

b.当输入信号从低电平变为高电平时,PNP二极管截断,NPN二极管导通,输出端电压被拉低,变为低电平。

c.当输入信号再次从高电平变为低电平时,PNP二极管导通,NPN二极管截断,输出端电压被拉高,变为高电平。

d.重复上述过程,实现从高电平到低电平的转换

4、输出部分

如果选择通过输出数据寄存器进行控制:普通的IO口输出;

位设置/清除寄存器:可以用来单独操作输出数据寄存器的某一位,而不影响其他位;

5、引出:

⭐STM32中"位带"区域是什么?

a、核心目的:解决 "位操作" 的痛点

在嵌入式开发中,经常需要单独控制某个比特位(例如:控制 GPIO 引脚电平、寄存器中的标志位)。传统方式必须执行三步:

  1. :读取整个寄存器的值到 CPU;
  2. :修改目标比特位(其他位保持不变);
  3. :将修改后的值写回寄存器。

这种 "读 - 改 - 写" 存在两个问题:

  • 代码繁琐(需要用|=&=配合掩码);
  • 多线程 / 中断场景下可能出现竞态条件(读取后被其他程序修改,导致写回的数据失效)。

b、STM32 的位带区域划分

STM32 只对两个特定内存区域支持位带映射,分别对应片内 SRAM外设寄存器,每个区域都包含 "原始区域" 和 "位带别名区域"

类型 原始区域(可位操作的内存) 位带别名区域(映射地址) 映射规则
片内 SRAM 0x2000 0000 ~ 0x200F FFFF(1MB) 0x2200 0000 ~ 0x23FF FFFF(2MB) 别名地址 = 0x22000000 + (原始地址 - 0x20000000) × 32 + 比特位 × 4
外设寄存器 0x4000 0000 ~ 0x400F FFFF(1MB) 0x4200 0000 ~ 0x43FF FFFF(2MB) 别名地址 = 0x42000000 + (原始地址 - 0x40000000) × 32 + 比特位 × 4
映射规则说明:
  • 原始区域中1 个字节(8 位) 对应别名区域中32 个字节(8 位 × 4 字节 / 位);
  • 对别名区域中某个字节执行:
    • 1 → 对应原始比特位置1
    • 0 → 对应原始比特位清0
    • 读该字节 → 返回原始比特位的值(0 或 1)。

c、位带机制的优势与限制

优势:
  1. 简化代码:无需掩码和 "读 - 改 - 写",直接操作单个位;
  2. 效率高:单条指令完成位操作(传统方式需 3 条以上指令);
  3. 无竞态风险:无需读取整个寄存器,避免多线程 / 中断干扰(前提是无其他代码同时操作该位)。
限制:
  1. 仅支持特定区域:仅 SRAM(0x20000000~0x200FFFFF)和外设寄存器(0x40000000~0x400FFFFF),其他区域(如 Flash)不支持;
  2. 地址对齐要求 :别名区域按 4 字节对齐(需用uint32_t指针访问,避免非对齐错误);
  3. STM32 全系列支持:所有 STM32 型号(F1/F4/L4 等)均内置位带机制,无硬件差异。

总结

STM32 的位带区域是将 "SRAM / 外设寄存器的单个比特位" 映射为 "独立的字节地址" 的内存机制,核心价值是用简单的字节访问替代复杂的 "读 - 改 - 写",高效实现单个位的置 1、清 0 和读取。在 GPIO 控制、标志位操作等场景中广泛应用,是 STM32 简化位操作的核心特性之一。

6、开漏模式

开漏模式可以作为通信协议的驱动方式,再多机通信的情况下,可以避免各个设备的相互干扰,

还可以用于输出5V的电平信号;

四、GPIO八种模式

浮空、上拉、下拉这三个模式的电路结构基本是一样的,区别就是上拉电阻和下拉电阻的连接;

它们都属于数字的输入口,特征就是,读取端口的高低电平;

当引脚悬空时: 上拉输入默认为高电平, 下拉输入默认为低电平;

而浮空输入的电平不确定,所以在使用浮空时,端口要接上一个连续的电源;

模拟输入

五、GPIO的寄存器

1、GPIO配置寄存器

每一个端口的模式由4位进行配置,则16个端口就需要64位,所以这里有两个寄存器;

2、端口输入数据寄存器

低16位对应16个引脚,高16位没有用到;

3、端口输出数据寄存器

同上

4、端口位设置/清除寄存器

高16位进行位清除;

低16位进行位设置;

5、端口位清除寄存器

端口位清除寄存器的低16位与端口位设置/清除寄存器的高16位一样;

为了方便操作设置的;

6、端口配置锁定寄存器

相关推荐
Molesidy1 小时前
【Embedded Development】【TCP-IP】关于TCP-IP网络协议的学习记录以及基于TCP-IP网络协议的上层协议的初步理解
网络协议·学习·tcp/ip
影阴1 小时前
stm32 定时器 + hal实现滴答定时器控制led闪烁
stm32·单片机·嵌入式硬件
阿容1234561 小时前
stm32平衡小车- 03
stm32·单片机·嵌入式硬件
组合缺一1 小时前
Solon AI 开发学习10 - chat - 工具调用概念介绍
java·人工智能·学习·ai·llm·solon
丝斯20111 小时前
AI学习笔记整理(25)—— 计算机视觉之目标检测
人工智能·学习·计算机视觉
AA陈超1 小时前
只想克隆项目中的 Source 文件夹,而不影响其他内容
笔记·git·学习
随风一样自由1 小时前
React内逐行解释这个 package.json 文件,最近搞了个工厂AI生产平台,顺便来学习一下
学习·react.js·json·package
AA陈超1 小时前
Lyra学习5:GameFeatureAction分析
c++·笔记·学习·ue5·lyra
YJlio1 小时前
Autologon 学习笔记(9.13):安全启用“自动登录”的边界、风险与替代方案
笔记·学习·安全