Cortex M3中的Bit-band位操作(3)
 
- UID
- 1029342
- 性别
- 男
|

Cortex M3中的Bit-band位操作(3)
下面的公式给出了Bit-banded空间地址到Bit-band别名空间地址的计算方法:
bit_word_offset = (byte_offset x 32) +(bit_number x 4)
bit_word_addr = bit_band_base +bit_word_offset
其中:
bit_word_offset: 目标位在Bit-banded空间中的字节地址对应的在Bit-band别名空间中的字地址的偏移量。
bit_word_addr: 目标位在Bit-banded空间中的字节地址对应的在Bit-band别名空间中的字地址。
bit_band_base: Bit_band别名空间的基地址。
byte_offset: 目标位在Bit_banded空间中的字节地址的偏移量。
bit_number: 目标位在所在字节中的位置,取0-7。
下面为SRAM空间中Bit_banding应用中地址转换关系的四个例子:
(1)Bit_band空间别名地址:0x23FF.FFE0,Bit_banded空间地址:0x200F.FFFF,位:0。计算公式:
0x23FF.FFE0 = 0x2200.0000 + (0x000F.FFFF *32) + (0 * 4)
(2)Bit_band空间别名地址:0x23FF.FFFC,Bit_banded空间地址:0x200F.FFFF,位:7。计算公式:
0x23FF.FFFC = 0x2200.0000 + (0x000F.FFFF *32) + (7 * 4)
(3)Bit_band空间别名地址:0x2200.0000,Bit_banded空间地址:0x2000.0000位:0。计算公式:
0x2200.0000 = 0x2200.0000 + (0x2000.0000 *32) + (0 * 4)
(4)Bit_band空间别名地址:0x2200.0000,Bit_banded空间地址:0x2000.0000位:7。计算公式:
0x2200.001C = 0x2200.0000 + (0x2000.0000 *32) + (7 * 4)
在Luminary公司给的Stellaris系列ARM的驱动库中,hw_types.h中有如下几个代码:
#defineHWREG(x) (*((volatile unsigned long *)(x)))
#defineHWREGH(x) (*((volatile unsigned short *)(x)))
#defineHWREGB(x) (*((volatile unsigned char *)(x)))
#define HWREGBITW(x,b) HWREG(((unsigned long)(x) & 0xF0000000) |0x02000000| \
(((unsigned long)(x) & 0x000FFFFF)<< 5) | ((b)<< 2))
#define HWREGBITH(x,b) HWREGH(((unsigned long)(x) & 0xF0000000) |0x02000000| \
(((unsigned long)(x) & 0x000FFFFF)<< 5) | ((b)<< 2))
#define HWREGBITB(x, b) HWREGB(((unsigned long)(x) & 0xF0000000) |0x02000000| \
(((unsigned long)(x) & 0x000FFFFF)<< 5) | ((b)<< 2))
HWREG(x)、HWREGH(x)、HWREGB(x)分别定义了长度为字、半字、字节的寄存器访问宏,利用他们可以进行读写操作。
HWREGBITW(x, b)、HWREGBITH(x, b)、HWREGBITB(x, b)则分别定义了长度为字、半字、字节的寄存器的Bit-banding位操作宏,可以实现单独对位操作。其算法就是上面提到的公式。 |
|
|
|
|
|