传递端口地址功能

时间:2013-12-04 00:47:09

标签: c++ pointers struct avr

如何从此定义中检索指针?

定义:#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 个答案:

答案 0 :(得分:1)

define #define SPIE (*(SPI_t *) 0x0AC0正在为位于0x0AC0的4个字节的内存创建一个符号名称(SPIE)。即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位寄存器,所以我认为它不会很好用。