本文参考《CM3权威指南》第五章 存储器系统

《STM32_参考手册》2.4 启动配置

《STM32F103xCDE_数据手册》第四章 memory mapping

Cortex m3内核规定的存储器映射如下图所示。就好像ARM公司打造了一个柜子,从上到下有这几个抽屉,它规定了每个抽屉放的东西的种类,具体放什么放多少它不管(只要不超过抽屉的大小),由每个芯片厂商自己决定。

图1 cortex m3存储器映射

我们来看看ST公司打造的STM32F1系列芯片是如何在这些抽屉放置东西的。

代码抽屉

在代码这个抽屉,STM32F1布置了Flash模块,用来存储代码,相当于电脑的硬盘,具体展开如下图所示。主存储器(图中Flash区)起始起止为0x0800 0000,终止地址依Flash大小而定,图中0x0807 FFFF为512k的终止地址。然后经过一段保留区,从0x1FFFF000 – 0x1FFF F7FF为系统存储器,是不可擦除的ROM区,存储ISP程序,最后option bytes这个区域是16个字节,是控制flash区域的寄存器。有同学说我漏了一块,对,从0x0000 0000的这块是我要着重讲解的一块。

图2 STM32F1代码区抽屉

在讲这块之前,首先要讲一下STM32F1的三种启动模式,如下图所示。

1).主闪存存储器启动:从STM32内置的Flash启动(0x0800 0000-0x0807 FFFF),一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。

2).系统存储器启动:从系统存储器启动(0x1FFFF000 – 0x1FFF F7FF),这种模式启动的程序功能是由厂家设置的。一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的ISP程序中,提供了串口下载程序的固件,可以通过这个ISP程序将用户程序下载到系统的Flash中。

3).片上SRAM启动:从内置SRAM启动(0x2000 0000-0x3FFFFFFF),既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。

下面讲解Boot MemorySpace(Aliased to Flash or systen memory depending onBOOT pins)。其实这块空间是预留的,不存数据,或者它压根不存在。在不同的启动方式下,这块区域会被映射到其他区域:

1).从Main Flash 启动:Boot Space 是Main Flash 的别名。以0x08000000 对应的内存为例,则该块内存既可以通过0x00000000 操作也可以通过0x08000000 操作,且都是操作的同一块内存

2).从System Memory启动:Boot Space 是System Memory的别名。以0x1FFFFFF0对应的内存为例,则该块内存既可以通过0x00000000 操作也可以通过0x1FFFFFF0操作,且都是操作的同一块内存

3).从SRAM 启动:SRAM 只能通过0x20000000进行操作,与上述两者不同。从SRAM 启动时,需要在应用程序初始化代码中重新设置向量表的位置。

图3 STM32F1三种启动模式

片上SRAM抽屉

在SRAM这个抽屉,STM32F1布置了SRAM,相当于电脑的内存,具体展开如下图所示。

图4 STM32F1片上SRAM抽屉

在这个抽屉中,STM32F1只放了64K的SRAM存储空间,其余的空间保留(空着)。这里需要说明一下,虽然其余那些空间被保留,没有存储器与之对应,但是位带别名区的地址仍然可以操作来改变64K地址中的对应位。

片上外设抽屉

在这个抽屉中,放置了STM32F1的外设,包括GPIO、UART、ADC等所有外设的控制、状态、数据寄存器都在这个抽屉中。当然,抽屉很大肯定装不满,装不满的空间就预留着。

图5 STM32F1片上外设抽屉

片外RAM抽屉

在这个抽屉中,我们可以自己扩展内存,但必须在STM32的FSMC控制器下进行,这个控制器的作用就是将内部AHB总线和外部扩展内存的总线进行转化,利用这个控制器,我们可以很方便的控制LCD,这里就不展开了。这1G的抽屉可以放下图的东西。这片空间STM32并没有放东西,STM2指定我们可以在其中扩展内存NOR/PSRAM1、NOR/PSRAM2……并接受FSMC控制器的控制。

图6 STM32F1片外RAM抽屉

片外外设抽屉

在这个抽屉中,STM32F1放置了FSMC控制器的一些寄存器,就是在这些寄存器的配合下,FSMC控制器得以有效控制片外RAM进行读写操作。

图7 STM32F1片外外设抽屉

其余的抽屉,STM32F1就没动过了。最后,stm32f1的存储器完整映射如下图所示,大家可以和图1对比了解这个过程。

图8 STM32F1存储器映射

STM32F1(Cortex M3内核)存储器映射相关推荐

  1. Cortex M3内核架构

    CortexM3内核架构 宗旨:技术的学习是有限的,分享的精神是无限的. 1.ARMCortex-M3处理器 Cortex-M3处理器内核是单片机的中央处理单元( CPU). 完整的基于CM3的MCU ...

  2. Cortex‐M3的Faults异常究竟是什么?

    关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | strongerHuang 有许多朋友在学习,或者开发STM32时都遇到过HardFault_Handler的情 ...

  3. Cortex‐M3和Cortex‐M0是否都能位带操作

    最近在进行stm32l011f4的编程,想到stm32有位带操作,便想试一试,但是事与愿违,先贴下位带操作代码 Cortex‐M0的位带操作代码 //IO输出方向设置 #define SDA_IN() ...

  4. Cortex M3存储器映射

    CortexM3存储器系统 宗旨:技术的学习是有限的,分享的精神是无限的. CM3 只有一个单一固定的存储器映射.这一点极大地方便了软件在各种 CM3 单片机间的移植. 存储空间的一些位置用于调试组件 ...

  5. Cortex、ARMv8、arm架构、ARM指令集、soc?Cortex A8、A9都是ARMv7a 架构;Cortex M3、M4是ARMv7m架构;前者是处理器(内核)后者是指令集的架构(架构)

    架构组成元素的指令集状态或者语法thumb指令集与arm指令集的区别例如thumb指令集是什么_thumb指令集与arm指令集的区别以及thumb-2的关系在下一文中介绍,本文暂时不讨论 有粉丝问我到 ...

  6. Cortex M3 Bit-banding简介

    http://blog.csdn.net/shevsten/article/details/7676397 Cortex M3 Bit-banding简介 分类: ARM MCU2012-06-19 ...

  7. ARM® Cortex®-M内核单片机STM32家族介绍,覆盖STM32F、STM32H、STM32L全系列

     STM32是ARM®Cortex®-M内核单片机.目前提供10大产品线(F0, F1, F2, F3, F4, F7, H7, L0, L1, L4),超过700个型号.STM32产品广泛应用于 ...

  8. 【STM32存储器映射-寄存器基地址-偏移】

    前言 在学习STM32的时候,我们看到很多的寄存器编程, 比方说LED灯: //GPIOB.5端口输出高电平GPIOB->ODR|=1<<5; //PB.5 输出高GPIOE-> ...

  9. ARM 架构、ARM7、ARM9、STM32、Cortex M3 M4 、51、AVR 有啥区别

    ARM架构.ARM7.ARM9.STM32.Cortex M3 M4.51.AVR之间有什么区别和联系? ARM架构:由英国ARM公司设计的一系列32位的RISC微处理器架构总称,现有ARMv1~AR ...

  10. ARM 架构、ARM7、ARM9、STM32、Cortex M3 M4 、51、AVR 之间有什么区别和联系?

    本文转自嵌入式资讯精选公众号,特别鸣谢, 编者按:初学习ARM单片机的同学们可能会对ARM的架构定义并不是很明确,形形色色的名词背后到底代表什么含义呢?请听听这位嵌入式工程师的经验总结. ARM架构: ...

最新文章

  1. 使用VSCode调试C#控制台程序
  2. [USACO4.2]工序安排Job Processing
  3. java入门基础重要知识必考考点
  4. 利用多线程提高程序性能(for Android)
  5. 分布式锁与实现(二)——基于ZooKeeper实现
  6. freemarker 自己常用方法
  7. TQIMX6ULL测试----存储设备
  8. ONVIF协议基础概念
  9. 在html中生成动态表格数据,JavaScript实现网页动态生成表格
  10. 使用python爬虫增加浏览量
  11. Win10磁盘管理教程:新建、合并分区,添加和修改盘符
  12. Java 创建一个Customer类,类中的属性有姓名、年龄、性别,然后创建两个Customer对象,把这两个对象存储在ArrayList对象中,然后再从ArrayList对象中读取出来。
  13. python urllib之parse中urlencode、quote、unquote使用方法
  14. 如何实现组件之间的通信(父传子,子传父,兄弟组件互传)
  15. Solidworks快速装配——带配合装配与阵列装配(带例子解释)
  16. Java类包的定义(package)
  17. 根据经纬度坐标值在百度地图上绘制轨迹
  18. noip2013 总结
  19. 基于c语言测井原始数据编程,C语言对数据库文件的信息压缩
  20. does not support XML Schema. Are you running on Java 1.4 with Apache Crimson? Up

热门文章

  1. 高等数学张宇18讲 第四讲 一元函数微分学的几何应用
  2. 未来电子服务领域信用系统的架构和发展趋势预测
  3. 自己服务器搭建免费的进销存系统,云进销存服务器搭建
  4. 【土壤分类】基于支持向量机实现土壤分类附matlab代码
  5. F28335中断系统
  6. opencv安装教程(详细)小白教程
  7. opencv安装与配置vs2019
  8. 同一个二维码支持多种支付的实现思路
  9. COMSOL仿真软件入门学习(一)
  10. C语言学习-翁凯(第四章笔记)