AI脑洞板
完整教案
自学课件
第 14 课 · 共 14/51 课

TF 卡原理 为什么板子断电不会忘

课时
待定
器材
ESP32-S3 触摸屏板 + USB 线
前置知识
无
配套代码
见项目 demo 目录

你好,我是吴老师。

这份是给你自己读的——不用等我讲,你一段一段往下看,看到让你停下来的地方,就照着做一遍。看不懂的整段复制给 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 是草稿纸断电丢,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:

拖一下滑杆换你的卡试试,然后看两件事:

  1. RAM 那条几乎看不见 —— 它的宽度只有 TF 卡的 0.0009%(十万分之一);
  2. 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+…RAMCPU 和 RAM 直接跑百万次,不碰任何存储
④ 存数据Flash / TF 卡Flash 快但拿不出来;TF 卡慢但能拔出来带走
⑤ 两种内存RAM vs PSRAM小数据放 RAM(快),大数据放 PSRAM(大但稍慢)

注意图上四条支路:RAM、PSRAM、Flash、TF 卡是并列挂在 CPU 上的四条独立支路, 数据不会"经过 Flash 再到卡"。它们之间没有先后关系。


顺便认识一下:这块板有"两种内存"

RAM(板内)PSRAM(外挂)
大小320 KB8 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()。 这是工程习惯第一课。

写文件三步(打开→读写→关闭),为什么 close() 不能省:缓冲里的数据靠 close 才真写进 TF 卡

六、只改一处:删掉 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() 了吗?
能读不能写卡套写保护锁拨开没有?
打不开文件目录存在吗?路径对吗?

十、过关检查

  1. RAM 和 TF 卡断电后有什么区别?为什么?
  2. 格式化干什么?扩展名干嘛的?
  3. 写文件三步?close() 为什么不能省?
  4. 计数器重启接着涨,"记住"的是什么?存在哪?
  5. 删掉 count.txt 重启会怎样?为什么?
  6. 为什么数据要能带出来?

十一、还能玩什么

  • 开机日记:每次开机往 diary.txt 追加一行
  • 弹球最高分:撞墙最高分存 SD,重启不丢
  • 音量记录:每分钟把音量记一行
  • 我的档案卡:自我介绍.txt 开机读出来显示

下一课见——把声音也锁进保险箱。

第 14 课 · 重启不清零的计数器

第 14 课 · 重启不清零的计数器

把「第几次开机」记在 TF 卡里,按 RESET 重启,它接着往下数。

14TF卡文件持久化
第 14 课 · 开机日记

第 14 课 · 开机日记

每次开机往 diary.txt 追加一行,拔卡插电脑用记事本就能看。

14TF卡追加文件
第 14 课 · 卡里有什么

第 14 课 · 卡里有什么

开机把 TF 卡根目录里的文件和文件夹一个一个列在屏幕上。

14TF卡目录遍历
第 14 课 · 破纪录才写盘

第 14 课 · 破纪录才写盘

按 BOOT 打一局拿随机分,只有破了纪录才写入 highscore.txt。

14TF卡存档最高分