第二章 TC3xx内存架构概览

各位同学,今天我们来聊聊TC3xx的内存架构。说实话,这块内容我当年刚接触时也绕了不少弯路。你想想看,一个芯片里塞了这么多不同类型的存储器,程序Flash、数据Flash、LMU、SRAM、分布式内存……光名字就够让人头大的。

但别急,我带你一个一个捋清楚。搞懂了这些,后面MPU配置才能得心应手。

2.1 程序Flash(PFlash)

程序Flash,顾名思义,主要用来存放代码。TC3xx的PFlash有几个特点:

  • 容量大:从几MB到十几MB不等,具体看型号
  • 读取快:支持128位甚至256位宽度的读取
  • 可加密:保护你的代码不被别人偷走

我在项目中遇到过一件事:有个同事把大块数据也塞进PFlash,结果导致代码读取效率下降。为什么呢?因为PFlash的读取带宽虽然高,但随机访问延迟比SRAM大。说白了,它适合顺序执行代码,不适合频繁跳转的数据表。

核心要点:PFlash是代码的“家”,别把它当数据仓库用。

2.2 数据Flash(DFlash)

DFlash和PFlash不同,它专门存数据。比如标定参数、故障码、配置信息这些需要掉电保存的东西。

DFlash有两个关键特性:

  • 可擦写次数有限:一般10万次左右,别拿它当SRAM用
  • 写入速度慢:擦除一个扇区可能要几十毫秒

我曾经踩过一个坑:在中断服务函数里直接写DFlash,结果系统响应变慢,看门狗超时复位。后来我学乖了,DFlash操作都放到后台任务里做。

警告:不要在实时性要求高的路径里操作DFlash!

2.3 LMU(本地内存单元)

LMU是个有意思的东西。它本质上是一块SRAM,但位置很特殊——挂在CPU的本地总线上。

这意味着什么?

  • 访问延迟低:比访问全局SRAM快
  • 容量适中:通常几十KB到几百KB
  • 适合放关键数据:比如堆栈、中断向量表

我个人习惯把实时性要求最高的数据放在LMU里。比如电机控制中的电流环参数,放LMU里能省下好几个时钟周期。

小技巧:LMU的地址空间是固定的,配置MPU时记得给它单独划一个区域。

2.4 SRAM(全局静态随机存储器)

SRAM是系统的主内存,所有CPU核都能访问。TC3xx的SRAM通常分为几个块:

SRAM块 典型容量 用途
DSPR 32-128KB CPU本地数据
PSPR 16-64KB CPU本地程序
全局SRAM 几百KB到几MB 共享数据

嗯,这里要注意:DSPR和PSPR虽然是SRAM,但它们挂在CPU本地总线上,访问速度比全局SRAM快。所以,关键数据优先放DSPR,关键代码优先放PSPR。

我记得有个项目,系统跑着跑着就卡顿。排查了半天,发现是全局SRAM访问冲突太严重。后来把高频访问的数据挪到DSPR里,问题就解决了。

2.5 分布式内存

分布式内存是TC3xx的一大特色。每个CPU核都有自己的本地内存,但又能访问全局内存。这种架构的好处是:

  • 减少总线竞争:各干各的,互不干扰
  • 提高访问效率:本地内存访问零等待
  • 灵活配置:可以动态调整内存归属

但分布式内存也有坑。你想想看,如果CPU0往自己的DSPR里写了个数据,CPU1想读这个数据,怎么办?

答案是通过全局SRAM或者专门的核间通信机制。我见过有人直接拿DSPR当共享内存用,结果数据不一致,查bug查到崩溃。

避坑指南:我曾经在分布式内存配置上栽过跟头。当时没注意CPU0和CPU1的本地内存地址有重叠,结果两个核写同一个地址,数据互相覆盖。后来我养成了习惯:每个核的本地内存地址范围必须画清楚,贴在工位上。

2.6 内存映射与地址空间

TC3xx的内存映射是固定的,但不同型号略有差异。一般来说:

  • PFlash:0x80000000开始
  • DFlash:0xAF000000开始
  • LMU:0x90000000开始
  • 全局SRAM:0x60000000开始
  • 分布式内存:每个核有自己的地址段

配置MPU时,你得知道这些地址范围。不然保护规则写错了,该保护的地方没保护,不该保护的地方反而挡住了。

个人经验:我建议你先把芯片手册里的内存映射表打印出来,做MPU配置时对照着看。别偷懒,这一步省不了。

2.7 小结

好了,TC3xx的内存架构就讲到这里。总结一下:

  • PFlash放代码,别乱塞数据
  • DFlash存参数,别频繁写
  • LMU放关键数据,访问快
  • SRAM分本地和全局,各司其职
  • 分布式内存要小心核间通信

下一章我们开始讲MPU的具体配置。到时候你会看到,这些内存知识全都能用上。嗯,做好准备吧。