微控制器位域

时间:2011-04-28 05:25:13

标签: struct union microcontroller bit-fields

我正在学习微控制器,我很难理解如何使用联合在gpio端口上设置单个位。

typedef union _BYTE
{
    byte _byte;
    struct
    {
        unsigned b0:1;
        unsigned b1:1;
        unsigned b2:1;
        unsigned b3:1;
        unsigned b4:1;
        unsigned b5:1;
        unsigned b6:1;
        unsigned b7:1;
    }Bit;
} BYTE;

我使用上面的方法来访问一个字节的各个位,但是如何使用它来按以下方式分配io端口值?

MCF_GPIO_PORTDD.Bit.b0 = 1;

我宁愿不分配一种_BYTE,然后将端口分配给它。

#define MCF_GPIO_PORTDD             (*(vuint8 *)(&__IPSBAR[0x100009]))

MCF_GPIO_PORTDD只是一个内存地址。

1 个答案:

答案 0 :(得分:3)

它正在将端口指针转换为volatile unsigned char(8位int)。您可以为您的类型制作类似的宏:

#define PORTDD  (*(volatile BYTE *)(&__IPSBAR[0x100009]))

然后使用PORTDD.Bit.b0访问它。请注意,在某些情况下,如果需要确保在单个寄存器写入中设置(或清除)多个位,则需要直接写入._byte。如果你没有命名Bit(只是匿名)你的C编译器可能会让你缩短为PORTDD.b0