STM32之内存分布与总线

STM32涉及到的汇编基础知识 本文为使用汇编开发STM32系列文章之一,全部文章目录点此跳转。 目录一、说明二、系列文章跳转链接1.stm32涉及到的汇编基础知识 一、说明   【2313213】   本文将作为此系列文章的目录,此后会专门编写一个系列,将全程使用汇编代码开发STM32,旨在深入理解汇编的使用和STM32的运行机制等原理,但一般并不适用在工程中使用。   本文默认读者具有一定的汇编基础和STM32的编程经验,否则阅读本系列文章将会很有难度或并不适合您当前阶段阅读。当然在之后的文章中,所使用到的相关知识也会做相应的解释。 阅读详情

1、总线

系统结构

系统包括一个由多个互相连接的32位AHB总线组成的矩阵

  • 8个主总线
1.    – Cortex-M4 with FPU core I-bus, D-bus and S-bus
2.    – DMA1 memory bus
3.    – DMA2 memory bus
4.    – DMA2 peripheral bus
5.    – Ethernet DMA bus
6.    – USB OTG HS DMA bus
  • 7个从总线:
1.    – Internal Flash memory ICode bus
2.    – Internal Flash memory DCode bus
3.    – Main internal SRAM1 (112 KB)
4.    – Auxiliary internal SRAM2 (16 KB)
5.    – AHB1 peripherals including AHB to APB bridges and APB peripherals
6.    – AHB2 peripherals
7.    – FSMC

总线矩阵也能够提供主到从的访问,从而使能并发访问,甚至在多个高速外设同时工作的时候也能够高效工作. 64Kbyte的CCM(core coupled memory)数据RAM不是总线矩阵的一部分,只能通过CPU来访问.

总线类型

  • I-bus

    该总线连接带有FPU的Cortex-M4内核的指令总线到BusMatrix. 该总线被内核用于取指令操作. 该总线的控制目标是一块包括代码的内存 (internal Flash memory/SRAM or external memories through the FSMC/FMC).

  • D-bus

    该总线连接带有FPU的Cortex-M4内核的数据总线到64Kbyte的CCM数据RAM再到BusMatrix. 该总线被内核用于下载代码与调试. 该总线的控制目标是一块包括代码或者数据的内存 (internal Flash memory or external memories through the FSMC/FMC).

  • S-bus

    该总线连接带有FPU的Cortex-M4内核的系统总线到BusMatrix. 该总线被用来访问加载到SRAM或者外设的数据. 指令也可能通过该总线取得 (没有ICode来的高效). 该总线的控制目标有:内部的SRAM1, SRAM2 and SRAM3, AHB1的外设(包括APB外设), AHB2的外设和通过FSMC/FMC的外部内存

  • BusMatrix

    BusMatrix 管理主总线之间的访问仲裁. 仲裁使用循环算法

总线结构图:

总线结构图

2、内存分布

  • 编程空间(代码空间), 数据空间, 寄存器和I/O端口被组织在同一个线性的4Gb空间中。所有的数据都按照小端存储
  • 可寻址内存空间被分为8个块, 每块包括512MB
  • 所有没有被分配到片上内存或者片上外设的空间都被成为”reserved”

嵌入式SRAM

  • STM32F407ZG配置了4 Kbytes的备份 SRAM,192 Kbytes的系统SRAM。
  • 嵌入式SRAM可以以字节,半字,字的方式访问,可以以CPU的速度进行无需等待的访问,嵌入式SRAM被分为以下3个块:
    • SRAM1 和 SRAM2 映射到 0x2000 0000 地址并且可以被所有的 AHB 总线访问.
    • SRAM3 (只有 STM32F42xxx 与 STM32F43xxx 系列可用) 映射到 0x2002 0000 地址处并且可以被所有的 AHB 总线访问
    • CCM (core coupled memory) 映射到 0x1000 0000 地址处只能够通过D-bus被CPU访问

位带操作

在STM32中提供了两个位带操作域以及对应的位带别名域

位带操作域位带别名域
SRAM的低1M字节 : 0x2000 0000~0x200F FFFF0x2200 0000~0x23FF FFFC
外设的低1M字节 : 0x4000 0000~0x400F FFFF0x4200 0000~0x43FF FFFC

位带操作公式:

bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4)
  • 1

例子:

0x22006008 = 0x22000000 + (0x300*32) + (2*4)
/* 对0x22006008的读写就实现了对0x2000 0300处第2个bit的读写 */
/* 同理,若要对0x40000000地址块进行位操作,需要把上面式子右边的0x22000000换成0x42000000 */
  • 1
  • 2
  • 3

以后我们想直接操作某个寄存器的某一位的时候,只需要找到这一位对应的别名地址,然后对别名地址进行读写即可实现对这一位的读写。如果想实现这中操作的话,只需要定义宏即可,例如下面的:

#define REGISTER_BIT_BAND(ofs, bit_num) (0x22000000 + (ofs << 5) + (bit_num << 2))
#define WRITE_R_BIT_BAND(ofs, bit_num, stat) (*((volatile unsigned int *)REGISTER_BIT_BAND(ofs, bit_num)) = stat)
//上面两个宏可以实现对寄存器位带域的操作
  • 1
  • 2
  • 3

内核编程手册给出的M系列4GB内存分布
内存组织

3、启动配置

启动方式

Boot mode selection pinsBoot modeAliasing
BOOT1BOOT0 
x0Main Flash memoryMain Flash memory is selected as the boot space
01System memorySystem memory is selected as the boot space
11Embedded SRAMEmbedded SRAM is selected as the boot space

我的板子启动是在main flash memory,由前面的ARM编译工具一节可以知道代码从0x08000000开始运行,这个也是由分散加载文件指定的,也是板子上面main flash实际地址

物理地址重映射

  • 下面的内存空间可以被重映射:
- Main Flash memory
- System memory
- Embedded SRAM1 (112 KB)
- FSMC bank 1 (NOR/PSRAM 1 and 2)
  • 1
  • 2
  • 3
  • 4

映射表为

内存映射表

映射到0x00000000地址处的内存块可以由SYSCFG控制器的(SYSCFG_MEMRMP)寄存器低二位决定,如下表所示

bit1bit0memory selected
00Main Flash memory mapped at 0x0000 0000
01System Flash memory mapped at 0x0000 0000
10FSMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x0000 0000
11Embedded SRAM (SRAM1) mapped at 0x0000 0000从表中

可以看出来从main flash启动的时候flash memory会被重新映射到0地址开始处,大小为1MB,但是我的板子依然是从0x08000000地址处运行代码的,现在由表中数据可以看出来从0地址开始运行也是可以的,可能是为了适应不同的启动方式,所以才从0x08000000地址处开始运行系统代码的。如果要从其他的地方运行flash memory中的代码,只需要在那种方式对应的被重映射到0地址空间代码段开头加上一个跳转语句,直接跳转到0x08000000地址处就可以运行代码了

4、嵌入式flash memory

接口特性:

  • Flash memory 读操作
  • Flash memory 编程/擦除操作
  • 读/写保护
  • 指令预取
  • I-Code上面有 64 个 128 位宽的快速存取线
  • I-Code上面有 8 个 128 位宽的快速存取线

内存接口图

flash memory特性:

  • 1M byte容量
  • 128位的读数据位宽
  • 支持 Byte, half-word, word and double word 写入
  • 支持扇区与块擦除
  • 支持内存组织
    • flash memory可以被组织成下面的样子:
      • – main memory 分为 4 个 16 Kbytes 大小扇区, 1 个 64 Kbytes 大小扇区,和 7 个 128 Kbytes 大小扇区
      • – 不同启动设备对应相应的system memory
      • – 512 OTP (一次性编程) bytes
      • – 可选配置读写保护
  • 低电量模式

内存分布图

内存分布图

额外补充时钟一节内容:

VOS 在 PWR_CR 寄存器的 bit15 位被设置

当 VOS = ‘0’, fHCLK 最大为 144 MHz.
当 VOS = ‘1’, fHCLK 最大为 168 MHz.

等待周期

等待周期指的是CPU访问Flash的等待时间,CPU访问Flash的周期就是等待周期加上1,这个与Flash的硬件性能有关

CPU等待周期

 

四个驱动单元:context-M3内核的D-bus总线和S-bus总线、通用DMA1和通用DMA2。

四个被驱动的单元:内部FLASH(内部山村存储器)、内部SRAM、FSMC、AHB到APB的桥AHP2APBx。

ICode总线是context-M3与内部闪存FLASH指令接口之间的连接的总线,实现指令的预取功能。

DCode总线是将context-M3与内部闪存存储器(FLASH)的数据接口连接起来的总线,实现数据读取。

系统总线(system bus)连接context-M3和总线矩阵,总线矩阵协调着context-M3和DMA间的访问。

DMA总线实现DMA的AHB主控接口道总线接口的连接。

 

总线矩阵
此总线矩阵协调内核系统总线和DMA主控总线之间的访问仲裁。此仲裁利用轮换算法。此总线矩阵由四个驱动部件(CPU的DCode、系统总线、DMA1总线和DMA2总线)和四个被动部件(闪存存储器接口(FLITF)、SRAM、FSMC和AHB2APB桥)构成。
AHB外设通过总线矩阵与系统总线相连,允许DMA访问。

 

APB1操作速度限于36MHz,APB2操作于全速(最高72MHz)。
 

存储器组织
程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个4GB的线性地址空间内。
数据字节以小端格式存放在存储器中。一个字里的最低地址字节被认为是该字的最低有效字

FLASH/代码区512M、片上SRAM512M、片上外设/寄存器区512M。4G内其它的地址空间是保留的地址空间。

STM32H7内存分布的学习 手里有一块H7的板子,买了很久了,最近拿起来跑跑代码,在使用之前我们要先学习下H7的内存分布,之前可能接触过ST的程序员没有发现有内存分布的特性,这可能是在M7系列新加的特性。(推荐大家看看硬汉嵌入式文档,写的很详细) TCM : Tightly-Coupled Memory 紧密耦合内存 。ITCM 用于指令,DTCM 用于数据,特点是跟内 核速度一样,而片上 RAM 的速度基本都达不到这个速度。 ITCM 和 DTCM 这两个是直连 CPU 的。 TCM 区 TCM : Tightly-Coupled 阅读详情

相关推荐

Stm32H7XX GCC下分散加载实现

stm32分散加载

weixin_43522787的博客 2236

stm32 .map文件各个部分含义

内存溢出的问题,如何分析这类问题的呢?遇到HardFault_Handler 有对map分析过吗?首先讲述一下关于map在MDK-ARM中的配置。其实,在MDK-ARM中,我们可以根据自己的情况(不同配置),在map文件中输出对应(我们需要)的内容。默认情况下,输出所有信息。 map文件里面内容大致分为五大类(按照map文件分类的顺序): 1.Section CrossReferences:模块、段(入口)交叉引用; 2.Removing Unused inputsections from the imag

yongridada的博客 1403

STM32H7 单片机优化实战:DTCMRAM配置与性能提升指南(STM32CubeIDE环境)

本文详细介绍了STM32H7单片机中DTCMRAM的配置与性能优化方法,通过STM32CubeIDE环境实现零等待周期访问,显著提升程序运行速度。内容包括内存架构解析、链接脚本修改、关键代码指定及性能对比测试,帮助开发者充分利用DTCMRAM的高速特性优化实时应用。

weixin_29309213的博客 409

搭建机器人电控系统——MCU基石——STM32系统架构

搭建机器人电控系统——MCU基石 STM32系统架构 STM32时钟配置 GPIO是什么 中断NVIC与EXTI STM32系统总线架构 在对应STM32F4的《参考手册》中,有如下一个系统架构图: 从整体来看,STM32系统借助总线矩阵,实现主控总线到被控总线的访问。 主控总线 ①Cortex内核I、D、S总线 Cortex-M4:ARM制定的一种内核协议。在选择主控章节说过,ARM制定内核协议,由ST公司根据内核协议制作STM32芯片。即STM32F4系列单片机内核是Cortex-M4。 I总线(

ROS_homes的博客 3860

IP2315高效同步降压充电IC在快充应用中的硬件与软件控制策略

本文深入解析IP2315高效同步降压充电IC在快充应用中的硬件与软件控制策略,涵盖其核心特性、硬件电阻调节技巧、I2C动态控制方案、散热设计优化及典型问题排查。IP2315支持多种快充协议,如Type-C PD、华为FCP等,适用于便携设备快速充电需求,并通过I2C实现灵活的充电参数设置,提升充电效率与安全性。

weixin_29248313的博客 539

硬件工程师的蜗牛成长路

1、《模拟电路课程》R/L/C/继电器/光耦/二极管/三极管/MOS管磁珠/ESD/TVS/肖特基二极管/稳压二极管/保险丝/GDT/TSS/光耦/MOS/运放/BJT比较器/面板开关/按键开关/拨码开关/BUCK/LDO/电源防护器件LM5069单输出PLL/多路输出PLL/单端晶振/差分晶振/晶体(这方面不熟悉,待以后补充)1)速度传感器2)温度传感器3)倾斜角传感器4)火焰传感器5)红外传感器6)呼吸心跳采集chaunganqi1)数字隔离 电平转换芯片/磁隔离/专用隔离芯片。

caozhaokun的博客 1983

STM32学习之:Context—M3简介

Cortex-M3概览 (1)简介      Cortex-M3是一个 32位处理器内核。内部的数据路径是 32位的,寄存器是 32位的,存储器接口也是 32 位的。CM3 采用了哈佛结构,拥有独立的指令总线和数据总线,可以让取指与数据访问并行不悖。这样一来数据访问不再占用指令总线,从而提升了性能。为实现这个特性, CM3内部含有好几条总线接口,每条都为自己的应用场合优化过,并且它们可以并行工

Cheatscat的博客 3756

<硬件设计> 阻抗设计(二) 使用Si9000计算阻抗

阻抗设计(二) 使用Si9000计算阻抗

杰克拉力船长个人博客 1万+

【STM32】STM32存储映射

STM32存储映射

apythonlearner的博客 1359

华三模拟器实战:3分钟搞定路由器DHCP地址池配置(附常见错误排查)

本文提供华三模拟器中路由器DHCP地址池的实战配置指南。通过分步详解,帮助用户在3分钟内完成基础设置,并深入讲解多地址池、中继配置等进阶应用。文章重点剖析了DHCP服务无法工作的常见原因,提供从客户端到服务器的系统性排错方法,助力快速定位并解决地址分配失败、获取参数错误等典型问题。

w1x2y3的博客 360

BCM-BCP-DRP-运维管理之故障管理——故障的分类与处理流程

ITSM Business Continuity Manage(BCM) BusinessContinuityPlan(BCP) 偏业务 DisasterRecoveryPlan(DRP) 偏IT 天塌了,考虑在天塌了的状态下做什么,怎么开展业务就是BCP; 天塌了,考虑怎么把天撑回去,就是DRP。 DRP+BCP+供应链管理+危机管理等就是BCM (业务连续性管...

mmgithub123的博客 2722

cpu外部三大总线的解释和作用

最近看go源码,涉及到汇编的知识,慢慢带着整理下。

qq_30263071的博客 2153

立创EDA开源足轮机器人:基于STM32F407与ESP32的LQR自平衡与FOC驱动设计全解析

本文详细解析了基于立创EDA平台的开源足轮机器人项目。该项目采用STM32F407作为主控,ESP32负责无线通信,并应用LQR自平衡算法与FOC驱动技术,实现了机器人的稳定站立、移动转向及复杂地形适应能力。文章深入剖析了其硬件架构、软件设计及调试经验,为机器人运动控制学习提供了宝贵参考。

weixin_42608299的博客 232

stm32 总线与内存分布

1、总线 系统结构 系统包括一个由多个互相连接的32位AHB总线组成的矩阵 8个主总线 – Cortex-M4 with FPU core I-bus, D-bus and S-bus – DMA1 memory bus – DMA2 memory bus – DMA2 peripheral bus – Ethernet DMA bus

u011392772的专栏 2350

3D iToF深度分辨率测量

本文展示了RGB-D传感器在三维测量中的高精度表现。标靶深度图显示其具备清晰、低噪、无干扰的特性,点云数据完整度高且轮廓分明。该技术已成功应用于物流(体积测量误差<1%)、工业(高反光部件装配检测)和农业(果蔬成熟度分级)等领域,验证了其硬件和算法的可靠性,能够满足不同场景下的三维测量需求。

dream it possible 252

1 硬件工程师笔面试高频知识考点真题及解析——电阻

本文系统介绍了电阻的基础知识、选型要点及各类特殊电阻的应用。主要内容包括:1. 电阻选型需考虑阻值、封装、功率、精度、耐压等参数;2. 高频信号优先选用小封装电阻以减小寄生参数;3. 采样电阻需高精度、低温漂以保证测量准确性;4. 详细解析了上拉/下拉电阻、0欧电阻、磁珠等元件的特性与区别;5. 介绍了压敏电阻、热敏电阻等特殊电阻的工作原理及应用场景;6. 阐述了阻抗匹配的重要性及常见匹配方法。文章为电子工程师提供了全面的电阻选型与应用指南。

XU157303764的博客 2860

认识STM32

以STM32F407为例,介绍了内存分布、寄存器访问、位带操作、总线架构,可以在入门时对STM32的大题结构有个基本认识,水平有限,如有错误欢迎指出。本博客参考硬石科技STM32F407开发手册资料。

m0_53005872的博客 2336

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

STM32单片机自学教程

STM32是一款功能强大的微控制器,广泛应用于各种嵌入式系统中。本教程旨在帮助初学者入门STM32开发。教程介绍STM32的基本架构和特性,详细讲解开发环境的搭建,包括硬件连接、软件开发工具的安装与配置。然后,通过实例演示如何编写简单的程序,控制STM32的GPIO、定时器、串口通信等功能。最后,介绍STM32在物联网、智能家居等领域的应用案例,帮助读者拓展视野,激发创新灵感,掌握STM32开发的基本技能,为后续深入学习和实践打下基础。

weixin_42109443的博客 4万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

深入理解STM32内存管理

在讨论STM32的内存之前,先来看看STM32的存储器系统,我们知道,STM32大都属于Cortex-M系列的处理器,可以对32的存储器进行寻址,因此存储器的寻址空间能够达到4G,这就意味着指定和数据共用相同的地址空间,也就是将程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个4GB的线性地址空间内。数据字节以小端格式存放在存储器中。一个字里的最低地址字节被认为是该字的最低有效字节,而最高地址字节是最高有效字节。

zhuguanlin121的博客 2万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

STM32的汇编基础知识

使用汇编开发STM32

weixin_46545987的博客 8107

STM32学习笔记:读写内部FLASH

ST提供的库函数基本能搞定 由于 FLASH 存储器的内容在掉电后不会丢失,芯片重新上电复位后,内核可从内部 FLASH 中加载代码并运行,亦可当做EEROM来使用保存所需要的数据,以便下次启用读取数据 注:STM32F103ZET6 的 FLASH 容量为 512K 字节,属于大容量产品 STM32 的闪存模块由:主存储器、信息块和闪存存储器接口寄存器等 3 部分组成。 ☆主存储器,该部分用来存放代码和数据常数(如 const 类型的数据) ☆系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动

weixin_41226265的博客 3665

揭秘STM32内存布局:从Flash到SRAM全解析

STM32作为32位MCU,其4GB寻址空间被划分为Flash程序存储区(0x08000000起)和SRAM运行时数据区。Flash存储程序代码和常量,包括.text、.rodata、.rwdata等段;SRAM则分为数据段(.data/.bss)、堆区(动态内存分配)和栈区(函数调用上下文)。

2402_83411382的博客 3278

STM32中的Flash、ROM与RAM全解析

摘要: STM32存储结构解析:Flash作为ROM存储程序代码(.text段)和初始化数据(.data段初始值),而SRAM则用于运行时的.data段变量和.bss段内存分配。启动时,系统自动完成数据从Flash到SRAM的拷贝(.data)和清零(.bss)操作。.text段始终在Flash中执行,不占用SRAM空间。这种分层存储设计既保证了数据持久性,又提高了运行效率,通过链接脚本可查看各段在0x08000000(Flash)和0x20000000(SRAM)的具体地址分布。

C语言、数据结构、单片机、嵌入式实时操作系统、C++ 学习路径记录 3567
上一篇: RGB_TTL、LVDS、MIPI接口液晶屏学习笔记
下一篇: AHB与APB总线你需要知道的事儿
coldrainbow
博客等级 码龄19年 130粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值