【嵌入式系统】存储器映射与寄存器映射原理

【嵌入式系统】存储器映射与寄存器映射原理

一、存储器映射

在这里插入图片描述

图1 存储器映射

存储器在产家制作完成后是一片没有任何信息的物理存储器,而CPU要进行访存就涉及到内存地址的概念,因此存储器映射就是为物理内存按一定编码规则分配地址的行为。值得注意,存储器映射一般是由产家规定,用户不能随意更改。
在这里插入图片描述

图2 STM32芯片存储器映射
注1

STM32中,I-Code Bus与D-Code Bus默认映射到0x00000000 ~ 0x1FFFFFFF内存地址段;AHB系统总线默认映射到0x20000000 ~ 0xDFFFFFFF和0xE0100000 ~ 0xFFFFFFFF两个内存地址段;APB外设总线默认映射到0xE0040000 ~ 0xE00FFFFF内存地址段,但由于TPIU、ETM以及ROM表占用部分空间,实际可用地址区间为0xE0042000~0xE00FF000

二、寄存器映射

寄存器映射是在存储器映射的基础上进行的。

以STM32为例,操作硬件本质上就是操作寄存器。在存储器片上外设区域,四字节为一个单元,每个单元对应不同的功能。当我们控制这些单元时就可以驱动外设工作,我们可以找到每个单元的起始地址,然后通过C 语言指针的操作方式来访问这些单元。但若每次都是通过这种方式访问地址,不好记忆且易出错。这时我们可以根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名实质上就是寄存器名字。给已分配好地址(通过存储器映射实现)的有特定功能的内存单元取别名的过程就叫寄存器映射
在这里插入图片描述

图3 寄存器映射

下面以GPIO寄存器CRL为例,先给出CRL定义如下:

typedef struct
{
  __IO uint32_t CRL;
  __IO uint32_t CRH;
  __IO uint32_t IDR;
  __IO uint32_t ODR;
  __IO uint32_t BSRR;
  __IO uint32_t BRR;
  __IO uint32_t LCKR;
} GPIO_TypeDef;

在实际使用时,会有GPIOA->CRL=0x0000 0000这种写法,表示将16进制数0赋值给GPIOA的CRL寄存器所在的存储单元。而GPIOA->CRL就构造了一个寄存器映射。具体过程如下:

#define PERIPH_BASE      ((uint32_t)0x40000000) 

这里属于存储器级别的映射,将外设基地址映射到0x40000000,可对应图2

#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)

这里对外设基地址进行偏移量为0x10000的地址偏移,偏移到APB2总线对应外设区。

#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)

这里对APB2外设基地址进行偏移量为0x0800的地址偏移,偏移到GPIOA对应区域。

#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)

这里将GPIOA宏定义为GPIOA基地址经过强制类型转换为GPIO_TypeDef的指针,这样的作用是使GPIOA结构体内对应的成员按顺序填充内存区域,如图3所示。因此GPIOA的CRL寄存器就是作为GPIOA基地址后的第一个内存块,GPIOA->CRL的本质就是这个内存块的地址,或者说是用GPIOA->CRL给这个地址取了个形象的别名,即寄存器映射。


🔥 更多精彩专栏


👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇
  • 31
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
存储器映射是为物理内存按照一定的编码规则分配地址的行为,由芯片厂商或用户规定,用户不能随意更改。存储器映射将程序存储器、数据存储器寄存器和I/O端口排列在同一个顺序的地址空间内,以便进行访存操作。\[1\]\[2\] 寄存器映射是给已经分配好地址的具有特定功能的内存单元取别名的过程。通过给这些内存单元取别名,即寄存器,可以更好地区分其功能并方便后续的程序开发。例如,通过寄存器映射,可以将一个内存单元的地址0x4001 1010取别名为GPIOC_BSRR,并且这个寄存器的地址就是0x4001 1010。这样的映射过程就是寄存器映射。\[3\] 因此,存储器映射寄存器映射都是为了方便对内存单元进行访问和操作,其中存储器映射是为整个物理内存分配地址,而寄存器映射是为具有特定功能的内存单元取别名。 #### 引用[.reference_title] - *1* [【嵌入式系统存储器映射寄存器映射原理](https://blog.csdn.net/FRIGIDWINTER/article/details/106826511)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [3 . 存储器映射寄存器映射](https://blog.csdn.net/weixin_41043617/article/details/116034629)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Winter`

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值