2011-04-28 137 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