前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >位带操作

位带操作

作者头像
mindtechnist
发布2024-08-08 17:13:36
770
发布2024-08-08 17:13:36
举报
文章被收录于专栏:机器和智能

位带操作实现了通过普通的加载/存储等指令对单一的1bit进行读写的功能。也就是说把1bit膨胀为32bit的字来操作(位带操作就是用一个地址代表一个比特,正常来说一个地址代表的是32bit,一次性操作的也是32bit)。

比如:

代码语言:javascript
复制
#define LED0 PBout(1) //其中 PBout(1)是位带操作

我们直接

代码语言:javascript
复制
LED0 = 1;

通过这个位带操作直接将IO口PB1置为了高电平,也就是通过位带操作直接改变了某一bit的值。

而普通的操作比如

代码语言:javascript
复制
int a = 1;

是将a所代表的内存最低位置为1,其余31bit置为0,这是直接操作了32bit内存。

CM3在两个区实现了位带

\1. SRAM区的低1M字节: 位带区 0x2000 0000 ~ 0x200F FFFC 对应别名区 0x2200 0000 ~ 0x23FF FFFC \2. 片上外设低1M字节: 位带区 0x4000 0000 ~ 0x400F FFFC 对应别名区 0x4200 0000 ~ 0x43FF FFFC

下面通过0x40000000的8个bit举例说明位带区和别名区的关系

位带区

别名区

0x4000 0000 bit1

0x4000 0000

0x4000 0000 bit2

0x4000 0004

···

···

0x4000 0000 bit8

0x4000 001C

通过表格可以看到,位带区的一个bit对应别名区的1个字即32bit,位带区每移动一个bit,别名区移动一个字。因为位带操作是用32bit来操作1bit,而每一个地址代表了8bit,所以别名区地址每次移动(32 / 8)。这就是通过别名区把位带区的1个bit膨胀为32bit。

别名区地址的求解公式如下

别名区地址 = 别名区基址 + ((位带区地址 - 位带区基址)* 8 + bit位) * 4

通过一段代码实例来深入理解

代码语言:javascript
复制
#define BITBAND(addr, bitnum) ((addr & 0xF0000000) + 0x20000000 + \
                              ((addr & 0xFFFFF) << 5) + (bitnum << 2))
//addr & 0xFFFFF相当于 addr - 位带基址
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
#define GPIOA_ODR_Addr 0x40020014   //GPIOA的输出寄存器地址
#define PAout(n) BIT_ADDR(GPIO_ODR_Addr, n)

//代码参考正点原子《STM32F429开发指南-HAL库版本_V1.1》

下面就可以通过

代码语言:javascript
复制
PAout(1) = 1;

直接将GPIOA的bit1置1,即引脚PA1置1.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器和智能 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档