2018 -0518 C语言与STM32中的RCC指针问题

1.用指针访问结构体的成员

   有两种方法: ① 使用->运算符

                          首先love是一个结构变量:

                 struct book love = {
                       .name  ="C primer",
                       .autor ="jack",
                    .time = 50
                 };

                          index = &love ,那么 index->name ,就相当于 love.name。

其中注意 运算符"->" 与"."的工作方式相同,  都是取出结构体中的一个成员,但是 "->"前面是指向结构体的指针

而 "." 前面是一个结构名!

                      ② 使用"."

                        index = &love,    (*index).name 。


2. STM32 中 关于RCC的问题

                                 RCC->APB2ENR|=1<<3;

    这里是使能GPIOB 类I/O口时钟的寄存器操作指令,这里表明了RCC是一个指向结构体的指针,而在其头文件中有

                    #define RCC                 ((RCC_TypeDef *) RCC_BASE)
    这里之前一直看不懂什么意思现在明白了,我们先找到对于RCC_TypeDef的定义:
typedef struct
{
  __IO uint32_t CR;
  __IO uint32_t CFGR;
  __IO uint32_t CIR;
  __IO uint32_t APB2RSTR;
  __IO uint32_t APB1RSTR;
  __IO uint32_t AHBENR;
  __IO uint32_t APB2ENR;
  __IO uint32_t APB1ENR;
  __IO uint32_t BDCR;
  __IO uint32_t CSR;

#ifdef STM32F10X_CL  
  __IO uint32_t AHBRSTR;
  __IO uint32_t CFGR2;
#endif /* STM32F10X_CL */ 

#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)   
  uint32_t RESERVED0;
  __IO uint32_t CFGR2;
#endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */ 
} RCC_TypeDef;

    发现RCC_TypeDef是一个结构变量,对于结构变量我们其实可以把他理解为像int flot 这种的数据类型,只不过这种数据类型可以包括很多中(结构体中可以有 int char 各种类型的组合),那么现在我们再来看刚刚对于RCC的定义

#define RCC                 ((RCC_TypeDef *) RCC_BASE)

 (RCC_TyprDef*)其实就是一种数据类型加上* 相当于(int *)这种的强制转换,也就是说(RCC_TyprDef*)是将后面的RCC_BASE 强制转换为   RCC_TyprDef 这种数据结构的指针 并将其定义为RCC ,

    在stm32中是知道寄存器的内存地址的,这个地址比如0x008000是一个整数,可是编译器只知道它是一个整数不知道它是寄存器的地址,所以通过这样一个强制转化,将相应RCC_BASE(寄存器地址)转化为RCC_TyprDef 这种数据结构的指针:

    意思就是:把这个值RCC_BASE转化为一个地址,并且这个地址指向的内容是RCC_TyprDef 这种数据结构“的值

所以定义这样一个指向寄存器的指针后 ,我们就可以使用运算符->来取其中相应寄存器的值进行操作

你可能感兴趣的:(2018 -0518 C语言与STM32中的RCC指针问题)