这里下面的oop结构是什么?

问题描述 投票:0回答:1

在下面的代码中,变量在哪里,变量类型在哪里?我们在这里更改了寄存器的属性。

如果它是面向对象的,那么我们需要一个对象名称来更改其属性。

在这里,我看不到类型在哪里,变量名在哪里,以及我们如何精确地更改其内部属性?

#include <stm32f0xx.h>

int main(void)
{
  RCC->AHBENR|=RCC_AHBENR_GPIOCEN ;
  GPIOC->MODER|=GPIO_MODER_MODERG_O ;
}
c++ oop embedded var
1个回答
1
投票

这与OOP无关,它只是一个结构成员分配。 RCCGPIOCstm32f0xx.h中定义:

#define RCC                 ((RCC_TypeDef *) RCC_BASE)

#define GPIOC               ((GPIO_TypeDef *) GPIOC_BASE)

[RCC_BASEGPIOC_BASE与abaolute地址定义在同一标头中,并且RCC_TypeDefGPIO_TypeDef是结构类型-例如:

typedef struct
{
  __IO uint32_t MODER;        /*!< GPIO port mode register,                                  Address offset: 0x00 */
  __IO uint16_t OTYPER;       /*!< GPIO port output type register,                           Address offset: 0x04 */
  uint16_t RESERVED0;         /*!< Reserved,                                                                 0x06 */
  __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 uint16_t IDR;          /*!< GPIO port input data register,                            Address offset: 0x10 */
  uint16_t RESERVED1;         /*!< Reserved,                                                                 0x12 */
  __IO uint16_t ODR;          /*!< GPIO port output data register,                           Address offset: 0x14 */
  uint16_t RESERVED2;         /*!< Reserved,                                                                 0x16 */
  __IO uint32_t BSRR;         /*!< GPIO port bit set/reset registerBSRR,                     Address offset: 0x18 */
  __IO uint32_t LCKR;         /*!< GPIO port configuration lock register,                    Address offset: 0x1C */
  __IO uint32_t AFR[2];       /*!< GPIO alternate function low register,                Address offset: 0x20-0x24 */
  __IO uint16_t BRR;          /*!< GPIO bit reset register,                                  Address offset: 0x28 */
  uint16_t RESERVED3;         /*!< Reserved,                                                                 0x2A */
}GPIO_TypeDef;

因此在以下位置扩展宏:

RCC->AHBENR|=RCC_AHBENR_GPIOCEN ;

解析为:

((RCC_TypeDef*)0x40021000)->AHBENR |= ((uint32_t)0x00080000) ;

[0x40021000是RCC的基地址,AHBENR指的是设置了GPIOC使能标志的RCC寄存器。

stm32f0xx.h定义每个外设的寄存器集的结构,然后定义宏,这些宏将结构映射到每个外设所驻留的地址。

© www.soinside.com 2019 - 2024. All rights reserved.