首页 > 解决方案 > 这里的以下 oop 结构是什么?

问题描述

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

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

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

#include <stm32f0xx.h>

int main(void)
{
  RCC->AHBENR|=RCC_AHBENR_GPIOCEN ;
  GPIOC->MODER|=GPIO_MODER_MODERG_O ;
}

标签: c++oopembeddedvar

解决方案


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

#define RCC                 ((RCC_TypeDef *) RCC_BASE)

#define GPIOC               ((GPIO_TypeDef *) GPIOC_BASE)

whereRCC_BASEGPIOC_BASEare 与 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) ;

0x40021000RCC 的基地址在哪里,anAHBENR是指设置了 GPIOC 使能标志的 RCC 寄存器。

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


推荐阅读