新手请教 - 关于bit-band

2019-03-24 10:45发布

本帖最后由 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。这不是矛盾了吗?


此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
Study_Stellaris
1楼-- · 2019-03-24 14:46
< 首先,两种方式都可以对 GPIO 进行操作,只不过这个 API 函数 GPIOPinWrite 他选择不用位带而已,就这么简单。
mangoal
2楼-- · 2019-03-24 17:17
 精彩回答 2  元偷偷看……
Study_Stellaris
3楼-- · 2019-03-24 19:22
mangoal 发表于 2014-11-6 01:28
我理解是GPIO读写函数一次可以操作多个位的,所以不能用位地址操作

是这么个意思

一周热门 更多>

相关问题

    相关文章