3 . 存储器映射 和 寄存器映射

存储器映射

程序存储器、数据存储器、寄存器和 I/O 端口排列在同一个顺序的 4 GB 地址空间内。也就是被总线连接的部分。我们在编程的时候,也是对这些功能部件进行操作。存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程称为存储器映射,如果再分配一个地址就叫重映射。
在这里插入图片描述

从图 中我们可以看出 ARM 将这 4GB 的存储器空间,平均分成了 8 块区域,每块区域的大小是 512MB,这个容量是非常大的,因此芯片厂商就在每块容量范围内设计各自特色的外设,要注意一点每块区域容量占用越大,芯片成本就越高,所以说我们使用的 STM32 芯片都是只用了其中一部分。ARM 在对这 4GB 容量分块的时候是按照其功能划分,每块都有它特殊的用途。
这是存储器的分布情况
在这 8 个 Block 里面,Block0、Block1 和 Block2 这 3 个块是我们最为关心的。因为它包含了 STM32 芯片的内部 Flash、RAM 和片上外设。

  • Block0 内部功能介绍:

    Block0 主要用于设计片内的 FLASH,STM32F103 系列芯片内部 FLASH 最大是 512KB。要在芯片内部集成更大的 FLASH 或者 SRAM 都意味着芯片成本的增加,所以往往片内集成的FLASH 都不会太大。512KB 的 FLASH 已经足够我们一般的应用开发。从图中可以看到 Block0 内部又划分了好多个功能块,我们按地址从低到高顺序依次介绍:
    0x0000 0000-0x0007 FFFF:取决于 BOOT 引脚,为 FLASH、系统存储器、SRAM 的别名。
    0x0008 0000-0x07FF FFFF:预留。
    0x0800 0000-0x0807 FFFF:片内 FLASH,我们编写的程序就放在这一区域。
    0x0808 0000-0x1FFF EFFF:预留。
    0x1FFF F000-0x1FFF F7FF:系统存储器,里面存放的是 ST 出厂时烧写好的isp 自举程序,用户无法改动。使用串口下载的时候需要用到这部分程序。
    0x1FFF F800-0x1FFF F80F:选 项 字 节 ,用 于 配 置 读 写 保 护 、BOR 级别、软件/硬件看门狗以及器件处于待机或停止模式下的复位。当芯片不小心被锁住之后,我们可以从 RAM 里面启动来修改这部分相应的寄存器位。
    0x1FFF F810-0x1FFF FFFF:预留。
    **

  • Block1 内部区域功能划分
    Block1用于设计片内的SRAM,从图 中可以看到 Block1 内部又划分了几个功能块,我们按地址从低到高顺序依次介绍:
    0x2000 0000-0x2000 FFFF:SRAM,容量为 64KB。
    0x2001 0000-0x3FFF FFFF:预留。

  • Block2 内部区域功能划分
    Block2 用于设计片内外设,根据外设总线速度的不同,Block2 被划分为 AHB 和 APB 两部分,APB 又被分成 APB1 和 APB2 总线。这些都可以在图中看到,
    我们按地址从低到高顺序依次介绍:
    0x4000 0000-0x4000 77FF:APB1 总线外设。
    0x4000 7800-0x4000 FFFF:预留。
    0x4001 0000-0x4001 3FFF:APB2 总线外设。
    0x4001 4000-0x4001 7FFF:预留。
    0x4001 8000-0x4002 33FF:AHB 总线外设。
    0x4002 4400-0x5FFF FFFF:预留。

  • 在Block3/4/5中还包含了FSMC扩展区域,这3个块可用于扩展外部存储器,比如 SRAM,NORFLASH 和 NANDFLASH 等。

寄存器映射

什么是寄存器?

在上一节存储器映射中我们知道Block2 这片区域是用来设计片上外设的,由于Cortex-M3 内核是32 位的,所以存储器内部是以四个字节为一个单元,每一个单元对应不同的功能,当我们控制这些单元时也就可以控制外设。每一个单元还对应一个地址,我们要操作这些单元,也就是通过对应的地址来访问。由于STM32 外设非常多而且复杂,如果每操作一个外设就要写一大串对应的存储单元地址,显然是非常麻烦的而且还极容易出错。因此我们就把每个单元的功能作为名,给这个内存取一个别名,这个别名是我们经常说的寄存器。然后通过C语言指针来操作这些寄存器即可。那什么是寄存器映射呢?给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射
比方说我们找到0x4001 1010 这个单元地址,那么可以通过查阅相关资料了解到此单元具有GPIOC 端口置位/复位功能。因此为了更好区分此单元的功能和方便后续的程序开发,可以给这个单元取一个别名GPIOC_BSRR,那么这个GPIOC_BSRR 就是寄存器,并且这个寄存器地址就是0x4001 1010。这个过程就是寄存器映射。
举例子如下图:在这里插入图片描述

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值