您的位置 首页 IOT

STM32 中 BIT_BAND(位段/位带)和别号区运用入门

一、什么是位段和别名区是这样的,记得MCS51吗?MCS51就是有位操作,以一位(BIT)为数据对象的操作,MCS51可以简单的将P1口的第2位独

一、 什么是位段和别号区

是这样的,记住MCS51吗? MCS51便是有位操作,以一位(BIT)为数据方针的操作,MCS51能够简略的将P1口的第2位独立操作: P1.2=0;P1.2=1 ;这样就把P1口的第三个脚(BIT2)置0置1。而现在STM32的位段、位带别号区就为了完成这样的功用。

它的方针能够是SRAM、I/O和外设空间。要完成对这些当地的某一位的操作。它是这样做的:在寻址空间(32位对应的地址空间为 4GB )的另一当地,取个别号区空间,从这个地址开端处,每一个字(32BIT)对应SRAM或I/O的一位。

这样,1MB SRAM 就能够有 32MB 的对应别号区空间,便是1位胀大到32位(1 BIT 变为1个字节)。咱们对这个别号区空间内的某一字操作(置0或置1),就等于它映射的 SRAM 或 I/O 相应的某地址的某一位的操作。

二、运用位段的优点

简略来说,能够把代码缩小, 速度更快,功率更高,更安全。 一般操作要6条指令,而运用位带别号区只需4条指令。一般操作是 读-改-写的方法, 而位带别号区是 写 操作。避免中止对 读-改-写 的方法的影响。

三、运用阐明

支撑了位带操作(bit_band),有两个区中完成了位带。其间一个是SRAM 区的最低1MB 规模,第二个则是片内外设区的最低1MB 规模。这两个区中的地址除了能够像一般的RAM 相同运用外,它们还都有自己的“位带别号区”,位带别号区把每个比特胀大成一个 32 位的字。 每个比特胀大成一个32 位的字,便是把 1M 扩展为 32M 。

所以,坐落 RAM 地址 0X200000000 的一个字节扩展为8个32 位的字,扩展后每位相对应的的地址是:0X220000000,0X220000004,0X220000008,0X22000000C,0X220000010,0X220000014, 0X220000018,0X22000001C

支撑位带操作的两个内存区的规模是:

0x2000 0000‐0x200F FFFF(SRAM 区中的最低1MB)
0x4000 0000‐0x400F FFFF(片上外设区中的最低1MB)

对 SRAM 位带区的某个比特,记该比特地点字节的地址为A,位序号为 n (0<=n<=7),则它在别号区的地址为:

AliasAddr = 0x22000000 + ((A‐0x20000000)*8+n)*4 =0x22000000 + (A‐0x20000000)*32 + n*4

关于片上外设位带区的某个比特,记该比特地点字节的地址为A,位序号为 n (0<=n<=7),则该比特在别号区的地址为:

AliasAddr = 0x42000000 + ((A‐0x40000000)*8+n)*4 = 0x42000000 + (A‐0x40000000)*32 + n*4

上式中,“*4”表明一个字为 4 个字节,“*8”表明一个字节中有 8 个比特。

把“位带地址+位序号”转化别号地址宏为:

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000 + ((addr &0xFF FFF)<<5) + (bitnum<<2))

把该地址转化成一个指针:

#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
MEM_ADDR(BITBAND( (u32)&CRCValue,1)) = 0x1;

例如点亮LED

运用STM32库:
GPIO_ResetBits(GPIOC, GPIO_Pin_4); //关LED5
GPIO_SetBits(GPIOC, GPIO_Pin_7); //开LED2

一般读操作:
STM32_Gpioc_Regs->bsrr.bit.BR4 =1;// 1:铲除对应的ODRy位为0
STM32_Gpioc_Regs->bsrr.bit.BS7 =1;// 1:设置对应的ODRy位为1

假如运用位带别号区操作:
STM32_BB_Gpioc_Regs->BSRR.BR[4] =1;// 1:铲除对应的ODRy位为0
STM32_BB_Gpioc_Regs->BSRR.BS[7] =1;// 1:设置对应的ODRy位为1

代码比STM32库高效十倍 !

对内存变量的位操作:

SRAM 变量:long CRCValue;

把“位带地址+位序号”转化别号地址宏:

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))

把该地址转化成一个指针:

#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))

对32位变量 的BIT1 置 1 :

MEM_ADDR(BITBAND( (u32)&CRCValue,1)) = 0x1;

对恣意一位( 第23位 ) 判别:

if(MEM_ADDR(BITBAND( (u32)&CRCValue,23))==1)
{

}

四、Cortex-M3中关于位段的界说

Cortex-M3 存储器映像包括两个位段(bit-band)区。这两个位段区将别号存储器区中的每个字映射到位段存储器区的一个位,在别号存储区写入一个字具有对位段区的方针位履行读-改-写操 作的相同作用。

一切STM32F10x外设寄存器都被映射到一个位段(bit-band)区。这个特性在各个函数中对单个比特进行置1/置0操作时被很多运用,用以减小和优化代码尺度。

映射公式映射

公式给出别号区中的每个字是怎么对应位带区的相应位的,公式如下:

bit_word_offset = (byte_offset x 32) + (bit_number × 4)
bit_word_addr = bit_band_base + bit_word_offset

其间:
bit_word_offset是方针位在存取器位段区中的方位
bit_word_addr 是别号存储器区中字的地址,它映射到某个方针位。
bit_band_base 是别号区的开始地址。
byte_offset 是包括方针位的字节在位段中的序号
bit_number 是方针位地点方位(0-31)

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/iot/256597.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部