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

xiaoxiao2021-02-28  45

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 这种数据结构“的值

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

转载请注明原文地址: https://www.6miu.com/read-2613977.html

最新回复(0)