下面的oop结构是什么?
what is the following oop structure here?
下面代码中变量在哪里,变量类型在哪里?我们在这里更改了寄存器的属性。
如果它是面向对象的,那么我们需要一个对象名称来更改其属性。
在这里我看不到类型在哪里变量名在哪里以及我们如何更改其内部属性?
#include <stm32f0xx.h>
int main(void)
{
RCC->AHBENR|=RCC_AHBENR_GPIOCEN ;
GPIOC->MODER|=GPIO_MODER_MODERG_O ;
}
这与OOP无关,它只是一个结构体成员赋值。 RCC
和 GPIOC
定义在 stm32f0xx.h:
#define RCC ((RCC_TypeDef *) RCC_BASE)
和
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
其中RCC_BASE
和GPIOC_BASE
定义在与abaolute地址相同的头中,RCC_TypeDef
和GPIO_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 为每个外设的寄存器组定义结构,然后定义将结构映射到每个外设所在地址的宏。
下面代码中变量在哪里,变量类型在哪里?我们在这里更改了寄存器的属性。
如果它是面向对象的,那么我们需要一个对象名称来更改其属性。
在这里我看不到类型在哪里变量名在哪里以及我们如何更改其内部属性?
#include <stm32f0xx.h>
int main(void)
{
RCC->AHBENR|=RCC_AHBENR_GPIOCEN ;
GPIOC->MODER|=GPIO_MODER_MODERG_O ;
}
这与OOP无关,它只是一个结构体成员赋值。 RCC
和 GPIOC
定义在 stm32f0xx.h:
#define RCC ((RCC_TypeDef *) RCC_BASE)
和
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
其中RCC_BASE
和GPIOC_BASE
定义在与abaolute地址相同的头中,RCC_TypeDef
和GPIO_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 为每个外设的寄存器组定义结构,然后定义将结构映射到每个外设所在地址的宏。