Передача адреса порта в функцию

Как мне получить указатель из этого определения?

Определение: #define SPIE (*(SPI_t *) 0x0AC0) /* Serial Peripheral Interface */ и адрес регистра 0x0AC0, SPI_t — это структура, определенная ниже в заголовочном файле:

/* Serial Peripheral Interface */
typedef struct SPI_struct
{
register8_t CTRL;  /* Control Register */
register8_t INTCTRL;  /* Interrupt Control Register */
register8_t STATUS;  /* Status Register */
register8_t DATA;  /* Data Register */
} SPI_t;

Я действительно понятия не имею, что происходит в определении. Похоже, указатель приводится к структуре, но я не уверен.
Что мне нужно это uint16_t* указатель, так что я могу передать его функции. С помощью spi mySpi( &PORTB); с конструктором

spi::spi(volatile uint16_t* reg)
{
spiReg = reg;
} //spi

результаты в Error 1 no matching function for call to 'spi::spi(PORT_t*)'

1

Решение

Определение #define SPIE (*(SPI_t *) 0x0AC0 создает символическое имя (SPIE) для 4 байтов памяти, расположенных в 0x0AC0. То есть 0x0AC0 это регистр управления, 0x0AC1 это регистр управления прерываниями и так далее.

Ваш код C должен ссылаться на них, как

SPIE.CTRL = 7; // set low 3 bits for some reason
SPIE.INTCTRL = 4; // set 3rd bit, disable all others

Чтобы получить адрес, вы можете «взять адрес» как обычно: &SPIE, Это будет 0x0AC0 при оценке, но будет иметь тип SPI_t *,

Ваш конструктор принимает 16-битный регистр, но SPIE определяет только 8-битные регистры, поэтому я не думаю, что он сработает так хорошо.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector