第二章 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的具体配置。到时候你会看到,这些内存知识全都能用上。嗯,做好准备吧。