本帖最后由 I_am_ok42 于 2014-11-5 13:40 编辑
按我的理解,bit-band就是利用额外的存储空间(bit-band alias),将bit-band region的每个字节的每个位存放到bit-band alias中,实现硬件上的直接位操作。所以要对bit-band region进行位操作的话,实际访问的应该是bit-band alias中相对应的映射地址。SRAM和外设可以利用bit-band来实现位操作。
我看了一下TI的例程。对SRAM的位操作宏定义为:
#define HWREGBITW(x, b)
HWREG(((uint32_t)(x) & 0xF0000000) | 0x02000000 |
(((uint32_t)(x) & 0x000FFFFF) << 5) | ((b) << 2))
也就是说,它是按照 位带别名 = 位带基址 + (字节偏移量 * 32) + (位编号 * 4)的公式
通过bit-band alias来对bit-band region进行位操作的。这个我能理解。
但是对外设的操作却不是这样的。
比如对PORTF.2的写操作,调用的是:
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2),
GPIOPinWrite函数为:
void GPIOPinWrite(uint32_t ui32Port, uint8_t ui8Pins, uint8_t ui8Val)
{
//
// Check the arguments.
//
ASSERT(_GPIOBaseValid(ui32Port));
//
// Write the pins.
//
HWREG(ui32Port + (GPIO_O_DATA + (ui8Pins << 2))) = ui8Val;
}
其中GPIO_PORTF_BASE = 0x40025000,即取的是GPIOF的bit-band region地址, 为什么取得不是对应的bit-band alias地址 - 0x420025000。这不是矛盾了吗?
此帖出自
小平头技术问答
是这么个意思
一周热门 更多>