news 2026/7/9 10:59:07

STM32 位带操作——像 51 一样操作 GPIO

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32 位带操作——像 51 一样操作 GPIO

问题

STM32 的 GPIO 操作通常写HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET),很长。如果想像 51 那样P0_0 = 1一样简洁,怎么办?

原理

Cortex-M3/M4 支持位带操作(Bit-Banding)——将 1 bit 的地址映射到 1 个 32 位的别名地址。写这个别名地址就是操作对应的那一位。

F407 的位带区域:

区域普通地址范围位带别名范围
SRAM0x20000000~0x200FFFFF0x22000000~0x23FFFFFF
外设0x40000000~0x400FFFFF0x42000000~0x43FFFFFF

GPIO 的寄存器在外设区,所以可以用位带操作。SRAM 位带区(0x20000000 起)同样支持位带操作,用法类似。

实现

定义宏:

// 位带地址转换公式:alias = 0x42000000 + (addr - 0x40000000) * 32 + bit * 4 #define BITBAND(addr, bit) (*(volatile uint32_t *)(0x42000000 + ((uint32_t)(addr) - 0x40000000) * 32 + (bit) * 4)) ​ // GPIO 输出数据寄存器 (ODR) 地址 // 以 GPIOA 为例,基址 0x40020000,ODR 偏移 0x14 #define GPIOA_ODR (GPIOA_BASE + 0x14) #define GPIOB_ODR (GPIOB_BASE + 0x14) // 以此类推 ​ // 定义引脚位带别名 #define PA0 BITBAND(GPIOA_ODR, 0) #define PA1 BITBAND(GPIOA_ODR, 1) #define PB0 BITBAND(GPIOB_ODR, 0) // ... 需要哪个定义哪个

使用:

PA0 = 1; // PA0 输出高 PA0 = 0; // PA0 输出低

读引脚状态

ODR 是输出寄存器,读的是你设的值。如果要读引脚实际电平,用输入数据寄存器(IDR):

#define GPIOA_IDR (GPIOA_BASE + 0x10) #define PA0_IN BITBAND(GPIOA_IDR, 0) ​ uint8_t val = PA0_IN; // 读 PA0 引脚电平

注意事项

  1. 位带操作不经过 HAL 库,GPIO 初始化还是要用 CubeMX 配

  2. 位带别名地址是32 位访问,操作是原子的(单条 STR 指令,硬件总线层级完成读-改-写;注意 DMA 等总线主控器不受此原子性保护)

  3. 位带宏定义已含 volatile,编译器不会将其优化掉;但非 volatile 的普通变量仍需注意

  4. 适用于性能敏感的场合(如软件模拟 I2C/SPI 时序)

实用宏封装

// 输出 #define PA_out(n) BITBAND(GPIOA_ODR, n) #define PB_out(n) BITBAND(GPIOB_ODR, n) ​ // 输入 #define PA_in(n) BITBAND(GPIOA_IDR, n) #define PB_in(n) BITBAND(GPIOB_IDR, n) ​ // 使用 PA_out(0) = 1; // PA0 输出高 uint8_t key = PA_in(1); // 读 PA1 电平

相比 HAL 库的 WritePin/ReadPin,位带操作编译后只有一条汇编指令,速度快得多。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/9 10:53:56

【无标题】Vim编辑器

一、Vim编辑器(vi improved,最核心)1. 基础认识1. vi是几十年前Unix系统自带原始编辑器,功能简陋;vim是vi增强升级版,绝大多数Linux系统默认安装。2. 查看电脑是否有vim工具(终端输入&#xff0…

作者头像 李华
网站建设 2026/7/9 10:51:13

思源宋体中文版完全指南:7种字重免费商用字体终极教程

思源宋体中文版完全指南:7种字重免费商用字体终极教程 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为中文排版设计寻找专业又免费的字体吗?思源宋体中文…

作者头像 李华
网站建设 2026/7/9 10:47:38

上海办公升降桌

在上海这座节奏飞快的城市,办公桌早已不只是工作台——它承载着我们一天中大半的精力。从陆家嘴的金融白领到漕河泾的程序员,从徐家汇的创业团队到静安寺的自由职业者,大家越来越关注一件事:怎么才能坐得舒服、站得健康&#xff0…

作者头像 李华
网站建设 2026/7/9 10:44:40

ArcGIS Pro镶嵌数据集:绝不仅是数据之和

如果你有兴趣开始或正在研究 ArcGIS 中的影像和遥感内容,你可能已经熟悉那些曾经通过扩展实现、现在直接集成进 ArcGIS 的广泛功能。这些功能使用户和组织能够充分利用影像和遥感内容,支持 ArcGIS 生态系统内的管理、分析和可视化工作。在 Esri&#xff…

作者头像 李华
网站建设 2026/7/9 10:44:25

跨境电商独立站常用wordpress主题

TradeTheme —— 外贸专属WordPress主题TradeTheme(tradetheme.com)是一家专注于外贸行业WordPress主题开发的专业技术服务商,专为外贸独立站而生。在全球贸易数字化转型的浪潮中,TradeTheme始终聚焦于一个核心使命——为中国外贸企业提供高效、专业、易…

作者头像 李华