【STM32】STM32存储映射

2023-10-27

存储映射

stm32f40xx的存储映射图

这幅图很重要,至于为什么,我还没编好。
在这里插入图片描述

STM32存储空间有多大?

芯片能访问的存储空间有多大?为什么?

这个是由芯片内 CPU 的地址总线的数量决来定的,STM32 芯片内部的地址总线为32 根,1根地址线,可以传输的地址为0和1,那么理论上就可以访问2个字节。2根地址线,可以传输地址为00、01、10、11,理论上可以访问 4 个字节。32根地址线可以访问2^32个地址,理论上可以访问4G字节的存储器空间

但是平时我们用的单片机真的会有4G那么大的存储空间么

答案当然不是。一个小小的单片机怎么可能有4GB的存储空间!,这个4GB的是STM32理论分配的地址空间。也就是说实际上并不是有这么大的存储单元。可以看到有很多预留的地址,这些地址并没有给他分配存储单元。

所有的存储器都是与地址线连着的,但是实际上如果你只接了一个 1M 的存储器,而且是从0地址开始映射的,那么32 根地址线所产生的0~1M 的地址信号其实才是有意义的,因为这些地址信号才有对应真实的存储器,而所产生的1M 以上地址信号其实并无意义,因为并不对应真实的存储器。

STM32中的32是32根地址线的意思吗?

STM32是32位单片机,每次处理数据都是32bit的形式,所以stm32位带操作把寄存器的某个bit膨胀为32位就是为了能够快速进行操作。
STM32 内部的寄存器大小也都是 32 位的,刚好等于位宽。
某个芯片是 32 位的,但是它的地址线完全可以只有 16 根、或者 8 根。

什么是存储器映射

STM32的所有片上外设其实都可以看作寄存器,所以所有的这些存储器都需要被映射,只是理论上的4G范围远远大与实际的存储器空间,也就说实际的存储器空间并没有4G。很多都是reserved。

存储器本身没有地址,给存储器分配地址的过程叫存储器映射。
在存储器Block2这块区域,也就是地址从0x4000000—0x5FFFFFF这块区域,这是片上外设对应的区域,以四个字节为一个单元,共32bit,一般来说STM32描述外设的寄存器是32bit的。

我们用c语言设定这些寄存器的值,就可以控制这些单元时就可以驱动外设工作。链接: 操作寄存器

启动时的地址重映射

单片机的自举就是单片机的启动,我们说,单片机程序基本都是从0地址出开始运行的,F429的0x00000000-0x001FFFFF地址映射了到什么存储器上,那么就从该存储器上读取指令,开始运行。

至于说0x00000000-0x001FFFFF到底映射在了什么存储器上,这个要看F429 芯片 BOOT1、BOOT0这两个引脚的电平值,说白了就是,通过BOOT1和BOOT0 引脚的电平值,可以选择将0x00000000-0x001FFFFF映射到不同的存储器上。
在这里插入图片描述
但是我们可以看到 无论哪种方式好像都需要将启动这部分地址(1MB)映射到不同的位置。

STM32片内的FLASH分成两部分:主存储块、信息块。主存储块(主Flash)用于存储程序,我们写的程序一般存储在这里。信息块又分成两部分:系统存储器(系统FLASH)、选项字节。系统存储器存储用于存放在系统存储器自举模式下的启动程序(BootLoader),当使用ISP方式加载程序时,就是由这个程序执行。这个区域由芯片厂写入BootLoader,然后锁死,用户是无法改变这个区域的。选项字节存储芯片的配置信息及对主存储块的保护信息。
在这里插入图片描述
如果是选择从主Flash启动,那么在调试或者下载的时候会把代码下载到0x08000000-0x081F FFFF这个实际地址,而CPU运行时**,会把0x00000000-0x001F FFFF对应的地址指向实际的主Flash。**

疑问:下载时,能不能使用 0x0000 0000 地址来下载?

答:这个不行,因为下载时还没有使用boot引脚进行选择,0x0000 0000 - 0x001F FFFF 还没有被重映射到flash上,只能使用 0x0800 0000来下载。

ARM芯片的地址重映射解释

个人理解:把地址理解为指针,就是重新把这个指针指向别的实际位置。
也就是输入一个地址,经过设置后,地址解释器把它指向了别的物理地址。比如设置BOOT的主Flash模式,输入0x0000 0000地址解释器解释成0x0800 0000。

普通单片机如下图所示,输入量是地址,输出的是对应地址上存储的数据,中间方式暂且不论,可以理解为,输入一个地址,存储器会给我们一个数据。在这里插入图片描述
在这里插入图片描述
ARM芯片与普通单片机在存储器地址方面的不同在于:ARM芯片中有些物理存储单元的地址可以根据设置变换。就是说一个物理存储单元现在对应一个地址,经过设置以后,这个存储单元就对应了另外一个地址了
在这里插入图片描述
在这里插入图片描述

特别的一种提高代码执行效率的方式

通过改变地址映射提高代码效率

在这里插入图片描述
上图是ARM芯片的另外一种映射方式。这个映射是通过修改startup.s启动文件进行的。目的是提高应用程序异常相应的速度。当我们把应用程序存放在片内FLASH的时候,异常向量表存放在0x00000000-0x0000 003f。每次发生异常,CPU从0x00000000~0x0000003F地址上取异常向量。

步骤 1:
先把0x00000000-0x0000003F(FLASH)存储单元内的异常向量表复制 到0x40000000~0x4000003F(片内RAM的最低端64个字节的存储单元)范围内存储单元中。

步骤 2:
把0x40000000-0x4000003F范围内存储单元地址重新映射到0x00000000-0x0000003F地址范围。 这样做了以后,当异常发生的时候,CPU取异常向量就是从RAM区中的异常向量表中区,速度快了。
这时如果复位中断发生,CPU从地址0x00000000取指令,但此时由于已经过地址重新映射,这个0x00000000被地址转换器转换成0x40000000,CPU实际上是取的RAM区中0x400000000这个存储单元内的指令(异常向量)。 当然用户可以不进行这种映射。片内FLASH中0x00000000~0x0000003F存储单元具有一模一样的异常向量表。只不过不进行这种处理,异常相应速度慢一点。但是这种速度上的差别很多情况下是不必要在意的。

具体如何修改,再议。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【STM32】STM32存储映射 的相关文章

随机推荐

  • C++拷贝构造函数、赋值构造函数(深拷贝,浅拷贝)

    一 拷贝构造函数 拷贝构造函数是一种特殊的构造函数 函数的名称必须和类名称一致 它的唯一的一个参数是本类型的一个引用变量 该参数是const类型 不可变的 例如 类X的拷贝构造函数的形式为X const X x 自定义拷贝构造函数是一种良好
  • 【AntDB数据库】如何快速入门AntDB数据库?(二)

    AntDB数据库的硬件配置要求及安装包下载说明 硬件配置要求 组件 CPU 内存 本地存储 网络 mgr 16核 32G SAS 千兆网卡 gtmcoord 32核 64G SSD 万兆网卡 coordinator 32核 64G SSD
  • Linux 文件系统只读

    一般在SD卡或者U盘使用的是FAT32文件系统 当Linux下写FAT32文件系统时可能会出现 只读文件系统的错误 导致变为只读文件系统的原因是在操作FAT32文件系统的之后发生过致命的错误 然后系统以只读的方式重新挂载 remount r
  • 管理者工具箱--用最佳策略和资源,留住您最优秀的人才

    近年来 离职跳槽之风盛行 但多数员工打心底里是不会轻易离开一个培养了自己多年 又能满足职业发展需求的环境的 作为管理者 您处于一个有利的位置 应努力打造一支能长期并肩合作的稳固的团队 领英制作的这本实用指南 旨在介绍实用策略 工具和模板 帮
  • leveldb源码分析--SSTable之Compaction 详解

    http www cnblogs com KevinT p 3819134 html leveldb源码分析 SSTable之Compaction 对于compaction是leveldb中体量最大的一部分 也应该是最为复杂的部分 为了便于
  • Conda——报错解决:CondaError: Cannot write to /.condarc Caused by PermissionError(13, ‘Permission denied‘)

    报错详情 解决方法 sudo chown R pc home pc condarc sudo chown R pc home pc anaconda3 pc 替换你的用户名 home pc anaconda3替换为你的anaconda路径
  • 基础算法题——牛牛的棋盘(容斥原理)

    容斥原理 一种计数方法 先不考虑重叠的情况 把包含于某内容中的所有对象的数目先计算出来 然后再把计数时重复计算的数目排斥出去 使得计算的结果既无遗漏又无重复 题目 牛客网 牛牛最近在家里看到一个棋盘 有 n m 个格子 在棋盘旁边还放着 k
  • SpringBoot学习路线

    SpringBoot 第一章Xml和JavaConfig 1 为什么要使用springboot 因为spring springmvc需要使用大量的配置文件 xml文件 还需要配置各种对象 把使用的对象放入到spring容器中才能使用对象 需
  • 【mysql基础知识】查询当前时间之前5分钟内的数据

    通过sql语句查询与当前时间相隔5分钟以内的数据 select from 数据表名 where 字段名 between date add now interval 5 minute and now 字段名是字符串格式 也是可以的
  • 数据仓库架构

    这节来说说数据仓库的架构 关于架构并没有一个统一的标准 按照数据量以及使用环境可以搭建适合当下场景的数据仓库 下面主要是介绍比较大众或者说比较通用的数据仓库架构 传统的数据仓库架构按层级可分为 ETL ODS DWD DWS 和 ADS 五
  • JDBC java连接数据库

    JDBC编程六步 注册驱动 告诉java程序 即将连接那个品牌的数据库 Driver driver new com mysql jdbc Driver DriverManager registerDriver driver 或 class
  • Maven的scope=import

    详解内容 maven有个核心文件 名曰pom xml 这个文件中的标签 简直是眼花缭乱 千姿百态 而标签中的值也非常之多 今天我们就scope标签其中一个值import 讲解一番 scope标签的作用 这里不作过多的赘述 不明白的小伙伴 可
  • 基于跳数,时延,带宽的最短/优路径和负载均衡

    基于跳数的最短路径转发 基于跳数的最短路径转发是最简单的最优路径转发应用 我们通过network awareness应用来实现网络拓扑资源的感知并计算最短路径 首先控制器通过下发LLDP报文来获取网络链路信息 然后再利用网络信息 生成网络拓
  • sklearn决策树预剪枝

    老饼讲解机器学习 http ml bbbdata com teach 102 目录 一 预剪枝即调参 二 调参方法 1 默认值预观察生长的树 2 参数限制节点过分生长 为预防模型过拟合 我们可以采用预剪枝和后剪枝方法 1 预剪枝 树构建过程
  • git错误pathspec did not match any file(s) known to git及相关操作

    git error pathspec did not match any file s known to git 本地文件与远程无对应 我这里的情况是在执行 update nrp update all git pull Already up
  • python 连接minio并上传目录及文件

    目录 python sdk安装 python 代码 python sdk安装 python需要3 7及以上版本 pip3 install minio python 代码 from minio import Minio from minio
  • web服务器设置默认网站,web服务器中默认首页和默认网站的配置(以apache服务器为例)...

    默认首页的配置 php 第一种 直接修改apache服务器的配置文件 conf httpd conf中的DirectoryIndex 如 项目web以index php为首页 html DirectoryIndex index html i
  • Python追加文件内容

    Python追加文件内容 测试中需要造几百个账号 写了个脚本可以自动生成账号 但想把生成的账号写入一个文件 开始用的如下的write 方法 发下会先把原文件的内容清空再写入新的东西 文件里面每次都是最新生成的一个账号 mobile Meth
  • c++调用libcurl示例

    include
  • 【STM32】STM32存储映射

    存储映射 stm32f40xx的存储映射图 这幅图很重要 至于为什么 我还没编好 STM32存储空间有多大 芯片能访问的存储空间有多大 为什么 这个是由芯片内 CPU 的地址总线的数量决来定的 STM32 芯片内部的地址总线为32 根 1根