3、备用电源域(VEXT)详解:备用供电原理、RTC与唤醒逻辑供电、SRAM保持供电
好,咱们接着聊。前面讲了主电源域和待机电源域,这一节我重点说说备用电源域——也就是 VEXT。说实话,这个域在项目里最容易被人忽略,但一旦出问题,往往是最头疼的。
VEXT 是 TC3xx 里一个独立的电源域。它专门给那些需要在主电源掉电后依然工作的模块供电。说白了,就是给芯片留了一颗「救命电池」。
3.1 备用供电原理
VEXT 的供电来源很灵活。你可以用一颗纽扣电池,也可以用一个大电容,甚至直接接一个独立的 3.3V 电源。我个人习惯用 CR2032 纽扣电池,便宜又好买。
它的工作原理其实不复杂。当主电源 VDD 和 VDDIO 都掉电后,VEXT 会接管给备用域供电的任务。芯片内部有一个电源切换电路,它会自动选择电压更高的那一路。嗯,这里要注意:VEXT 的电压范围是 2.7V 到 5.5V,别超了。
关键点:VEXT 域包含的模块有:
- RTC(实时时钟)
- 唤醒逻辑(Wake-up Logic)
- 备用 SRAM(通常 8KB 或 16KB)
- 部分 I/O 引脚(用于唤醒检测)
我在项目中遇到过一个问题:客户说他们的设备断电后 RTC 时间总是复位。查了半天,发现是 VEXT 引脚上没接任何电源,悬空了。你想想看,备用域没电,RTC 怎么可能保持时间?
3.2 RTC 与唤醒逻辑供电
RTC 是备用域里最核心的模块。它需要一个 32.768kHz 的晶振,这个频率是专门为低功耗设计的。RTC 本身功耗极低,我记得 TC3xx 的 RTC 在备用模式下电流只有几个微安。
唤醒逻辑呢?它负责检测外部事件,比如一个 GPIO 的上升沿或者下降沿。当检测到有效事件后,它会向 PMU(电源管理单元)发送一个唤醒信号,让芯片从备用模式恢复到正常工作模式。
我的经验:唤醒逻辑的输入引脚一定要做去抖处理。我曾经遇到过因为按键抖动导致芯片反复唤醒、电池很快耗尽的案例。后来在软件里加了 50ms 的去抖延时,问题就解决了。
RTC 和唤醒逻辑的供电路径是这样的:
VEXT → 内部稳压器 → RTC 核心 + 唤醒逻辑
这个内部稳压器会把 VEXT 的电压降到 1.2V 左右,给数字逻辑用。所以即使 VEXT 接的是 3.3V 电池,内部电路也是工作在低电压下的,功耗自然就低了。
3.3 SRAM 保持供电
备用 SRAM 是另一个重要的模块。它通常有 8KB 或 16KB,具体看型号。这个 SRAM 在备用模式下可以保持数据不丢失。我一般用它来存储一些关键的系统参数,比如校准值、序列号、运行日志等。
SRAM 保持供电的原理很简单:只要 VEXT 有电,SRAM 的存储单元就会一直保持状态。它的功耗比 RTC 大一些,但也在微安级别。
注意:备用 SRAM 的保持电流会随着温度升高而增加。在 85°C 环境下,电流可能比 25°C 时大 3-5 倍。设计电池容量时一定要留足余量。
我建议你在系统初始化时,把需要保持的数据写入备用 SRAM,然后定期校验一下。为什么?因为 SRAM 虽然能保持数据,但长时间不刷新的话,可能会因为漏电流导致数据翻转。尤其是高温环境下,这个风险更大。
下面是一个简单的备用 SRAM 读写示例:
/* 备用 SRAM 基地址,具体值参考芯片手册 */
#define BACKUP_SRAM_BASE 0xF0030000
/* 写入数据 */
void backup_sram_write(uint32_t offset, uint32_t data) {
volatile uint32_t *addr = (uint32_t *)(BACKUP_SRAM_BASE + offset);
*addr = data;
}
/* 读取数据 */
uint32_t backup_sram_read(uint32_t offset) {
volatile uint32_t *addr = (uint32_t *)(BACKUP_SRAM_BASE + offset);
return *addr;
}
/* 校验数据,建议每次唤醒后执行 */
uint8_t backup_sram_verify(uint32_t offset, uint32_t expected) {
uint32_t actual = backup_sram_read(offset);
return (actual == expected) ? 1 : 0;
}
这段代码很简单,但很实用。我在好几个项目里都用过类似的逻辑。记住一点:备用 SRAM 在芯片复位后内容不会丢失,但如果你重新上电 VEXT,那数据就没了。所以电池不能随便拔。
3.4 实际应用中的注意事项
最后,我总结几个实际项目中容易踩的坑:
- VEXT 引脚滤波:一定要加一个 100nF 的陶瓷电容,靠近引脚放置。电池供电时纹波可能比较大,不加电容会导致 RTC 走时不准。
- 电池寿命估算:以 CR2032 为例,容量约 220mAh。如果备用域总电流为 5μA,理论寿命是 220mAh / 0.005mA = 44000 小时,约 5 年。但实际要打折,因为电池自放电和温度影响。
- 唤醒源配置:不要把所有 GPIO 都配成唤醒源。我见过有人把 16 个引脚都配了,结果任何一个引脚的电平变化都会唤醒芯片,电池两天就耗光了。
- 备用 SRAM 初始化:第一次上电时,备用 SRAM 的内容是随机的。一定要用一个标志位来区分是首次上电还是唤醒。我习惯在 SRAM 的第一个字写入一个固定魔数,比如 0xA5A5A5A5。
避坑指南:我曾经在一个车载项目里,因为 VEXT 引脚上没加 ESD 保护器件,导致在 EMC 测试时芯片频繁复位。后来加了一个 TVS 管,问题就解决了。VEXT 是暴露在外的引脚,一定要做好防护。
好了,关于 VEXT 备用电源域,我就讲这么多。记住一句话:备用域是系统的最后一道防线,设计好了能省很多麻烦。下一节我们聊聊如何进入和退出低功耗模式,那才是真正考验功力的时候。