stm32 总线与内存分布
来源:互联网 发布:java软件开发培训费用 编辑:程序博客网 时间:2024/04/29 15:05
1、总线
系统结构
系统包括一个由多个互相连接的32位AHB总线组成的矩阵
- 8个主总线
- 1
- 2
- 3
- 4
- 5
- 6
- 7个从总线:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
总线矩阵也能够提供主到从的访问,从而使能并发访问,甚至在多个高速外设同时工作的时候也能够高效工作. 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中提供了两个位带操作域以及对应的位带别名域
位带操作公式:
- 1
例子:
- 1
- 2
- 3
以后我们想直接操作某个寄存器的某一位的时候,只需要找到这一位对应的别名地址,然后对别名地址进行读写即可实现对这一位的读写。如果想实现这中操作的话,只需要定义宏即可,例如下面的:
- 1
- 2
- 3
内核编程手册给出的M系列4GB内存分布
3、启动配置
启动方式
我的板子启动是在main flash memory,由前面的ARM编译工具一节可以知道代码从0x08000000开始运行,这个也是由分散加载文件指定的,也是板子上面main flash实际地址
物理地址重映射
- 下面的内存空间可以被重映射:
- 1
- 2
- 3
- 4
映射表为
映射到0x00000000地址处的内存块可以由SYSCFG控制器的(SYSCFG_MEMRMP)寄存器低二位决定,如下表所示
可以看出来从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
- – 可选配置读写保护
- flash memory可以被组织成下面的样子:
- 低电量模式
内存分布图
额外补充时钟一节内容:
VOS 在 PWR_CR 寄存器的 bit15 位被设置
当 VOS = ‘0’, fHCLK 最大为 144 MHz.
当 VOS = ‘1’, fHCLK 最大为 168 MHz.
等待周期
等待周期指的是CPU访问Flash的等待时间,CPU访问Flash的周期就是等待周期加上1,这个与Flash的硬件性能有关
- stm32 总线与内存分布
- STM32之内存分布与总线
- STM32之内存分布与总线
- STM32 内存分布探究
- STM32内存分布学习
- STM32内存与堆栈
- 缓存与程序内存分布
- 变量与地址@内存分布
- STM32 FSMC总线与TFT8080接口对接分析
- cpu缓存与程序内存分布
- 结构体成员内存分布与对齐
- Java对象创建与内存分布
- Java对象创建与内存分布
- C++内存分布与虚指针
- Java虚拟机内存分布与介绍
- CPU总线带宽与内存带宽匹配
- 关于总线事件与内存事件(RFO)
- STM32 时钟分布
- angularJS监听路由变化改变页面内容
- CentOS 7 YUM 10分钟快速安装 LNMP 环境详细教程
- Android视频解码容器
- Visual Studio 2013 编译错误【error C4996: 'scanf': This function or variable may be unsafe. 】的解决方案
- How to achieve network disk by samba in linux?
- stm32 总线与内存分布
- 完全掌握Android Data Binding(一)
- 大数据资料全解析(352个案例+大数据交易白皮书+国内外政策汇篇)
- Android.mk
- 树莓派安装homebridge
- mybatis配置顺序导致报错
- Spring@Autowired注解与自动装配
- HttpURLConnection 的doGet 和doPost
- C++11时代的标准库快餐教程(4)