GPIO寄存器与复用
位带
什么是位带(Bit-Banding)?
位带(Bit-Banding)是一种特殊的内存访问机制,通常用于某些嵌入式系统中(如 ARM Cortex-M 处理器系列),允许直接操作内存中单个位的内容,而无需先读取整个字(如字节或字)。通过位带,可以更加高效地进行单个位的设置、清除、反转或读取操作,而不需要读取和写入整个数据单元。
1. 位带的背景和用途
在传统的内存操作中,你通常需要读写一个字(如字节或字),然后对其中的某个位进行操作。这意味着需要先读取整个字,然后修改其中的某一位,再将修改后的字写回内存。这个过程通常会涉及到额外的时间开销,尤其是对于嵌入式系统和实时系统而言,这种操作可能会导致性能下降。
位带技术的引入允许你直接访问内存中单个位的值,从而减少了这种开销。通过位带,可以直接通过特定的内存地址操作单个位的内容,而无需关心其他位。
2. 位带的工作原理
位带的工作原理基于特殊的内存映射,它将某些内存区域映射为可以访问单个位的特殊区域。通过这一映射,您可以通过对某一特定地址的操作来直接改变内存中某一位的状态。
位带区域的映射规则通常如下:
- 位带映射区域通常以固定的内存地址段进行划分。
- 位带区域对应的每一个字节位置都会映射到一个单独的位(可以是该字节的任意一位)。
- 对映射地址的访问将直接影响目标位,而无需读取整个字节或字。
在 ARM Cortex-M 系列处理器中,通常使用两个内存区域来实现位带:
- 位带别名区域(Bit-Band Alias Region):这个区域允许你通过访问别名地址来操作内存中的单个位。
- 位带原始区域(Bit-Band Region):这个区域是实际的数据存储区域,存储了原始的内存数据。
3. 位带地址映射
假设我们有一块内存区域,从 0x20000000 开始,这块内存区域映射到位带别名区域。
- 原始内存区域(
0x20000000到0x200FFFFF)是存储数据的地方。 - 位带别名区域(
0x22000000到0x23FFFFFF)是通过位带操作来直接修改某一位的区域。
具体的映射关系是:
对于原始内存区域中的某一个地址 addr,如果你想通过位带别名区域操作其中的第 bit 位,你可以使用以下映射公式:
位带别名地址 = 基址 + (字节偏移 * 32) + (位偏移 * 4)举个例子,假设要操作原始地址 0x20000004 的第 3 位(即内存中的第 3 位),对应的位带别名地址会是:
位带别名地址 = 0x22000000 + ((0x20000004 - 0x20000000) * 32) + (3 * 4)
= 0x22000000 + (4 * 32) + (3 * 4)
= 0x22000000 + 128 + 12
= 0x22000080这样,你可以通过访问 0x22000080 来直接设置或清除原始地址 0x20000004 中的第 3 位,而不需要处理其他位。
4. 位带的优势
- 高效性:传统方法需要先读取整个字节或字,再操作某个位,最后再写回。而使用位带,你可以直接操作单个位,无需读取和写入整个字节或字,因此可以节省时间和计算资源。
- 原子操作:通过位带进行操作时,可以确保操作是原子的,这意味着你可以在中断或多任务环境下安全地修改某个位,不会被其他操作打断。
- 简化代码:通过位带,你可以更方便地对特定的硬件寄存器或内存位进行操作,代码更加简洁且不易出错。
- 减少带宽消耗:传统的读取/写入整个字节或字可能需要更多的总线带宽,而位带操作可以减少对内存总线的负载,尤其适用于资源有限的嵌入式系统。
5. 位带的应用场景
- 硬件控制:位带常用于控制外设的特定位。例如,GPIO 控制、状态寄存器的位操作、或者配置控制寄存器中的单个位。
- 开关和标志位控制:在嵌入式系统中,很多设备的状态可以通过单个位来控制,位带能够高效地设置或清除这些位。
- 中断标志位:对于中断控制器,位带技术可以高效地处理中断请求标志位。
6. 例子
假设你有一个控制 LED 灯的寄存器,它的某一位用于打开或关闭 LED。假设寄存器地址是 0x20000004,LED 控制位是该寄存器的第 3 位。通过位带,你可以直接操作该位来控制 LED 的状态:
- 如果想打开 LED,设置该位为 1。
- 如果想关闭 LED,设置该位为 0。
7. 总结
位带(Bit-Banding) 是一种可以直接操作内存中特定位的高效技术,广泛应用于 ARM Cortex-M 系列的嵌入式系统中。它通过特殊的内存映射,使得开发者可以直接访问并修改内存中单个位的状态,避免了对整个字的读取和写入,提供了高效、原子且简洁的控制方式。位带技术特别适用于硬件寄存器控制、状态标志位和高效的实时任务处理中。
复用
GPIO 复用(General Purpose Input/Output Multiplexing)是指在 STM32 微控制器中,某些 GPIO 引脚不仅可以作为普通的输入或输出引脚使用,还可以通过配置,作为其他外设的接口引脚,执行特定的功能。换句话说,复用功能使得 GPIO 引脚能在不同的外设之间共享资源,从而节省引脚数量,提高硬件的灵活性。
1. GPIO 复用的基本概念
STM32 微控制器的许多 GPIO 引脚可以配置为“复用模式”,即它们既能作为普通的输入输出引脚,也可以被配置为特定的外设接口,如:
- 串口(UART)通信
- I2C 总线
- SPI 总线
- PWM 输出
- 模拟信号输入(ADC、DAC)
这些引脚通常会标明哪些引脚具有复用功能,例如 PA9、PA10 在 STM32F4 中就可以作为 UART 的 TX 和 RX 引脚。
2. 复用的工作原理
每个 GPIO 引脚通常有几种功能模式,其中包括:
- 输入模式(Input):用于读取外部信号。
- 输出模式(Output):用于输出电信号(比如控制 LED、蜂鸣器等)。
- 复用模式(Alternate Function):用于连接外设,如串口(UART)、I2C、SPI 等。
- 模拟模式(Analog):用于模拟信号处理,比如 ADC 输入或 DAC 输出。
3. 复用模式的选择
STM32 微控制器中的每个 GPIO 引脚都具有一个特定的复用功能,通过 配置寄存器 可以设置每个引脚的功能。例如,在 STM32F4 中,某些引脚有多达 四种复用功能,具体功能由 AF(Alternate Function)寄存器中的配置位来选择。
4. 具体的复用功能示例
- 串口(UART)复用:
PA9和PA10:在 STM32F4 系列中,这两个引脚通常作为 UART1 的 TX(发送)和 RX(接收)引脚。当它们被设置为复用模式时,可以实现串口通信。
- SPI 总线复用:
PB3和PB4:这些引脚可以作为 SPI1 的 MISO(主输入从输出)和 MOSI(主输出从输入)引脚。通过复用,它们能够连接到外部设备,如 SPI 外设。
- I2C 总线复用:
PB6和PB7:这两个引脚可以配置为 I2C1 的 SCL(时钟线)和 SDA(数据线)。通过 I2C 协议,STM32 可以与其他 I2C 外设进行通信。
- PWM 输出复用:
PA8:这个引脚可以配置为输出 PWM 信号,控制外部电机的转速、亮度调节等。
5. 复用模式的配置
在 STM32 中,通过修改 GPIO 端口的配置寄存器 来设置引脚的复用功能。具体步骤如下:
- 选择正确的复用功能:根据数据手册或者参考手册,确定你要将引脚配置为哪个外设接口。
- 配置 GPIO 引脚的工作模式:通过控制寄存器设置引脚为复用模式(
GPIO_Mode_AF)。 - 选择复用功能:在对应的复用功能寄存器中设置引脚的复用功能编号(如
AF0,AF1,AF2,AF3等)。
例如,假设你希望配置 PA9 为 UART1 的 TX 引脚,步骤如下:
- 设置
PA9为复用模式(GPIO_Mode_AF)。 - 在
AF寄存器中将PA9设置为 UART1 的 TX 引脚。
6. GPIO 复用的优势
- 节省引脚资源:通过复用引脚,多个外设可以共享同一引脚,从而减少了对芯片引脚数量的需求。
- 提高灵活性:可以根据不同的外设需求配置引脚的功能,使得硬件设计更加灵活。
- 优化 PCB 设计:可以减少连接外设的线数,使得 PCB 布局更紧凑。
7. 注意事项
- 在配置 GPIO 为复用模式时,需要确保其他使用该引脚的功能不会发生冲突。
- 在复用模式下,通常不能再将该引脚用于普通的输入/输出操作。
总结
GPIO 复用是 STM32 微控制器的一项强大功能,它允许多个外设通过相同的引脚进行连接,从而节省引脚资源,提高硬件设计的灵活性。通过合理配置 GPIO 引脚,可以使同一个引脚承担不同的任务,如串口通信、SPI 总线、PWM 输出等,极大地丰富了系统的功能。
是的,JTAG/SWD 接口不仅可以用于下载程序,还可以用于调试程序。这两个功能的结合是 JTAG/SWD 的一大优势,尤其在嵌入式开发中,非常方便。
GPIO寄存器

MOS管
MOS管的通俗解释及工作原理
MOS管(金属氧化物半导体场效应晶体管)是一个电子开关器件,通过电压来控制电流的流通。它常被用来控制电路中的灯、马达、蜂鸣器等设备,也在各种电子产品中扮演核心角色。
1. MOS管的结构
MOS管有三个引脚:
- 栅极 (G,Gate):像“开关按钮”,用来控制开关的状态。
- 源极 (S,Source):像水管中的水源,电流流出的地方。
- 漏极 (D,Drain):像水管的出口,电流流入出的地方。
栅极与源极、漏极之间有一个绝缘层(氧化层),使得栅极几乎不消耗电流。
2. MOS管的基本原理
MOS管的工作原理可以类比为水龙头控制水流:
- 栅极电压控制导通:
- 栅极就像水龙头的开关。
- 当给栅极加上合适的电压,MOS管内部会“打开”,形成通道,电流可以从漏极流到源极。
- 如果栅极电压没有达到要求,MOS管就会“关闭”,电流无法流通。
- N沟道 MOS管的例子(最常见):
- 栅极电压 高(例如 3.3V、5V):MOS管导通,电流流过,设备工作。
- 栅极电压 低(0V):MOS管关断,电流被阻断,设备停止。
- P沟道 MOS管的例子:
- 栅极电压 低:MOS管导通,电流流过。
- 栅极电压 高:MOS管关断,电流被阻断。
3. 通俗的“开关”比喻
想象你要控制一盏灯:
MOS管像一个电控开关,你不需要用手去开关灯,而是通过“控制电压”来开关灯。
栅极电压 = 控制信号
。
- 如果你在栅极加电压(比如 5V),MOS管导通,电流流通,灯就亮了。
- 如果栅极没有电压(比如 0V),MOS管关断,灯就熄灭了。
4. MOS管的优点
- 功耗低:栅极控制电压时,几乎不消耗电流。
- 速度快:可以快速开关,非常适合高频电路。
- 电压控制:不像普通三极管需要电流,MOS管通过电压轻松控制。
5. 工作原理总结
N沟道 MOS管
(最常见):
- 栅极加高电压 → 导通 → 电流通过 → 设备工作。
- 栅极加低电压 → 关断 → 电流阻断 → 设备停止。
P沟道 MOS管
:
- 栅极加低电压 → 导通
- 栅极加高电压 → 关断
6. 生活中的应用
- 控制 LED 灯:用单片机给 MOS管栅极加电压控制灯的亮灭。
- 充电器:MOS管用来快速开关控制电流流通。
- 电动车电机控制:MOS管控制电机的启停和调速。
- 电脑 CPU、内存:MOS管是核心器件,控制高速数据传输。
总结
MOS管就像一个“电压控制的开关”,通过给栅极加电压来控制电流的通断。
- 给栅极一个合适的电压 → 开关打开 → 电流流通 → 设备工作。
- 不给电压或电压不足 → 开关关闭 → 电流被阻断 → 设备停止。
这样简单地通过电压就能控制各种电路和设备的开关状态,非常方便又高效。
位或

复用
GPIO(通用输入输出口,General Purpose Input/Output)是微控制器(如STM32)中与外界设备通信的引脚,可以用来输入信号或输出信号。默认情况下,这些引脚是独立的,由程序直接控制其高低电平。
例如:
- 输入模式:检测一个按键是否按下(0 或 1)。
- 输出模式:点亮或关闭一个LED灯。
复用功能(Alternate Function)意味着这个引脚不仅仅是一个普通的GPIO引脚,它可以切换为某些外设的专用信号接口。
比如:
- STM32的某些引脚可以用于UART通信(串口),那么这个引脚就需要作为UART的发送或接收引脚工作,而不是普通GPIO。
- 用于SPI通信时,引脚可能需要作为数据时钟、数据输入或输出。
位运算理解
按位与1 位返回自己,按位与0 位返回0
按位或1 位返回1,按位或0位返回自己

