GD32位带操作 --- 特点和应用场景

Cortex-M4处理器提供了位带功能,允许原子操作单个比特,减少了读-改-写操作。位带别名区映射每个比特为32位字,便于访问和修改。此功能常用于控制寄存器位操作,保证原子性,适用于多任务环境,以及位图和通信协议的位级操作。
摘要由CSDN通过智能技术生成

一:为了减少“读-改-写”操作的次数,Cortex®-M4处理器提供了一个可以执行单原子比特操作的

位 带功能。存储器映射包含了两个支持位带操作的区域。其中一个是SRAM区的最低1MB范围,

第二个是片内外设区的最低1MB范围。这两个区域中的地址除了普通应用外,还有自己的“位

带别名区”。位带别名区把每个比特扩展成一个32位的字。当用户访问位带别名区时,就可以达

到访问原始比特的目的。

下面的公式表明了位带别名区中的每个字如何对应位带区的相应比特或目标比特。

bit_word_addr =bit_band_base +(byte_offset×32)+(bit_number×4) (1-1)

其中:

        1.bit_word_addr指的是位带区目标比特对应在位带别名区的地址;

        2.bit_band_base指的是位带别名区的起始地址;

        3.byte_offset指的是位带区目标比特所在的字节的字节地址偏移量;

        4.bit_number指的是目标比特在对应字节中的位置(0-7)。

例如,要想访问0x2000 0200地址的第7位, 可访问的位带别名区地址是:

bit_word_addr = 0x2200 0000 + (0x200 * 32)+ (7 * 4)= 0x2200 401C (1-2)

如果对0x2200 401C进行写操作,那么0x2000 0200的第7位将会相应变化;如果对0x2200

401C进行读操作,那么视0x2000 0200的第7位状态而返回0x01或0x00。(来源GD32手册)

        在GD32单片机中,位带别名是一种用于对单个位进行操作的技术。它允许你以类似于访问普通变量的方式来访问单个位,而不需要手动进行位运算。

位带别名是通过将特定的位映射到单独的内存地址来实现的。这样,你可以像访问普通变量一样对这些位进行读取和写入操作,而不必担心位运算和掩码操作。

在GD32单片机中,位带别名的内存区域称为位带区域(Bit-Band Region)。位带区域的地址范围通常是从0x20000000到0x200FFFFF,这个范围可以根据具体的芯片型号而有所不同。

使用位带别名时,你需要定义一个指针变量,将其指向需要操作的位所在的位带区域地址。然后,你可以通过这个指针变量来读取和写入位的值,就像读写普通的变量一样。

以下是一个简单的示例代码,演示了如何使用位带别名来对单个位进行操作:

#include <stdint.h>

// 定义一个位带别名指针
#define BIT_BAND_ALIAS(address, bit) (*((volatile uint32_t*)((address & 0xF0000000) + 0x02000000 + ((address & 0xFFFFF) << 5) + (bit << 2))))

int main() {
    // 假设我们要操作的位位于地址0x20000000的位带区域中的第0位
    uint32_t* bitBandAlias = &BIT_BAND_ALIAS(0x20000000, 0);

    // 将该位设置为1
    *bitBandAlias = 1;

    // 读取该位的值
    uint32_t bitValue = *bitBandAlias;

    return 0;
}

在这个示例中,我们定义了一个位带别名指针 bitBandAlias ,它指向地址为0x20000000的位带区域中的第0位。我们可以通过 *bitBandAlias 来读取和写入该位的值。在示例中,我们将该位设置为1,然后读取该位的值。

总结:位带别名就是将大小位1M的内存区域,按照其中的每一个位膨胀成一个int四字节单元额外分配一个虚拟32M 大小的地址,无论是位带区还是位带别名区都有自己的起始地址,根据位带区中bit的偏移量确定其映射在位带别名区int地址的偏移量,只要操作位带别名区int虚拟单元的0/1,就可以修改位带区的位,将一个位膨胀成一个int从而实现修改位,而无需进行位操作。

二:应用场景和优势

  1. 控制寄存器的位操作:在单片机中,有许多寄存器用于控制硬件设备的状态和功能。使用位带别名可以方便地对这些寄存器的特定位进行读写操作,例如控制GPIO引脚的状态、设置定时器的工作模式等。

  2. 位操作的原子性要求:在多任务或多线程的应用程序中,对某些共享的位进行读写操作可能会引发竞态条件和数据不一致的问题。使用位带别名可以确保对位的操作是原子性的,从而避免这些问题的发生。

  3. 位字段的操作:在某些情况下,需要对一个字节或一个字中的多个位进行操作,例如对数据包的标志位进行设置或清除。使用位带别名可以方便地进行位字段的操作,提高代码的可读性和可维护性。

  4. 位级编码和解码:在某些通信协议或数据传输中,需要对数据进行位级的编码和解码。使用位带别名可以方便地进行位级操作,例如将数据按位切割、合并或解析。

  5. 位图操作:在图形显示、图像处理或图形界面设计中,位图是一种常见的数据结构。使用位带别名可以方便地对位图进行操作,例如设置像素点的颜色、绘制图形或进行图像处理算法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值