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

【STM32】位带操作

【STM32】位带操作

  • 1.位带操作介绍
  • 2.位带操作内存地址
  • 3.完整代码

1.位带操作介绍

为了减少 “ 读-改-写 ” 操作的次数,Cortex-M3处理器提供了一个可以执行单原子比特操作的位带功能。
存储器映射包含了两个支持位带操作的区域。
其中一个是SRAM区的最低1MB范围,第二个是片内外设区的最低1MB范围。
这两个区域中的地址除了普通应用外,还有自己的 “ 位带别名区 ” 。
位带别名区把每个比特扩展成一个32位的字。当用户访问位带别名区时,就可以达到访问原始比特的目的。
总结就是CPU不能直接对位带区中的单个数据位位寻址,只能通过对位带别名区的访问(或读/写)实现对位带区单个数据位的访问(或读/写),这种操作被称为位带操作。
使用位带操作的目的是能够像51单片机那样直接给IO口拉高拉低,例如 PCout(13) = 1 这种操作。
【简单来说,这两块区域支持位带操纵,但是得通过操作它们得别名区才能修改它们的值】

2.位带操作内存地址

关于支持位带操作的两个内存区的范围是:
0x2000 0000 ‐ 0x200F FFFF(SRAM 区的最低1MB)
0x4000 0000 ‐ 0x400F FFFF(片上外设区的最低 1MB)
对应的位段别名区的起始地址分别为 0x2200 0000 和 0x4200 0000 ,这个在编程的时候需要使用。

在这里插入图片描述
————————————————————————————————————————————
在这里插入图片描述

————————————————————————————————————————————
在这里插入图片描述

3.完整代码

// 位带区域基地址定义
#define PERIPH_BASE       0x40000000U  // 外设基地址
#define SRAM_BASE         0x20000000U  // SRAM基地址
#define PERIPH_BB_BASE    0x42000000U  // 外设位带别名基地址
#define SRAM_BB_BASE      0x22000000U  // SRAM位带别名基地址// 位带地址计算宏(通用)
#define BITBAND_ADDR(base, alias_base, addr, bit) \((alias_base) + (((uint32_t)(addr) - (base)) << 5) + ((bit) << 2))// SRAM位带地址计算
#define BITBAND_SRAM_ADDR(addr, bit) \BITBAND_ADDR(SRAM_BASE, SRAM_BB_BASE, (uint32_t)(addr), bit)// SRAM位带访问(直接取值/赋值)
#define BITBAND_SRAM(addr, bit) \(*(volatile uint32_t*)BITBAND_SRAM_ADDR(addr, bit))// 外设位带地址计算
#define BITBAND_PERIPH_ADDR(addr, bit) \BITBAND_ADDR(PERIPH_BASE, PERIPH_BB_BASE, (uint32_t)(addr), bit)// 外设位带访问(直接取值/赋值)
#define BITBAND_PERIPH(addr, bit) \(*(volatile uint32_t*)BITBAND_PERIPH_ADDR(addr, bit))
#include <stdio.h>// 使用示例
int main(void) {// 1. SRAM位带操作示例volatile uint32_t flags = 0;volatile uint32_t status_reg = 0x12345678;printf("=== SRAM位带操作演示 ===\n");// 使用宏方式操作SRAM位BITBAND_SRAM(&flags, 0) = 1;  // 设置第0位BITBAND_SRAM(&flags, 3) = 1;  // 设置第3位printf("设置第0、3位后: 0x%08X\n", flags);// 读取位状态uint32_t bit0 = BITBAND_SRAM(&flags, 0);uint32_t bit1 = BITBAND_SRAM(&flags, 1);printf("第0位: %d, 第1位: %d\n", bit0, bit1);// 2. 外设位带操作示例(GPIO控制)printf("\n=== GPIO位带操作演示 ===\n");// 假设GPIO已初始化// 设置PA5为高电平BITBAND_PERIPH(&GPIOA->ODR, 5) = 1;// 读取PA5if (BITBAND_PERIPH(&GPIOA->IDR, 5)) {printf("PA5为高电平\n");} else {printf("PA5为低电平\n");}}

需要注意的是当你使用位带功能时,要访问的变量必须用volatile来定义。因为c编译器并不知道同一个比特可以有两个地址。通过volatile使得编译器每次都如实地把新数值写入存储器,避免语句被优化。

注意输入的时候,一定要输入地址,而不是变量名。

http://www.dtcms.com/a/403990.html

相关文章:

  • 供需网站开发做网站怎么发布
  • 保定网站建设方法水墨画风格网站
  • LINUX嵌入式面经(六)--常见算法篇
  • 网站优化推广方法庐江住房建设局网站
  • C语言基础【24】:组包和解包
  • 网站建设PHP开发是什么意思长沙seo服务
  • BMAD的多代理协同开发工作流指南
  • 沈阳网站建设 景乔科技毕节做网站
  • 网站开发 前端 后端 如何结合他达拉非片和西地那非片的区别
  • 做国际物流需要自己的网站吗win主机 wordpress静态
  • 指令微调数据评估与影响:构建高质量大语言模型的关键
  • 本墨陈黑做网站有版权网站开发维护成本
  • 【自动驾驶】自动驾驶概述 ⑤ ( 自动驾驶硬件概述 | 车载计算单元 IPC | 车辆线控系统 )
  • 静态IP的适用场景
  • 第1章 计算机系统概述
  • 印刷个性化网站建设的意义残疾人无障碍网站怎么做
  • Linux学习笔记(六)--Linux进程概念
  • C语言自学--数据在内存中的存储
  • 石家庄网站制作哪家好wordpress 优化数据库
  • 《基于Qt的车载系统项目》
  • 有哪些免费推广软件网站seo推广排名
  • 41.传输层协议UDP
  • 优良的定制网站建设提供商c2c模式的网站
  • 记力扣2516.每种字符至少取k个 练习理解
  • 广州站电话科创纵横 网站建设
  • 进程与集群:提升性能
  • 北京建设信源官方网站如何让wordpress文本小工具支持php和简码?
  • NLP算法岗位面试题精讲:深入理解LoRA与QLoRA
  • 基于神经控制微分方程的采集无关深度学习用于定量MRI参数估计|文献速递-文献分享
  • 无锡嘉饰茂建设网站的公司天河区网站制作