基于 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、端口配置锁定寄存器

相关推荐
踏着七彩祥云的小丑14 小时前
嵌入式——认识电子元器件——温度开关系列
单片机·嵌入式硬件
嵌入式小企鹅14 小时前
CPU供需趋紧、DeepSeek V4全链适配、小米开源万亿模型
人工智能·学习·开源·嵌入式·小米·算力·昇腾
宣宣猪的小花园.14 小时前
C语言重难点全解析:内存管理到位运算
c语言·开发语言·单片机
三品吉他手会点灯19 小时前
C语言学习笔记 - 20.C编程预备计算机专业知识 - 变量为什么必须的初始化【重点】
c语言·笔记·学习
sakiko_19 小时前
UIKit学习笔记1-创建项目(使用UIKit)、使用组件
笔记·学习
生信碱移20 小时前
PACells:这个方法可以鉴定疾病/预后相关的重要细胞亚群,作者提供的代码流程可以学习起来了,甚至兼容转录组与 ATAC 两种数据类型!
人工智能·学习·算法·机器学习·数据挖掘·数据分析·r语言
FreakStudio21 小时前
亲测可用!可本地部署的 MicroPython 开源仿真器
python·单片机·嵌入式·面向对象·并行计算·电子diy·电子计算机
星幻元宇VR1 天前
VR航空航天科普设备【VR时空直升机】
科技·学习·安全·生活·vr
_李小白1 天前
【android opencv学习笔记】Day 2: Mat类(图片数据结构体)
android·opencv·学习
rit84324991 天前
STM32 + DS3231 + TM1640 实时时钟数码管显示系统
stm32·单片机·嵌入式硬件