结构指针访问微控制器上的寄存器?

时间:2016-10-19 03:30:06

标签: c arm cortex-m cmsis

我试图了解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;

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

1 个答案:

答案 0 :(得分:1)

GPIO_TypeDef结构是一种用于编码地址偏移的聪明机制。因此,如果我们给出一个指向基本GPIOD地址的指针,并且我们将该指针转换为GPIO_TypeDef结构指针,我们可以使用标准C解除引用运算符( - &gt;)来访问与基数偏移的地址GPIOD地址。

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

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