Битовые поля микроконтроллера - PullRequest
1 голос
/ 28 апреля 2011

Я изучаю микроконтроллеры, и мне трудно понять, как можно использовать объединение для установки отдельных битов на порту 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 Ответ

3 голосов
/ 28 апреля 2011

Приводит указатель порта к volatile unsigned char (8-битное целое).Вы можете сделать подобный макрос для вашего типа:

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

и затем получить к нему доступ с помощью PORTDD.Bit.b0.Обратите внимание, что в некоторых случаях вам нужно будет записать ._byte напрямую, если вам нужно убедиться, что несколько битов установлены (или сброшены) в одной записи регистра.Если вы не назовете Bit (просто сделайте его анонимным), ваш компилятор C может позволить вам сократить его до PORTDD.b0.

...