你好,我是吴老师。
这份是给你自己读的——不用等我讲,你一段一段往下看,看到让你停下来的地方,就照着做一遍。看不懂的整段复制给 AI,加一句"请一次只解释一个概念,讲完问我一个小问题"。
读完之后,你应该能:说清内存和 TF 卡断电后为什么不一样;解释文件、扩展名、格式化是干嘛的;写出"打开→读写→关闭"三步并说清为什么
close()不能省。用时:60–90 分钟。准备:板子、TF 卡(已格式化为 FAT32)、数据线、已经接入板卡 Skill 的 WorkBuddy。
一、一个会"失忆"的板子
第 6 课的弹球如果加个"最高分":你玩到 120 分,一按 RESET 重启——最高分归零。
因为分数存在内存(RAM) 里。内存靠电"活着",断电全没。这就像电脑文档没保存就断电,白写了。
可你的手机照片、U 盘文件、板子上的 TF 卡——断电后为什么还在?
这就是今天的问题。
目标一句话:让板子把自己的"经历"记下来,重启之后它还记得。
二、实验:重启也不清零的计数器
请使用课程的 esp32s3-touchboard-hardware-dev Skill,做"持久计数器":
每次开机,把 TF 卡里 count.txt 的数字读出来 +1 再写回去,
屏幕显示"这是第 N 次开机",串口也打印。
TF 卡用 SD_MMC,先 setPins(38,40,39,41,48,47) 再 begin。
如果 count.txt 不存在,就从 1 开始。帮我新建程序并烧录。
按几次 RESET 试试:
| 操作 | 屏幕显示 |
|---|---|
| 第一次开机 | 第 1 次 |
| 按 RESET | 第 2 次 |
| 再按 | 第 3 次 |
板子记住了。 它把数字放在了断电也不丢的地方——TF 卡。
三、内存靠"电"活着,闪存靠"锁"记住
内存(RAM):一个个小格子靠电流维持状态。像一张用发光颜料写的黑板——有光照着(供电)字就在,灯一灭字就消失。
闪存(Flash,TF 卡/U 盘/手机存储):电写进去后电荷被"锁"住,断电也跑不掉。像刻在石板上的字——不用电也一直在。
| RAM | 闪存(Flash / TF 卡) | |
|---|---|---|
| 存东西靠 | 电流维持 | 电荷被锁 |
| 断电 | 全丢 | 还在 |
| 像什么 | 发光黑板 | 刻石板 |
| 用途 | 临时算数(草稿纸) | 长期保存(保险箱) |
⚠️ 比喻有边界:闪存不是真"永远"——它有写次数寿命(几十万次起),写太频繁会磨损;写入也不是瞬间的,要先擦后写,所以比内存慢。
一句话:RAM 是草稿纸,TF 卡是保险箱。
板子上到底有几种存储?——四种,都在这一张表里
上面说的"断电丢 / 断电还在",其实这块板子上有四种地方能存东西。 把它们一次看全(数字都是这块板子的真数):
| 是什么 | 有多大 | 断电后 | 快不快 | |
|---|---|---|---|---|
| RAM | 板内草稿纸,和 CPU 直接连着 | 320 KB | 🔴 全丢 | 最快 |
| PSRAM | 外挂的大草稿纸(焊在板子上) | 8 MB | 🔴 全丢(和 RAM 一样) | 很快(比 RAM 稍慢) |
| Flash | 板子自带的小硬盘,装程序和设置 | ≈ 13 MB | 🟢 还在 | 中等 |
| TF 卡 | 你自己插的那张 | 8 ~ 32 GB | 🟢 还在 | 最慢 |
前三节你已经认识了 RAM、Flash、TF 卡。多出来的那个 PSRAM 是干什么的?
看数字就知道:板内 RAM 只有 320 KB,可你录 3 秒声音就要 192 KB、画一块草稿画布要 150 KB —— 一放就满了。所以板子在背面额外焊了一块内存条,就是 PSRAM。
💡 你其实早就用过它了——第 7 课画草稿、第 11 课拖滑杆、第 15 课录音, 提示词里那句「大缓冲区要用 PSRAM」说的就是它。 而「编译参数必须带
PSRAM=opi」也是为它——忘了带,程序能编译能烧录,但一跑就报内存不足。
⚠️ 最容易搞错的一点:PSRAM 不是硬盘。它和 RAM 是一家人—— 断电照样全丢,只是更大的一块草稿纸。 想让它断电还在?那得写进 Flash 或 TF 卡(就是本课要讲的事)。
那"保险箱"到底有多大?
光看数字可能没感觉。下面这个演示把它们画成一样比例的长条——每一格代表 1 KB:
拖一下滑杆换你的卡试试,然后看两件事:
- RAM 那条几乎看不见 —— 它的宽度只有 TF 卡的 0.0009%(十万分之一);
- PSRAM 那条终于看得见了 —— 它比 RAM 大 26 倍,可跟 TF 卡比还是细得可怜。
底部那行倍数会随卡变:32 GB 的卡,是 Flash 的 2545 倍、RAM 的 104858 倍、PSRAM 的 4096 倍。
这就解释了"为什么板子非要插一张卡"。 板子自己那 13 MB,装几个程序就满了;而你要存的照片、录音、视频, 动辄几 MB 一个——必须有一块大的、而且能拔下来带走的地方。
那速度呢?大的就一定快吗?
不一定。 容量大 ≠ 速度快。下面让它们同时搬同一个文件,看谁先到:
拖一下"文件大小",看用时怎么变。 记住这个结论:
RAM 最快、TF 卡最慢,差了大约 30 倍。
PSRAM 夹在中间:比板内 RAM 慢一些,但比 Flash、TF 卡都快—— 所以往里面放大缓冲区很划算(这也是第 7、11、15 课都用它的原因)。
这引出一个很重要的问题——既然卡这么慢,程序为什么还要用它? 下一节就讲:因为程序不会一直读卡,而是先把东西搬进 RAM,在 RAM 里算。
四、文件:CPU 是怎么拿到它的
上一节说了"卡慢、内存快"。那程序到底怎么用它们?看四个真实场景:
四个场景,各有一个主角(点标签切换看):
| 场景 | 主角 | 它在干什么 |
|---|---|---|
| ① 开机 | Flash | 你烧录的程序存在 Flash 里,CPU 开机就从它那里取指令 |
| ② 显示照片 | TF 卡 + PSRAM | 文件在卡上,先搬进 PSRAM(150 KB 太大,板内 RAM 装不下)再解码 |
| ③ 算 1+2+… | RAM | CPU 和 RAM 直接跑百万次,不碰任何存储 |
| ④ 存数据 | Flash / TF 卡 | Flash 快但拿不出来;TF 卡慢但能拔出来带走 |
| ⑤ 两种内存 | RAM vs PSRAM | 小数据放 RAM(快),大数据放 PSRAM(大但稍慢) |
注意图上四条支路:RAM、PSRAM、Flash、TF 卡是并列挂在 CPU 上的四条独立支路, 数据不会"经过 Flash 再到卡"。它们之间没有先后关系。
顺便认识一下:这块板有"两种内存"
RAM(板内) PSRAM(外挂) 大小 320 KB 8 MB(大 25 倍) 速度 最快(CPU 直接读写) 稍慢(走外部总线) 放什么 零碎变量、小数据 整张图片、整屏画布(150 KB) 两者断电都丢。程序里要放"大东西"时,得显式申请 PSRAM —— 这就是编译参数里必须带
PSRAM=opi的原因。
不管哪个场景,都有三个要点:
要点一:CPU 是唯一"发号施令"的。
TF 卡和 Flash 不会自己把数据送进 RAM。是 CPU 说一句"把这段数据搬过来", 它们才动。没有 CPU 的命令,数据哪儿也不去。
要点二:数据要先进"内存",CPU 才能用。
CPU 不能直接"读卡里的第 3 个字节"。所有的加工(+1、解码、比较……) 都是在内存里做的。所以数据得先搬进内存。
这里的"内存"既可以是板内 RAM,也可以是 PSRAM —— 谁装得下就用谁,程序自己会挑(第 7 课的草稿画布就是因为板内装不下,才用了 PSRAM)。
要点三:搬运有快有慢。
- CPU ↔ RAM:直接连在一起,很快(动画里的小球飞快);
- 经过 Flash / TF 卡:要过 SPI / SDIO 控制器,慢得多(小球慢悠悠)。
想想第 10 课那只猫:你让它显示 cat.jpg,完整路径是——
CPU 下令 → 从 TF 卡搬进 RAM(慢) → CPU 在 RAM 里解码(快) → 送去屏幕
为什么要有 DMA 这个"搬运工"? 如果 CPU 亲手一字节一字节地搬 15 万字节的图,就得占住它很久,动画根本跑不动。 所以芯片里有个专门的搬运工 DMA:CPU 只说一句,它去搬,搬完通知 CPU。 但命令永远是 CPU 下的 —— 这一点不会变。
那"文件"又是什么?
TF 卡怎么分得清照片、音乐、文字?靠文件。
- 文件名 + 扩展名:
count.txt、1.jpg、note.wav。扩展名是标签,告诉别人这是文字、图片还是声音 - 目录(文件夹)+ 路径:
/photos/1.jpg= "photos 目录里的 1.jpg" - 格式化:新卡第一次用,把空柜子装好抽屉架、做一份"目录本"(哪个抽屉在哪、装了什么)
程序读写 = 打开(找抽屉)→ 读/写(拿/放)→ 关闭(合上并记目录本)。
第 10 课(或稍后)你会读照片;今天学"写"。
五、写文件:那行不能省的 close()
计数器 +1 的核心:
打开 count.txt 用于写入
往里写当前数字
关闭文件 ← 千万别省!
板子写文件时,先把数据放在自己的临时缓冲,攒够了才真的往 TF 卡写。close() 就是在说:"把攒的货真的放进保险箱,更新目录本。"
不 close 就断电 → 缓冲里的数据丢了——你写了,但没存上。
💡 写完文件,一定 close()。 这是工程习惯第一课。
六、只改一处:删掉 count.txt 会怎样
把 TF 卡里的 count.txt 删掉,再重启板子:
| 我改了什么 | 我预测 | 实际 |
|---|---|---|
| 删掉 count.txt 重启 |
程序遇不到文件,会按写好的"从 1 开始"处理 → 第 1 次。
再试试:把 count.txt 里的数字手动改成 100 再重启——程序"读文件"而不是"从零记忆",一切以文件里存的内容为准。
七、除了"大",TF 卡还有一点赢在哪
第三节你已经看到:板载 Flash 只有十几 MB,而一张卡是几十 GB。 "大"是一个原因。但还有更关键的一点——
板载 Flash 里的数据,你拿不出来。
板子上的 Flash 是焊死在电路板上的。里面存了什么,你只能让程序打印出来看, 不能把它插到电脑上直接翻。
而 TF 卡可以随时拔下来插进电脑:
- 把
count.txt打开,亲眼看见那串数字; - 把录音文件拖到电脑上,双击就能听;
- 照片拍满了,换一张卡就行。
数据能带出来,数据才是你的。 存在一个你打不开的地方,和没存——对使用者来说差别不大。
这也解释了一件事:为什么相机、行车记录仪、手机都要用存储卡, 而不是把东西都塞进设备自己的芯片里。
八、下一课预告
本课存的是数字。第 12 课录的声音在内存里也是一串数字(一秒 16000 个)。把这串数字写进文件,声音就能存下来——下一课做"声音留言机",把录音存成 TF 卡里的 wav。
九、故障排查
| 现象 | 先检查 |
|---|---|
| 读不到卡(mount failed) | 卡插紧了吗?格式化了吗(FAT)?setPins 在 begin 前吗? |
| 写了重启就没了 | 忘 close() 了吗? |
| 能读不能写 | 卡套写保护锁拨开没有? |
| 打不开文件 | 目录存在吗?路径对吗? |
十、过关检查
- RAM 和 TF 卡断电后有什么区别?为什么?
- 格式化干什么?扩展名干嘛的?
- 写文件三步?
close()为什么不能省? - 计数器重启接着涨,"记住"的是什么?存在哪?
- 删掉 count.txt 重启会怎样?为什么?
- 为什么数据要能带出来?
十一、还能玩什么
- 开机日记:每次开机往 diary.txt 追加一行
- 弹球最高分:撞墙最高分存 SD,重启不丢
- 音量记录:每分钟把音量记一行
- 我的档案卡:自我介绍.txt 开机读出来显示
下一课见——把声音也锁进保险箱。