zoukankan      html  css  js  c++  java
  • 从库函数操作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)

  • 相关阅读:
    bzoj4028 [HEOI2015]公约数数列
    bzoj4766 文艺计算姬
    bzoj4241 历史研究
    bzoj3744 Gty的妹子序列
    bzoj4540 [Hnoi2016]序列
    uoj#228 基础数据结构练习题
    bzoj2467 [中山市选2010]生成树
    bzoj2125 最短路
    bzoj4800 [Ceoi2015]Ice Hockey World Championship
    bzoj2463 [中山市选2009]谁能赢呢?
  • 原文地址:https://www.cnblogs.com/caolinsummer/p/5643942.html
Copyright © 2011-2022 走看看