谁能解释下面的代码中的static volatile GPIO_Registers* const gpio[]行是什么?

这个块中的(volatile GPIO_Registers*)语法有什么作用?

// GPIO hardware registers
//
typedef struct
{
  uint32_t MODE;
  uint32_t TYPE;
  uint32_t SPEED;
  uint32_t PUSH_PULL;
  uint32_t IDR;
  uint32_t ODR;
  uint32_t BSRR;
  uint32_t LOCK;
  uint32_t ALT_FN1;
  uint32_t ALT_FN2;
} GPIO_Registers;


// Ports can be selected using an enumeration
// (Port) to index into this array.
// Port addresses can be calculated using the enum since
// all ports are at the same offset from each other.
//
static volatile GPIO_Registers* const gpio[] =
{
  (volatile GPIO_Registers*)(GPIO_BASE_ADDR + (PORT_A << 10)),
  (volatile GPIO_Registers*)(GPIO_BASE_ADDR + (PORT_B << 10)),
  (volatile GPIO_Registers*)(GPIO_BASE_ADDR + (PORT_C << 10)),
  (volatile GPIO_Registers*)(GPIO_BASE_ADDR + (PORT_D << 10)),
  (volatile GPIO_Registers*)(GPIO_BASE_ADDR + (PORT_E << 10)),
  (volatile GPIO_Registers*)(GPIO_BASE_ADDR + (PORT_F << 10))
};

最佳答案

static volatile GPIO_Registers* const gpio[]是指向GPIO_Registers变量的指针的静态数组。

数组的每个元素都指向您的SoC / mcu的物理地址。因此,每个元素都指向物理GPIO port。查看您的SoC / mcu数据表以了解详细信息。您会发现SoC的每个GPIO端口都具有GPIO_Registers结构指定的所有32位寄存器。

(volatile GPIO_Registers*)是一种简单的类型转换,由于GPIO_BASE_ADDR和其他定义是简单的“数字”,因此您必须指定这些“数字”的类型。

关于c - c了解结构指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38631127/

10-16 05:03