2011-04-28 157 views
1

我正在学习微控制器,我很难理解如何使用联合来设置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只是一个内存地址。

回答

3

这是铸造端口指针volatile unsigned char(8位整数)。你可以做一个类似的宏为你的类型:

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

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

+0

O man ..那么明显大声笑...非常感谢! – user623879 2011-04-28 05:44:45

+0

这被称为'结构覆盖图',用来引用一些术语。 – sherrellbc 2017-02-07 13:12:24