正在传递硬件寄存器指针

Passing hardware register pointer

本文关键字:寄存器 指针 硬件      更新时间:2023-10-16

我正在摆弄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);

您可能应该有

  #define PORTA ((PORT_t *) 0x0600)

(铸造前没有初始*!)

然后用之类的东西替换set线路

gpio_output_set(PORTA, (unsigned char)10);