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– USB OTG HS DMA bus
  • 7个从总线:
    – Internal Flash memory ICode bus– Internal Flash memory DCode bus– Main internal SRAM1 (112 KB)– Auxiliary internal SRAM2 (16 KB)– AHB1 peripherals including AHB to APB bridges and APB peripherals– AHB2 peripherals– 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 FFFF 0x2200 0000~0x23FF FFFC
外设的低1M字节 : 0x4000 0000~0x400F FFFF 0x4200 0000~0x43FF FFFC

位带操作公式:

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

例子:

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

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

#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)
//上面两个宏可以实现对寄存器位带域的操作

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

3、启动配置

启动方式

Boot mode selection pins Boot mode Aliasing
BOOT1 BOOT0
x 0 Main Flash memory Main Flash memory is selected as the boot space
0 1 System memory System memory is selected as the boot space
1 1 Embedded SRAM Embedded 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)

映射表为

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

bit1 bit0 memory selected
0 0 Main Flash memory mapped at 0x0000 0000
0 1 System Flash memory mapped at 0x0000 0000
1 0 FSMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x0000 0000
1 1 Embedded 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的硬件性能有关


如果觉得本文章不错,请关注微信公众号-YellowMax多多支持,查看更多文章
欢迎转发、关注、点赞一波
微信公众号

STM32之内存分布与总线相关推荐

  1. stm32的内存分布

    一.MDK下的概念 1)Code:代码段,存放程序的代码部分. 2)RO-data:只读数据段,存放定义的常量. 3)RW-data:读写数据段,存放初始化为非0值的全局变量和静态变量. 4)ZI-d ...

  2. STM32 内存分布探究

    STM32 内存分布探究 2016-2-2 本人在运行ucos时遇到一个非常奇怪的问题,运行一段时间后就会莫名进入hardfault函数,导致系统死机.后来根据对堆栈调试,发现每次调用的函数都不一样, ...

  3. STM32(C语言)内存分布

    STM32(C语言)内存分布 文章目录 前言 一.STM32内存分布 二.三段式分布 前言 缘由: 最近尝试在STM32上移植SOEM,使用的基例程是原子的LWIP实验,在移植完成后出现了内存冲突的问 ...

  4. 程序运行时对应的内存分布(BSS段、数据段、代码段、堆、栈)关系

    参考:程序运行时对应的内存分布关系 作者:嵌入式基地(公众号) 发布时间: 2021-04-28 网址:https://mp.weixin.qq.com/s/AVDPZawSjg9HtxEm8vsFB ...

  5. arm32 linux 内存分布,gcc代码反汇编查看内存分布[2]: arm-linux-gcc

    arm-none-linux-gnueabi-gcc -v gcc version 4.4.1 (Sourcery G++ Lite 2010q1-202) 重点: 代码中的内存分配, 地址从低到高: ...

  6. linux 进程内存分布及 堆分配和栈分配的特点

    文章目录 进程内存空间分布 size命令查看内存分布 堆方式内存分配和栈方式内存分配比较 使用stap 深入追踪malloc逻辑 进程内存空间分布 一个程序的内存空间主要如下: 代码段(text se ...

  7. C++ 类的内存分布

    C++类内存分布 转自:http://www.cnblogs.com/jerry19880126/p/3616999.html 先写下总结,通过总结下面的例子,你就会明白总结了. 下面总结一下: 1. ...

  8. 【Linux 内核 内存管理】Linux 内核内存布局 ④ ( ARM64 架构体系内存分布 | 内核启动源码 start_kernel | 内存初始化 mm_init | mem_init )

    文章目录 一.ARM64 架构体系内存分布 二.Linux 内核启动源码 start_kernel 三.内存初始化源码 mm_init 四.内存初始化源码 mem_init 一.ARM64 架构体系内 ...

  9. 【Linux 内核 内存管理】Linux 内核内存布局 ② ( x86_64 架构体系内存分布 | 查看 /proc/meminfo 文件 | /proc/meminfo 重要字段解析 )

    文章目录 一.查看 x86_64 架构体系内存分布 二./proc/meminfo 重要字段解析 一.查看 x86_64 架构体系内存分布 执行 cat /proc/meminfo 命令 , 可以查看 ...

最新文章

  1. 最全面的缓存架构设计
  2. man nfsd(rpc.nfsd中文手册)
  3. xshell远程登录ubuntu设置流程
  4. 因退休太无聊,Python创始人加入微软!
  5. 提交代码到GitHub,小绿格却不增加?
  6. 博士生创新能力的培养点滴
  7. ubunut16.04解决网速慢的办法
  8. 如何在Spring 3.x中使用事件
  9. php动态数组的用法
  10. 机票分享第一篇 机票由何而来
  11. linux raid autodetect,软raid的建立
  12. MSDN 教程短片 WPF 20(绑定3-ObjectDataProvider)
  13. 【编辑器】Notepad++相关
  14. 【云计算】Netflix 开源持续交付平台 Spinnaker
  15. Android 将自己的应用改为系统应用
  16. ios越狱c语言编译器,iOS12越狱
  17. 【重磅】新智元推出百万级AI智库资讯互动平台,AI World2017世界人工智能大会TOP10大奖榜单发布
  18. Failed to save persistent token
  19. 输入一系列整数,建立二叉排序树,并进行前序,中序,后序遍历。
  20. 产品故事:一家服装厂的创新之路

热门文章

  1. java 秒表_JAVA计时器秒表程序代码
  2. 苹果保修期_苹果手机怎么查看保修期 查询有效保修状态日期方法
  3. Windows XP 下安装SQL SERVER 2005问题汇总
  4. 【Python办公自动化】快速将excel按照某列不同的值批量拆分
  5. 指针学习中二维数组解引用问题
  6. 22.【实战】车辆统计
  7. 【python学习】-字典学习(访问字典所有键与值、修改与更新字典、删除字典)
  8. TCL作价5000万美元收购美国Novatel Wireless公司MIFI业务
  9. OpenCV图像色温
  10. 信息系统项目管理案例分析