STM32H7整体架构把控
可配合ARM架构简介一起看:https://www.newbie.pics/index.php/archives/36/
---基于STM32H750XB

在Data sheet中存在以下框图,由该框图我们可以知道各个总线挂载的外设以及最大时钟频率等具体细节

了解这部分框图有利于对整个架构的把控,接下来逐个分解,先来看看内核部分

内核以及内核接口包含了
- AXIM总线接口
- AHBP总线接口
- AHBS
- I-Cache
- D-Cache
- JTAG/SW(调试接口)
- ETM接口
- I-TCM(64KB)
- D-TCM(64KB*2)
AXIM接口 通过64位总线连接形成AXI总线矩阵


这里我们称作D1域,主要是连接一些高速设备(64位总线),主要有以下八种外设接口,
- SDMMC (支持EMMC/SDIO contexM7之前只支持SDIO)
- MDMA (专门用于内存到内存的数据传输Memory-to-Memory DMA)
- DM2D ((Data Movement to Display)一个硬件加速器,用于图形数据的高效处理和传输,特别是在图形显示应用中,有时也被称为Chrom-ART Accelerato或简称Chrom-ART)
- LTDC(LCD接口)
- FLASH Memory (挂载我们熟悉的Flash)
- AXI SRAM(挂载我们熟悉的SRAM)
- QSPI(支持外扩Flash)
- FMC(支持外扩RAM)
AHBP总线接口

由以上的图可以看到AHBP接口连接到AHB总线矩阵,AHB总线矩阵又散开,分为了AHB4总此线,AHB2总线,AHB1总线,AHB1总线上又连接到APB1总线上,……总之类似一个大树,有树干,树干上又有树枝,形成了STM32的总线树形图,由于不同总线挂载太多外设了,这里就不整理出来了,直接看图简洁明了,
最终通过总线把STM32H7划分了三个区域,三个域之间也是可以实现互联的
- D1域主要用于连接高速设备
- D2域主要用于连接一般的外设
- D3域主要用于低功耗(当系统断电或进入深度休眠模式时,D3域仍然可以保持供电)


以上的图较难直观看出总线直接设备的连接,于是给出了这么一张框图用于了解各设备之间连接情况


多个域的结构优点
- 满足低功耗(每个域可以独立地进入或退出低功耗模式)
- 隔离与安全性(故障或错误在一个域中不太可能影响到其他域)
- 灵活的时钟管理(每个域可以有其独立的时钟源和频率设置)
- 扩展性与模块化(多域结构支持模块化的设计,允许在不同的域中添加或移除功能。)
AHBS

上面这个框图中显示没有任何连接,但在以下的框图中显示连接到MDMA



- MDMA 有两个主控总线接口,一个是 AXI/AHB 总线接口,主要用存储器或者外设访问,另一个是 AHBS 总线接口,仅用于I- TCM 与D-TCM空间访问
I-Cache与D-Cache

类比PC下存在的三级缓存,这里也有,我们知道哈弗体系结构指令和数据是分开存储的,如此一来设计出了指令缓存与数据缓存,这里的缓存只有一级(指令缓存和数据缓存都是16KB)
缓存的意义在于提高处理器的访问速度,cache位于cpu与内存之间。当处理器需要访问某个数据时,它首先会检查cache中是否有这个数据。如果有,处理器就会直接从缓存中读取(我们把这一过程叫做缓存命中),而不是从主内存中读取。这种机制可以大大提高数据访问速度
但是我们需要知道同时使用缓存与DMA可能会出现数据不一致的问题
- DMA将数据写入内存,但CPU缓存中仍然保存有旧数据。
- CPU将数据写入缓存,但DMA从内存中读取的是旧数据。
如何解决以上问题?
- 刷新缓存(会从内存更新数据)
- 软件上禁用 cache
- 缓存一致性协议(Cache Coherency Protocol)
- 使用缓冲区同步技术(Linux下)
JTAG/SWD调试接口

PASS
ETM接口
用于硬件仿真
ETM(Embedded Trace Macrocell)是ARM微控制器和微处理器中用于高级调试和系统跟踪的一个模块。在STM32以及其他基于ARM Cortex核心的微控制器中,ETM提供了对指令跟踪的支持,从而允许开发者进行详细的性能分析和系统调试。
I-TCM 和 D-TCM
I-TCM:指令紧密耦合存储器(支持64位访问)
D-TCM:数据紧密耦合存储器(支持32位访问)
通过专用 TCM 总线直接连接到 Cortex-M7 内核(跟内核速度一样快)


STM32H750XB内存分布
我使用的STM32H750XB,内存分配为
- 192KB的 TCM RAM
- 864KB的 SRAM
4KB的备份SRAM
192+864+4 = 1060KB(1MB多一丢丢)


以上可以知道并不是挂到一个地方,分布于
- 内核专用TCM总线接口上
- D1域
- D2域
- D3域

内核400M举例 可配置480M
D1域(200M)
AXI-SRAM(512KB) 起始地址:0x2400 0000 结束地址:0x2408 0000
D2域 (200M)
AHB-SRAM(128KB) 起始地址:0x3000 0000 结束地址:0x3002 0000
AHB-SRAM(128KB) 起始地址:0x3002 0000 结束地址:0x3004 0000
AHB-SRAM(32KB) 起始地址:0x3004 0000 结束地址:0x3400 8000
D3域(200M)
AHB-SRAM(64KB) 起始地址:0x3800 0000 结束地址:0x3801 0000
AHB-BACKUP-SRAM(4k) 起始地址: 0x3880 0000 结束地址:0x3880
内核(400M)
DTCM-RAM(128KB) 起始地址:0x2000 0000 结束地址:0x2002 0000
ITCM-RAM(64KB) 起始地址:0x0000 0000 结束地址:0x0001 0000
这里只提供了两个可选区域,使用多个区域需要更改分散加载文件

这里看到一篇应用,可以做参考
https://blog.csdn.net/Jaken5213/article/details/114098080?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169787127216800192210141%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=169787127216800192210141&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-4-114098080-null-null.142^v96^pc_search_result_base5&utm_term=sram%E5%88%86%E5%B8%83%E4%B8%8D%E5%90%8C%E5%8C%BA%E5%9F%9F%E6%9C%89%E4%BB%80%E4%B9%88%E5%A5%BD%E5%A4%84&spm=1018.2226.3001.4187
为什么要分布这多域呢,我猜可能是低功耗与内存隔离吧。