二、运用位段的优点
三、运用阐明
0x2000 0000‐0x200F FFFF(SRAM 区中的最低1MB)
0x4000 0000‐0x400F FFFF(片上外设区中的最低1MB)
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库:
一般读操作:
假如运用位带别号区操作:
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中关于位段的界说
映射公式映射
公式给出别号区中的每个字是怎么对应位带区的相应位的,公式如下:
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)