代码之家  ›  专栏  ›  技术社区  ›  user247954

为什么在atmega微控制器中使用2个指针指向寄存器地址?

  •  1
  • user247954  · 技术社区  · 8 年前

    该行定义了avr微控制器中DDRD寄存器的地址

    #define myDDRD *((volatile unsigned char* const) 0x31)
    

    为什么我们需要第一个星号?第二个不足以指向地址0x31吗?

    1 回复  |  直到 8 年前
        1
  •  8
  •   Andre Kampling    8 年前

    你可以分开 *((volatile unsigned char* const) 0x31) 分为2部分:
    一个内部部件: (volatile unsigned char* const) 0x31
    和一个外部部分: *( inner part ) .

    内部零件 强制转换整数 0x31 volatile unsigned char 常数指针。
    指针类型由类型名和类型名后的星号组成: type* 。要强制转换表达式,括号是用法 (type)expression

    这个 *pointer 以获取其价值。

    想象一个指针 int* intPtr 已指向有效整数。如果你现在想改变这个整数,你必须通过 *intPtr = 42; intPtr = 42; 您将42写入指针值,而不是它所指向的地址,因此42将是指针包含的新地址。

    简而言之:
    宏读取一个字节( unsigned char )发件人地址

    用法:

    myDDRD &= ~(1 << PD0); /* clear bit 0 as PD0 is defined as 0 */
    myDDRD |= (1 << PD1);  /* set bit 1 as PD1 is defined as 1   */
    

    有关位操作的更多信息,请参阅此处: How do you set, clear, and toggle a single bit?