我在玩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) {};
}


为什么?

最佳答案

我认为应该可以。

本质上与

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


那么为什么这应该是一个问题呢? Atmel软件框架库也使用此库:

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

PORT_ConfigureInterrupt0(&PORTC, PORT_INT0LVL_MED_gc, 0x01);

关于c++ - 传递硬件寄存器指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38592506/

10-11 18:36