从库函数操作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)
最新文章
- for xml path 将单表中一个字段用逗号分隔
- foreach为什么要实现IEnumerable接口而不是直接用IEnumerator接口
- 利用GBDT模型构造新特征
- JS思维之路菜鸟也能有大能量(2)--模拟数组合并concat
- myeclipse10安装findbugs
- Check the difficulty of problems
- 关于this指向思考
- saltstack实战2--远程执行之模块(Modules)
- 自己动手写一个编译器Tiny语言解析器实现
- PHP 16: MySql的数据库访问
- 【转】安卓布局:layout_weight的理解
- JS base64 加密和解密
- 自行搭建私有云ownCloud,启用SSL,其他配置
- 咖啡师之路:第一日一杯Espresso
- python模块学习:os模块
- iOS监听模式系列之本地通知Notification
- ML.NET 发布0.11版本:.NET中的机器学习,为TensorFlow和ONNX添加了新功能
- 【网络】IP子网划分详解
- HDU/HDOJ 2087 剪花布条
- centos7 go ENV 部署