当前位置: 首页 > news >正文

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,位带操作编译后只有一条汇编指令,速度快得多。

http://www.cnnetsun.cn/news/3240510.html

相关文章:

  • Biotinyl-Glucagon-like Peptide 1 (7-36) amide (human) (Biotinyl-Preproglucagon amide (78-107))
  • 【无标题】Vim编辑器
  • 思源宋体中文版完全指南:7种字重免费商用字体终极教程
  • 上海办公升降桌
  • ArcGIS Pro镶嵌数据集:绝不仅是数据之和
  • 跨境电商独立站常用wordpress主题
  • B站缓存视频合并工具:高效整理离线内容的Android解决方案
  • Mixamo动画到UE4根运动转换:自动化工作流提升游戏开发效率70%
  • 082、EDVR实战:可变形卷积在视频超分中的高效应用与代码实现
  • 2026 年 AI 钓鱼攻击现状与防御深度解析
  • 从零构建智能体技能:解锁AI自动化工作流的核心实践
  • AC696N 开发板开发分享 ——SPI 驱动 TFT 屏
  • AI 编程助手如何进入真实项目:从任务卡片、代码上下文到测试闭环
  • Criminisi图像修复MATLAB实现
  • 西安出境欧洲多国联游纯玩无自费旅游业务 | 公司品牌名称
  • 解锁B站个性化新体验:Bilibili-Evolved完全使用指南
  • 终极指南:如何使用网盘直链下载助手实现九大网盘高速下载
  • 网盘直链下载助手:打破网盘限速壁垒的终极解决方案
  • Codex 本地 AI 编程助手十六维锐评:从安装到实战,避坑指南与场景适配
  • D3KeyHelper完全指南:5分钟打造你的暗黑3专属按键助手
  • D3KeyHelper:5分钟掌握暗黑破坏神3终极自动化按键助手
  • 学术写作效率突破!2026全流程AI写作辅助软件深度解析
  • 终极免费方案:如何永久保存你的微信聊天记录完整备份
  • 让中学生也能一下子认识中学数学几百年重大错误:R各元x的对应数2x的全体=R
  • FastAPI 静态文件:Web 页面的“固定展柜”与“加速引擎”
  • 企业智能AI落地实战:从工具到生产力的三步走
  • 混元Hy3正式发布,腾讯的长期主义有了效果
  • CircuitJS1:你的个人电子实验室,随时随地探索电路奥秘
  • 植物大战僵尸终极改造指南:PvZ Toolkit完全解析
  • 5分钟掌握:如何永久激活你的Windows和Office系统