0

我试图了解 STM-32 Cortex-M4 微控制器中包含的 cmsis 头文件。他们有一个结构是

typedef struct
{
  __IO uint32_t MODER;    /*!< GPIO port mode register,               Address offset: 0x00      */
  __IO uint32_t OTYPER;   /*!< GPIO port output type register,        Address offset: 0x04      */
  __IO uint32_t OSPEEDR;  /*!< GPIO port output speed register,       Address offset: 0x08      */
  __IO uint32_t PUPDR;    /*!< GPIO port pull-up/pull-down register,  Address offset: 0x0C      */
  __IO uint32_t IDR;      /*!< GPIO port input data register,         Address offset: 0x10      */
  __IO uint32_t ODR;      /*!< GPIO port output data register,        Address offset: 0x14      */
  __IO uint16_t BSRRL;    /*!< GPIO port bit set/reset low register,  Address offset: 0x18      */
  __IO uint16_t BSRRH;    /*!< GPIO port bit set/reset high register, Address offset: 0x1A      */
  __IO uint32_t LCKR;     /*!< GPIO port configuration lock register, Address offset: 0x1C      */
  __IO uint32_t AFR[2];   /*!< GPIO alternate function registers,     Address offset: 0x20-0x24 */
} GPIO_TypeDef;

例如,这样写是否有意义:

((GPIO_TypeDef *) 0x08000) -> MODER = 0x12;

我不明白这条线在做什么。如果你这样做,对我来说会更有意义

GPIO_TypeDef * td = 0x08000;
td -> MODER = 0x12;

这些是一样的吗?为什么?

4

1 回答 1

1

struct 是一种巧妙的GPIO_TypeDef地址偏移编码机制。因此,如果我们得到一个指向 GPIOD 基地址的指针,并且我们将该指针转换为一个GPIO_TypeDef结构指针,我们可以使用标准 C 取消引用运算符 (->) 来访问与 GPIOD 基地址有一定偏移的地址。

因此,在您的示例中,从结构指针GPIOD_BASE计算(AHB1PERIPH_BASE + 0x0C00)MODER具有 0x0 的地址偏移量。GPIO_TypeDef这意味着GPIOD_BASE->MODER评估为(AHB1PERIPH_BASE + 0x0C00) + 0x00。这只是 GPIOD 的端口模式寄存器的地址。

这适用于GPIO_TypeDef结构中定义的所有字段。例如,GPIOD_BASE->PUPDR计算结果为(AHB1PERIPH_BASE + 0x0C00) + 0x0C。这只是 GPIOD 的上拉/下拉寄存器的地址。

于 2016-10-19T03:59:14.237 回答