STM32(F407)—— 存储区映射和存储器重映射

2023-05-16

Arm Cortex-M4 处理器采用哈佛结构,可以使用相互独立的总线来读取指令和加载/存储 数据。指令代码和数据都位于相同的存储器地址空间,但在不同的地址范围。程序存储器, 数据存储器,寄存器和I/O端口都在同一个线性的4 GB(Cortex-M4的地址总线宽度是32位的,最大地址为 0xFFFF FFFF)的地址空间之内。

STM32F4xx系统架构

借助总线矩阵,可以实现主控总线到被控总线的访问(访问仲裁管理采用循环调度算法),这样即使在多个高速外设同时运行期间,系统也可以实现并发访问和高效运行。

1. 存储器映射

在明白什么是存储器映射前,我们需要明白什么是映射?在数学里,映射是个术语,指两个元素的集之间元素相互“对应”的关系,为名词。

映射关系图

如图1所示,两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有唯一的一个元素y与它对应,就这种对应为从A到B的映射,记作f:A→B。其中,y称为元素x在映射f下的像 ,记作:y=f(x)。x称为y关于映射f的原像  。集合A中所有元素的像的集合称为映射f的值域,记作f(A)。

存储器(Memory)是单片机最重要的功能单元之一,是众多存储单元的集合,而存储器(Memory)本身并不具有地址信息,那么CPU(ARM Cortex-M4内核)要准确的找到存储某个信息的存储单元,就必须为这些单元分配一个相互区别的标识,这个标识就是我们通常所说的地址编码。

例如在STM32微控制器(MCU)STM32F407中,集成了多种类型的 Memory,同一类型的 Memory 为一个 Memory  Block(block 0 ~ block 7),每一个都被分配一个数值连续、存储单元数相等、以16进制表示的自然数集合作为 Memory  Block 的地址编码。这种自然数集合与 Memory Block 的对应关系,就是 Memory Map(存储器映射),有时也叫 Address Map(地址映射)。实际上,Address Map在字面意义上更加贴切。

STM32F40xxx 存储器映射

需要强调的是,Memory Map 是一个逻辑概念,是计算机系统在(上电)复位后才建立起来的。Memory Map 相当于这样一个数学函数:函数的输入量是地址编码,输出量被寻址单元中的数据。当微控制器(MCU)掉电后或复位时,这个数学函数不复存在,只剩下微控制器(MCU)中实现这个数学函数的物理基础——电路连接。也可以这样认为:Memory Map 是微控制器(MCU)(上电)复位时的预备动作,是一个将CPU所拥有的地址编码资源向系统内各个物理存储器块分配的自动过程。简而言之,存储器映射就是为物理存储器按一定编码规则分配地址的行为

在完成存储器映射后,用户就可以按照存储器地址去访问对应的物理存储器。比如我要访问 SRAM,只需要访问0x2000 0000到0x2001 FFFF的地址即可。

值得注意,一部分地址空间由 Arm Cortex-M4 的系统外设所占用,且不可更改。此外,其余部分地址空间可由芯片供应商(ST,意法半导体)定义使用。用户只能用而不能改(为了降低不同客户在相同应用时 的软件复杂度)。用户只能在挂外部RAM或FLASH的情况下可进行自定义。

Arm Cortex-M4只有一个单一固定的存储器映射,这一点方便了我们在该系列之间的移植。

2. 存储器重映射

通常系统启动都是从0地址处开始,但是为了支持不同的存储介质,不同的存储介质被分配了一个非0地址区域。这就是为什么要进行重映射。

因此重映射主要发生在两种情况下,一系统启动的过程中;二如果中途遇到需要在不同的存储器之间进行切换的时候也需要进行重映射。

存储器采用固定的存储器映射,代码区域起始地址为 0x0000 0000(通过 ICode/DCode 总 线访问),而数据区域起始地址为 0x2000 0000(通过系统总线访问)。STM32F4xx 微控制器实施一种特殊机制,

将各自存储空间的地址映射到0x00000000中。

在 STM32F4xx 中,可通过 BOOT[1:0] 引脚选择三种不同的 boot modes。

1)从Flash启动,将Flash地址0x08000000映射到0x00000000,这样启动以后就相当于从0x08000000开始的,这是我们最常用的模式;

当选择从主Flash启动模式后,芯片一上电,Flash的0x0800 0000地址被映射到0地址处,不影响CM4内核的读取,所以这时的CM4既可以在0地址处访问中断向量表,也可以在0x0800 0000地址处访问中断向量表,而代码还是在0x0800 0000地址处存储的。

2)从SRAM启动,将SRAM地址0x20000000映射到0x00000000,这样启动以后就相当于从0x20000000开始的,用于调试;

3)从系统存储器启动,将系统存储器地址0x1FFFF000映射到0x00000000,这样启动以后就相当于从0x1FFFF000开始执行的,值得注意的是这个系统存储器里面存储的其实是STM32自带的Bootloader代码,这其实是一个官方的IAP,它提供了可以通过UART1接口将用户的代码下载到Flash中的功能,下载完以后再切换到从Flash中启动就可以正常运行了。

当然还可以通过SYSCFG Memory Remap(存储器重映)寄存器(SYSCFG_MEMRMP)对存储器重映射进行配置:

 


参考资料

  1. 【百度百科】映射(数学名词)

 

 

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

STM32(F407)—— 存储区映射和存储器重映射 的相关文章

  • 怎么用美图秀秀制作证件照

    1 第一步 xff1a 制作各种背景 在美图秀秀软件中点击选择 新建 按钮 xff0c 打开新建功能菜单选项 弹出的页面中我们点击选择 新建画布 xff0c 然后选项设置选择使用 白色画布 或者 蓝色画布 xff0c 依照一寸 xff1a
  • C++应用程序路径获取及操作

    xfeff xfeff 想要访问执行程序 exe 路径下的文件 xff0c 有以下几个步骤 xff1a 1 先通过函数GetModuleFileName获取执行程序的绝对路径 TCHAR szPath MAX PATH 61 0 GetMo
  • c++成员函数后面加一个冒号的含义

    目录 1 变量初始化方式 1 1 赋值运算符赋值 1 2 括号赋值 1 3 冒号初始化 1 4 使用情况 1 变量初始化方式 1 1 赋值运算符赋值 int a 61 10 char b 61 39 r 39 1 2 括号赋值 int a
  • 相机标定与内外参

    目录 1 相机标定 1 1外参 1 2内参 2 参考资料 1 相机标定 在图像测量过程以及机器视觉应用中 xff0c 为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系 xff0c 必须建立相机成像的几何模型 xff0c
  • 开启代理服务器解决跨域问题

    我在学习尚硅谷Ajax课程时候 xff0c 第一次遇到跨域的问题 Access to XMLHttpRequest at http localhost 5000 students from origin http localhost 808
  • 阿里云CentOS环境之docker安装,启动,加速器,docker-compose(十四)

    阿里云CentOS环境之docker安装 xff0c 启动 xff0c 加速器 十四 文章目录 阿里云CentOS环境之docker安装 xff0c 启动 xff0c 加速器 十四 介绍前提条件centos下安装1 卸载 xff08 可选
  • SQL Server JDBC Driver配置方法(图文讲解)

    一 下载驱动程序 下载地址 http download microsoft com download 8 B D 8BDABAE2 B6EA 41D4 B903 7916EF3690EF sqljdbc 1 2 2323 101 enu e
  • 孤立森林(Isolation Forest)算法剖析

    之后会持续更新算法剖析系列 xff0c 力图用最生动的例子演示每一个算法的原理 xff0c 不稀里糊涂做一个调包侠 欢迎持续关注 xff0c 指正不足 孤立森林 xff08 Isolation Forest xff09 算法是西瓜书作者周志
  • 如何使用VOFA+?一款好用的上位机软件(VOFA+的三种数据传输协议)——以PID调参为例

    这里写目录标题 起因一 VOFA 43 支持的三种数据传输协议RawData协议格式1 使用方法2 示例3 测试 firewater协议格式1 使用方法2 数据格式3 示例4 测试 justfloat协议格式1 使用方法2 数据格式3 示例
  • tss

    1 linux进程切换和TSS结构 http blog csdn net goodlixueyong article details 6018281 TSS 全称为task state segment xff0c 是指在操作系统进程管理的过
  • codeblock图形界面编程

    Code Blocks 是一款免费开源的 C C 43 43 IDE xff0c 支持 GCC MSVC 43 43 等多种编译器 xff0c 还可以导入 Dev C 43 43 的项目 Code Blocks 的优点是 xff1a 跨平台
  • 利用FFT成功实现拓扑识别(六)--为自己设计的滤波器做仿真验证

    为自己设计的滤波器做仿真验证 前文中我们已经设计好了2 4和6阶的数字带通滤波器 xff0c 实际效果如何昵 xff1f 可以通过mathlab工具进行仿真和验证 第一步 xff1a 导出滤波器 在mathlab的fdatool中设计好滤波
  • 使用Matlab编程实现FFT的频谱分析

    目录 使用Matlab编程实现FFT的频谱分析fft函数原始波形函数原始数据导入函数数据导出函数fft分析例程 使用Matlab编程实现FFT的频谱分析 用Matlab进行fft仿真分析 xff0c 最大的优势在于其丰富的函数库支撑 xff
  • 使用Matlab实现高噪声信号的FFT的频谱分析

    目录 使用Matlab实现高噪声信号的FFT的频谱分析原始信号原始信号FFT结果加噪信号加噪信号FFT结果其他加噪函数 使用Matlab实现高噪声信号的FFT的频谱分析 在实际的系统中 xff0c 噪声可以说是无处不在 xff0c 首先生成
  • 基于freertos的嵌入式系统开发(七)FreeRTOS的内存管理方法5

    目录 基于freertos的嵌入式系统开发 七 FreeRTOS的内存管理方法5 简介 内存申请函数void pvPortMalloc size t xWantedSize 内存释放函数void vPortFree void pv 空闲内存
  • 基于freertos的嵌入式系统开发(八)FreeRTOS的TCB

    目录 基于freertos的嵌入式系统开发 xff08 八 xff09 FreeRTOS的TCB简介TCB的定义 基于freertos的嵌入式系统开发 xff08 八 xff09 FreeRTOS的TCB 简介 FreeRTOS为了实现任务
  • zabbix4.0学习四:Zabbix监控tomcat故障重启

    zabbix4 0学习四 xff1a Zabbix监控tomcat故障重启 前言 使用zabbix监控tomcat的运行 xff0c 当tomcat停止运行 xff0c 则重启它 下面教程里 xff0c 在执行远程脚本时 xff0c 使用s
  • 基于freertos的嵌入式系统开发(九)FreeRTOS的全局变量

    目录 基于freertos的嵌入式系统开发 xff08 九 xff09 FreeRTOS的全局变量当前TCB指针pxCurrentTCB就绪任务列表pxReadyTasksList阻塞任务列表xDelayedTaskList1和xDelay
  • pycharm中做web应用(一)第一个web页

    目录 pycharm中做web应用 xff08 一 xff09 第一个web页Django 简介开发环境搭建django插件选择查看django版本 新项目创建启动项目web端验证项目 pycharm中做web应用 xff08 一 xff0
  • Matlab中利用FFT实现信号频谱搬移

    目录 Matlab中利用FFT实现信号频谱搬移只有实部的频谱搬移只有虚部的频谱搬移复函数下的频谱搬移 Matlab中利用FFT实现信号频谱搬移 在fft的理论中 xff0c fft的频移特性表示为 xff1a 也就是说 xff0c 要想对信

随机推荐

  • 解析IEC 61850通信规约

    目录 解析IEC 61850通信规约IEC61850适用场景IEC61850组成IEC61850库 解析IEC 61850通信规约 IEC61850标准是基于通用网络通信平台的变电站自动化系统唯一国际标准 xff0c 由国际电工委员会第57
  • C语言中的字符串转数字函数常见问题详解

    目录 C语言中的字符串转数字函数常见问题详解字符串转整形atoi函数 字符串转长整形strtol函数 xff0c C语言中的字符串转数字函数常见问题详解 字符串转整形 atoi函数 函数原型 xff1a int atoi const cha
  • 使用MATLAB进行三维空间绘图

    目录 使用MATLAB进行三维空间绘图一个入门例程matlab中的mesh 函数matlab中的meshgrid 函数matlab中的plot3函数例程代码解释 使用MATLAB进行三维空间绘图 三维图具有直观 立体的空间形象 xff0c
  • python特殊数据类型应用(2)元组类型

    目录 标题python特殊数据类型应用 xff08 2 xff09 元组类型元组的定义声明元组元组的访问元组和列表的相互转换元组和列表的区别 标题python特殊数据类型应用 xff08 2 xff09 元组类型 元组的定义 在python
  • python特殊数据类型应用(3)集合类型

    目录 python特殊数据类型应用 xff08 3 xff09 集合类型集合的定义集合的声明集合的运算集合元素的增加 xff1a 交集intersection 并集union差集difference xff1a 对称差集symmetric
  • python中字符串及其格式转换技巧

    目录 python中字符串及其格式转换技巧其他数据转为字符串字符串的格式化带格式限定符的格式化字符串的连接字符串切片字符串转换为 ASCII 值 python中字符串及其格式转换技巧 在python语言中 xff0c 对字符串的处理可以说是
  • Linux命令发送Http的get或post请求(curl和wget两种方法)

    xfeff xfeff Http请求指的是客户端向服务器的请求消息 xff0c Http请求主要分为get或post两种 xff0c 在Linux系统下可以用curl和wget命令来模拟Http的请求 下面就来介绍一下Linux系统如何模拟
  • 让bat文件后台运行

    让bat文件后台运行 文章目录 让bat文件后台运行 前言方法一方法二 前言 bat文件运行时会有一个黑黑的cmd exe窗口 xff0c 很吓人 xff0c 就算用start min命令去运行bat文件 xff0c 电脑的任务栏下仍然会有
  • 5.C语言中全局变量在多个文件中使用

    转自 xff1a https www eefocus com codevisionlife blog 13 12 300658 1a0b8 html 用C语言编写程序的时候 xff0c 我们经常会遇到这样一种情况 xff1a 希望在头文件中
  • 利用GitHub actions实现Docker Image的构建并传送到Docker Hub或者harbor

    目录 1 github actions的介绍 2 dockerfile 的编写 2 1 dockerfile 范例 2 2 其他指令 3 workflow的编写 3 1 上传到docker hub 3 2 上传到 harbor 4 结果展示
  • UCOSIII编写无人机飞控程序——第一篇

    研究无人机飞控已经接近两年 xff0c 作为一个业余的兴趣爱好 兴趣源于看到国外大神Raffaello D 39 Andrea在TED做的无人机演讲和展示 xff0c 感觉无人机很像工程师所施展的魔法 xff0c 给一向给人苦逼印象的工程师
  • 解决 Ubuntu :: Configure: Error: The QtCore Library >= 4.3.0 Could Not Be Found? 问题

    解决 Ubuntu Configure Error The QtCore Library gt 61 4 3 0 Could Not Be Found 问题 作者 19届YJF 日期 2020 10 2 这是我在打 robocup 2D仿真
  • 魔都,3年,程序员到CTO

    过一个平凡无趣的人生实在太容易了 xff0c 你可以不读书 xff0c 不冒险 xff0c 不运动 xff0c 不写作 xff0c 不外出 xff0c 不折腾 但是 xff0c 人生最后悔的事情就是 xff1a 我本可以 陈素封 我可以 在
  • 几种内存泄露检测工具的比较

    概述 内存泄漏 memory leak 指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况 xff0c 在大型的 复杂的应用程序中 xff0c 内存泄漏是常见的问题 当以前分配的一片内存不再需要使用或无法访问时 xff0c 但是却并没
  • ubuntu查看磁盘占用和分配情况

    1 df hl Filesystem Size Used Avail Use Mounted on udev 978M 0 978M 0 dev tmpfs 200M 3 6M 197M 2 run dev sda5 28G 12G 15G
  • Android Studio主菜单(Main Menu)消失后,恢复显示

    当出现这个情况的时候 xff0c 我按找一般软件的办法找了半天也没找到 xff0c 最后没办法只能用万能的百度了 这里只记录一下当前我个人认为比较不错的方法 在Android Studio软件的右上角找到搜索 xff0c 输入Menu xf
  • github响应时间过长,无法访问此网站[已解决]

    某一天或某个时段总是出现 github 响应时间过长 xff0c 无法访问此网站的问题 获取github可以使用的DNS域名 通过站长工具 下的DNS查询 获取TTL值最小的 修改hosts配置 找到hosts xff08 域名解析文件 x
  • STM32(F407)—— 堆栈

    目录 1 SRAM 2 堆栈的作用 3 堆栈的设置 4 堆栈的实现 5 双堆栈机制 堆栈 是一种数据结构 堆栈都是一种数据项按序排列的数据结构 xff0c 只能在一端 称为栈顶 top 对数据项进行插入和删除 xff0c 相应地 xff0c
  • zabbix4.0学习五:Zabbix监控邮箱发送设置

    zabbix4 0学习五 xff1a Zabbix监控邮箱发送设置 文章目录 zabbix4 0学习五 xff1a Zabbix监控邮箱发送设置 前言配置centos安装mailx配置zabbix用户与报警媒介绑定 前言 zabbix里报警
  • STM32(F407)—— 存储区映射和存储器重映射

    Arm Cortex M4 处理器采用哈佛结构 xff0c 可以使用相互独立的总线来读取指令和加载 存储 数据 指令代码和数据都位于相同的存储器地址空间 xff0c 但在不同的地址范围 程序存储器 xff0c 数据存储器 xff0c 寄存器