板子刚焊好,第一次上电。调试器随便读一块 RAM,满屏 0x5A、0xE3、0x0F……毫无规律。第一反应多半是'芯片坏了',或者是'哪个家伙没初始化就写内存'。
其实谁都没写。这片 RAM 从上电那一刻起,内容本来就是乱的。教科书上写过这件事,但不少做固件的人并没把背后的物理过程想透。这篇把它从头拆一遍。
先放结论
上电(冷启动)之后,SRAM 里的值是不确定的:每个 bit 独立地随机落在 0 或 1,整体既不是全 0,也不是全 FF。换一次上电、换一颗芯片,结果都可能不一样。
不是玄学,往下看。
存一个 bit 的,是个'锁'
标准 SRAM 单元是 6T,六个晶体管:
- 四个管子搭成两个反相器,每个反相器一个 PMOS 上拉、一个 NMOS 下拉;
- 两个管子当存取开关,接字线和位线,管读写。
反相器的行为一句话:输入 1 出 0,输入 0 出 1。
重点是'交叉耦合'四个字:反相器 A 的输出 Q 接到反相器 B 的输入,B 的输出 Q̅ 再接回 A 的输入。两个反相器首尾相接,绕成一个闭环。

闭环自带正反馈,于是只有两个状态站得住:
- Q=1、Q̅=0:Q 喂给 B 一个 1,B 输出 0 给 A,A 看到 0 就输出 1……绕一圈还是 Q=1,自洽,稳住。
- Q=0、Q̅=1:同一个道理,反过来。
别的状态?没有。像'Q 和 Q̅ 都在中间电平'那种两可状态,理论上存在,但极不稳定——电平只要偏一点点,正反馈几纳秒内就把它推到两个稳态之一。说白了,这对反相器就是刻在硅片上的跷跷板,只有两头能停。
为什么断电就丢
稳态全靠电源撑着。PMOS 导通把节点拉到 VDD,NMOS 导通把节点拉到 GND,这动作本身就得有电。电源一断,VDD 归零,节点电平全部消失,锁存状态灰飞烟灭。
注意,这不是'被抹成 0',是'状态整个没了'。SRAM 的易失,就是这么来的。
上电瞬间,一场微型赛跑
VDD 从 0 往上爬。爬升途中,所有晶体管几乎同时开始导通,两个反相器的输入输出节点都跟着电源电压飘在中间附近——单元正卡在那个'两可'的不稳定点上,像一颗球停在双井势垒的脊顶,往哪边倒都行。
球往哪边滚,取决于单元里那点'天然的不对称'和'扰动':
- 工艺偏差。左右两组晶体管的阈值电压、沟道尺寸、掺杂浓度不可能完全一致,差个几十毫伏就够定胜负。这也是换一颗芯片结果就变的原因。
- 噪声。热噪声、电源纹波,每次上电的瞬时扰动都不一样,这是'每次上电都不同'的主要来源。
- 爬坡速率。电源爬得快慢不同,耦合进两个节点的电荷不平衡程度就不同。同一个板子,改一下上电时序,RAM 初值可能就不一样。
- 温度。影响阈值和噪声水平,冷热环境下偏向也会变。
哪怕只有几个毫伏的差异,某边一占上风,正反馈立刻放大,把单元锁死到确定的一边——这个 bit 就此有了确定的初值:0 或 1。每个 bit 都这么来一遍,整片 RAM 就成了一个不可预测、每次上电都可能不同的模式。

这里有个容易忽略的细节:这种随机是'有偏'的。工艺失配严重的单元,可能每次上电都偏向同一边;失配小的单元才真正随机。所以'上电值随机'不等于'每次全变',更不等于'平均一半 0 一半 1'。
工程上意味着什么
硬件保证不了 RAM 的初值,那就软件来。正经的启动流程在 main() 之前都得干两件事:把 .data 段从 Flash 拷到 RAM,把 .bss 段清零。你写的'未初始化全局变量默认是 0',其实是启动代码清零的结果,不是物理 RAM 天生就是 0。栈上的局部变量也一样,不赋值就可能是任何值。

车规芯片还要多一层:带 ECC 的 RAM,校验位同样随机,不初始化就去读可能直接触发 ECC 错误。所以安全启动流程通常要做 RAM 预写初始化和 RAM 自检(比如 March C),把潜在故障提前暴露。有些 MCU 干脆做硬件 RAM 初始化,上电自动清零,就是治这个'随机值'。
收个尾
以后再遇到'上电读 RAM 全是乱码',先别急着怀疑芯片。那是它本来该有的样子,问题只在于:你初始化了没有。
如您对我们的产品感兴趣,欢迎联系
我们将为您提供高效、贴心的解决方案!
咨询电话:135 1009 9916(微信同号)
想深入了解碳化硅功率器件产品知识?点击→「碳化硅(SiC)课堂」获取详情!







