[综合信息] N32H7xx SRAM与TCM解析

[复制链接]
Puchou 发表于 2025-8-11 21:09 | 显示全部楼层 |阅读模式
为客户写N32H762  uart IAP升级例程,程序要拷贝到 ITCM中运行,看 N32H76x_78x用户手册Memory Organization 章节memory map,发现map表格中SRAM 有好几段定义,一般用户看了肯定会晕菜,弄不清楚其中的关系,所以写一篇文章记录下来。

通过 N32H76x_78x用户手册上Table 2-5 N32H7xx Memory map可以查看SRAM的分布情况,

SRAM主要由AXI SRAM, AHB SRAM这两部分部分组成:




自己画了一个表格把这两个SRAM做了小结,N32H76x,N32H78x MCU内部AXI SRAM主要有以下几块:




N32H76x,N32H78x MCU内部AHB SRAM主要有以下几块:




在以上的描述中可以看出,用户可以使用的SRAM区域有128K + 1M + 352K = 480K+1M。

而在N32H76x, N32H78x的数据手册中system RAM都是写的 480K,那不是和用户手册和数据手册SRAM容量写的不一致? 如下截图:





这是因为AXI SRAM 2和AXI SRAM 3的1M空间既可以作为SRAM使用,也可以当作TCM来使用,在数据手册中把这1MB空间划给了TCM。既然可以当作sram用为什么要当作TCM使用,当然是因为TCM中存数据和指令运行起来比在SRAM中要快。为什么在TCM中运行指令比在SRAM中要快,AXI, AHB,APB,TCM又有什么区别:

AXI全称Advanced eXtensible Interface,即高级可扩展接口,是ARM 1996年提出的微控制器总线家族AMBA中的一部分,它是 ARM 公司所提出的AMBA(Advanced Microcontroller Bus Architecture 高级微控制器总线架构)协议的一部分。AXI 协议就是描述了主设备和从设备之间的数据传输方式,在该协议中,主设备和从设备之间通过握手信号建立连接。

AHB (Advanced High-performance Bus),全称叫作高级高性能总线。AHB用于高性能、高时钟频率的系统结构,典型的应用如ARM核与系统内部的高速RAM、NAND FLASH、DMA、Bridge的连接。

APB (Advanced Peripheral Bus) ,全称叫作高级外围总线, APB主要用在低带宽和不需要高性能总线的外围设备上例如UART、1284等。 APB是非流水线结构,所有的信号仅与时钟上升沿相关,这样就可以简化APB外围设备的设计。

关于APB,AHB,AXI协议介绍这篇文章说的比较清楚:APB_AHB_AXI协议的简单介绍 - 咸鱼书生 - 博客园 (APB_AHB_AXI协议的简单介绍)

TCM又分为ITCM和DTCM

ITCM(Instruction Tightly Coupled Memory) 称为指令紧密耦合存储器, 内核中指令传输总线,用于缓存指令,

DTCM(Data Tightly Coupled Memory) 称为数据紧耦合内存, 内核中数据传输总线,用于缓存数据

紧耦合指该部分存储空间与内核联系紧密,具有非常高的访问速度。

为什么TCM比SRAM访问速度要快,deepseek上说法是这样的:

零等待访问延迟

ITCM 是直接连接到处理器指令总线的紧耦合存储器,CPU 访问 ITCM 时无需通过系统总线。

SRAM 通常挂载在系统总线(如 AHB/AXI)上,访问需经过总线仲裁、协议转换等步骤,引入延迟。

无总线竞争

ITCM 是 CPU 指令访问的独占通道,不受其他主设备(如 DMA、外设)访问总线的影响。

SRAM 与数据存储器、外设共享系统总线,当 DMA 或其他核心频繁读写时,CPU 访问 SRAM 会被阻塞,导致流水线停顿。

更高的带宽利用率

ITCM 的带宽专用于指令流,能持续以最高效率供给 CPU 取指。

SRAM 的带宽需被数据/指令共享,利用率可能受干扰。

确定性低延迟

ITCM 的访问时间是单周期且可预测的,对实时系统(如中断响应)至关重要。

SRAM 的访问延迟受总线负载影响,可能存在波动。

通过以上说明可以知道TCM就是一段紧挨着内核的内存,它的访问速度很快,比AHB速度要快,N32H76x和N32H78x的TCM既可以当作ITCM又可以当DTCM,可以配置成ITCM,也可以配置成DTCM,因此可以理解为AXI SRAM 2,AXI SRAM 3这1M空间就是为TCM设计的。用户使用时把它们配置成TCM来使用会提升代码执行效率。1M空间是ITCM和DTCM公用的,如果某一部分配成了ITCM,DTCM只能从剩余的空间中配置。那怎么去配置ITCM, DTCM大小呢?

在startup_n32h76x.s启动文件中会调用systemInit()函数,在systemInit()函数的最后会调用ConfigTcmSize()函数配置TCM,通过宏定义INIT_TCM_SIZE来开启配置:


/*defaule TCM_SIZE=0x2f, All TCMSRAM are AXI_SRAM,if you want to use ITCM/DTCM, define INIT_TCM_SIZE*/
#ifdef INIT_TCM_SIZE
    ConfigTcmSize(TCM_SIZE_VALUE);
#endif


看注释,默认情况下TCM的大小是0x2f,看ConfigTcmSize()函数参数tcmSizeValue说明:

/**
*\*\name   ConfigTcmSize.
*\*\fun    Config TCM_SIZE
*\*\param  tcmSizeValue :
*\*\           0x00 :1024KB ITCM,0  KB DTCM,0   KB AXI_SRAM
*\*\           0x01 :896 KB ITCM,128 KB DTCM,0   KB AXI_SRAM
*\*\           0x02 :768 KB ITCM,256 KB DTCM,0   KB AXI_SRAM
*\*\           0x03 :640 KB ITCM,384 KB DTCM,0   KB AXI_SRAM
*\*\           0x04 :512 KB ITCM,512 KB DTCM,0   KB AXI_SRAM
*\*\           0x05 :384 KB ITCM,640 KB DTCM,0   KB AXI_SRAM
*\*\           0x06 :256 KB ITCM,768 KB DTCM,0   KB AXI_SRAM
*\*\           0x07 :128 KB ITCM,896 KB DTCM,0   KB AXI_SRAM
*\*\           0x08 :0   KB ITCM,1024KB DTCM,0  KB AXI_SRAM
*\*\           0x09 :896 KB ITCM,0   KB DTCM,128 KB AXI_SRAM
*\*\           0x0A :768 KB ITCM,128 KB DTCM,128 KB AXI_SRAM
*\*\           0x0B :640 KB ITCM,256 KB DTCM,128 KB AXI_SRAM
*\*\           0x0C :512 KB ITCM,384 KB DTCM,128 KB AXI_SRAM
*\*\           0x0D :384 KB ITCM,512 KB DTCM,128 KB AXI_SRAM
*\*\           0x0E :256 KB ITCM,640 KB DTCM,128 KB AXI_SRAM
*\*\           0x0F :128 KB ITCM,768 KB DTCM,128 KB AXI_SRAM
*\*\           0x10 :0   KB ITCM,896 KB DTCM,128 KB AXI_SRAM
*\*\           0x11 :768 KB ITCM,0   KB DTCM,256 KB AXI_SRAM
*\*\           0x12 :640 KB ITCM,128 KB DTCM,256 KB AXI_SRAM
*\*\           0x13 :512 KB ITCM,256 KB DTCM,256 KB AXI_SRAM
*\*\           0x14 :384 KB ITCM,384 KB DTCM,256 KB AXI_SRAM
*\*\           0x15 :256 KB ITCM,512 KB DTCM,256 KB AXI_SRAM
*\*\           0x16 :128 KB ITCM,640 KB DTCM,256 KB AXI_SRAM
*\*\           0x17 :0   KB ITCM,768 KB DTCM,256 KB AXI_SRAM
*\*\           0x18 :640 KB ITCM,0   KB DTCM,386 KB AXI_SRAM
*\*\           0x19 :512 KB ITCM,128 KB DTCM,386 KB AXI_SRAM
*\*\           0x1A :384 KB ITCM,256 KB DTCM,386 KB AXI_SRAM
*\*\           0x1B :256 KB ITCM,384 KB DTCM,386 KB AXI_SRAM
*\*\           0x1C :128 KB ITCM,512 KB DTCM,386 KB AXI_SRAM
*\*\           0x1D :0   KB ITCM,640 KB DTCM,386 KB AXI_SRAM
*\*\           0x1E :512 KB ITCM,0   KB DTCM,512 KB AXI_SRAM
*\*\           0x1F :384 KB ITCM,128 KB DTCM,512 KB AXI_SRAM
*\*\           0x20 :256 KB ITCM,256 KB DTCM,512 KB AXI_SRAM
*\*\           0x21 :128 KB ITCM,384 KB DTCM,512 KB AXI_SRAM
*\*\           0x22 :0   KB ITCM,512 KB DTCM,512 KB AXI_SRAM
*\*\           0x23 :384 KB ITCM,0   KB DTCM,640 KB AXI_SRAM
*\*\           0x24 :256 KB ITCM,128 KB DTCM,640 KB AXI_SRAM
*\*\           0x25 :128 KB ITCM,256 KB DTCM,640 KB AXI_SRAM
*\*\           0x26 :0   KB ITCM,384 KB DTCM,640 KB AXI_SRAM
*\*\           0x27 :256 KB ITCM,0   KB DTCM,768 KB AXI_SRAM
*\*\           0x28 :128 KB ITCM,128 KB DTCM,768 KB AXI_SRAM
*\*\           0x29 :0   KB ITCM,256 KB DTCM,768 KB AXI_SRAM
*\*\           0x2A :128 KB ITCM,0   KB DTCM,896 KB AXI_SRAM
*\*\           0x2B :0   KB ITCM,128 KB DTCM,896 KB AXI_SRAM
*\*\           0x2C~2F :0KB ITCM,0  KB DTCM,1024KB AXI_SRAM
*\*\return none  
*/               
void ConfigTcmSize(uint32_t tcmSizeValue)
{
    uint32_t currValue = (*(uint32_t(*)(void))0x1ff00f01)();
    if((currValue == 0x2c) && (currValue != tcmSizeValue))
    {
        *(uint32_t*)0x51105280 = tcmSizeValue;
        NVIC_SystemReset();
    }
}



当tcmSize配置成0x2f时,ITCM大小是0,DTCM大小是0,AXI_SRAM 大小是 1024kB,

就是在这里配置TCM的,如果用户没有配置TCM_SIZE_VALUE,那么系统会有一个默认值,这个默认值就是0x2f, 在N32H76x_78x 所有的例程中会将TCM_SIZE_VALUE 配成0x20:

#define TCM_SIZE_VALUE   (0x20) /*TCM_SIZE=0x20:256K ITCM;256K DTCM;512K AXI_SRAM*/


即 ITCM 大小配成256K, DTCM大小配成256K, AXI_SRAM大小配成512K。

有个疑问,在上述ConfigTcmSize函数中使用了函数指针(*(uint32_t(*)(void))0x1ff00f01)(),这个函数指针的地址0x1ff00f01 从用户手册的memory map看是boot 时OM,这个接口是实现什么功能的,目前还不清楚。




另外,在调试中还发现一个问题,每次上电后调用ConfigTcmSize函数配置TCM大小,只能配置一次,如果要重新配置要将MCU重新下电,上电才能配置 成功。
————————————————
版权声明:本文为CSDN博主「flashsim」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/c366807503/article/details/148948768

您需要登录后才可以回帖 登录 | 注册

本版积分规则

64

主题

207

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部