从库函数操作RCC的流程来理解偏移变量

下面是库函数操作RCC流程,看完后有我的疑问:偏移地址的理解

1,库函数直接操作:RCC库函数操作  RCC_APB2PeriphClockCmd ()
RCC->APB2ENR |= RCC_APB2Periph:       //->为结构体运算符,指向RCC结构体内成员APB2ENR
问题引导:RCC中APB2ENR变量APB2ENR寄存器的关系

2,库函数过程定义—RCC_TypeDef成员定义
成员如下:                             
01078   __IO uint32_t CR;         
01079   __IO uint32_t CFGR;       
01080   __IO uint32_t CIR;      
01081   __IO uint32_t APB2RSTR;
01082   __IO uint32_t APB1RSTR;
01083   __IO uint32_t AHBENR;
01084   __IO uint32_t APB2ENR;
01085   __IO uint32_t APB1ENR;
01086   __IO uint32_t BDCR;
01087   __IO uint32_t CSR;     
} RCC_TypeDef;

结构体中申请了10个32位的变量,其中包含APB2ENR变量

3,底层操作:地址定义
#define RCC                 ((RCC_TypeDef *) RCC_BASE)
((RCC_TypeDef *) RCC_BASE):表示在RCC_BASE基地址申请了一个结构体,结构体RCC_TypeDef包含10个Uint32成员 CR,CFGR……;他们在基地址上开辟了连续的10个32变量的存储空间,
上面宏定义把RCC宏定义到stm32RCC寄存器的分配的存储器单元的首地地址,

问题来了: 库函数结构体RCC_TypeDef定义了10个32位的变量,,刚好10个寄存器也是32位的,似乎变量和寄存器对应,但是偏移地址怎么理解。

 

 

 

解答:偏移地址 是对基地址而言,寄存器的绝对地址是基地址加偏移地址。所以一般外设定义时,将基地址赋给变量即可。。而结构体里的分量正好对着偏移地址了。

以RTC的映像地址举个例子:

在stm32f10x.h中可以找到如下定义:

#define PERIPH_BASE           ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */
#define APB1PERIPH_BASE       PERIPH_BASE
#define RTC_BASE              (APB1PERIPH_BASE + 0x2800)

posted on 2016-07-05 15:53  琳summer  阅读(962)  评论(0编辑  收藏  举报

导航