传递硬件寄存器指针

时间:2016-07-26 14:23:22

标签: c++ pointers avr

我正在使用xMega AVR微控制器,并且难以将硬件寄存器作为指针传递。很确定这是指针魔术,但经过漫长的一天后无法理解什么是错误的。

PORTA定义(在GCC-AVR工具链中)如下:

#define PORTA (*(PORT_t *) 0x0600)

这有效:

int main(void)
{
    // This will set GPIO high
    PORTA.DIRSET = 1 << 1;
    PORTA.OUTSET = 1 << 1;

    while(1) {};
}

这不起作用:

void gpio_output_set(PORT_t * port, unsigned char pin)
{
    // This will *NOT* set GPIO high
    port->DIRSET = 1 << pin;
    port->OUTSET = 1 << pin;
}

int main(void)
{
    gpio_output_set(&PORTA, 1);

    while(1) {};
}

为什么?

2 个答案:

答案 0 :(得分:4)

我认为它应该有用。

基本上与

相同
PORT_t* pPort = &*(PORT_t*)0x0600;
pPort->DIRSET = 0x01;

那么为什么这会成为一个问题呢? Atmel Software Framework库也使用它:

void PORT_ConfigureInterrupt0(PORT_t* port, PORT_INT0LVL_t intLevel, uint8_t pinMask);

PORT_ConfigureInterrupt0(&PORTC, PORT_INT0LVL_MED_gc, 0x01);

答案 1 :(得分:1)

你可能应该

  #define PORTA ((PORT_t *) 0x0600)

(演员阵容前没有初始*!)

然后用

之类的内容替换你的set
gpio_output_set(PORTA, (unsigned char)10);