2. R系列MCU电源域划分:VDD、VDD_IO、VDD_RTC、VDD_SYS等电源域详解

做低功耗设计,第一件事是什么?

我个人习惯,先看电源域。说白了,你得搞清楚芯片上哪些地方在用电,它们之间是什么关系。全志R系列MCU的电源域划分,其实挺清晰的。我刚开始接触时也觉得有点复杂,但摸清门道后,你会发现这恰恰是低功耗设计的核心抓手。

2.1 为什么要有电源域?

你想想看,一个MCU内部有CPU核心、有IO接口、有RTC模块、还有各种外设。它们对电压的要求不一样,工作模式也不一样。如果所有模块都挂在同一根电源线上,那你想关掉某个模块就难了。

电源域,就是把芯片内部功能模块按电源需求分组。每组可以独立供电、独立控制。这样,你可以在休眠时只给RTC供电,把其他部分全切掉。嗯,这就是低功耗的精髓。

核心思想: 电源域划分 = 精细化的功耗管理。每个域都可以独立开关,互不干扰。

2.2 四大电源域详解

全志R系列MCU主要分为四个电源域。我一个个说,你对照着芯片手册看会更清楚。

2.2.1 VDD — 核心逻辑电源域

VDD是芯片的主电源,给CPU核心、内部总线、SRAM等数字逻辑供电。这个域的电压通常是1.1V或1.2V,具体看型号。

我在项目中遇到过一个问题:有次板子跑着跑着突然复位,查了半天发现是VDD纹波太大。后来加了颗10uF的陶瓷电容才搞定。所以,VDD的电源质量一定要保证,纹波控制在50mV以内比较稳妥。

  • 供电对象: CPU核心、Cache、内部总线、SRAM
  • 典型电压: 1.1V ~ 1.2V
  • 功耗特点: 动态功耗最大,频率越高功耗越大
  • 低功耗策略: 进入休眠时完全关断,或降频降压

注意: VDD域关断后,CPU和SRAM中的数据会丢失。如果需要保留数据,必须使用VDD_RTC域供电的备份SRAM。

2.2.2 VDD_IO — IO接口电源域

VDD_IO给GPIO、UART、SPI、I2C等外设接口供电。这个域的电压范围比较宽,通常是1.8V、2.5V或3.3V,取决于你外接设备的电平。

我曾经踩过一个坑:把VDD_IO设成1.8V,但外接的传感器是3.3V电平,结果通信死活不通。后来加了电平转换芯片才解决。所以,VDD_IO的电压一定要和外设匹配。

  • 供电对象: GPIO、UART、SPI、I2C、PWM等接口
  • 典型电压: 1.8V / 2.5V / 3.3V(可配置)
  • 功耗特点: 静态功耗较低,但驱动电流大时功耗上升
  • 低功耗策略: 休眠时可将IO置为高阻态,或关断VDD_IO域

小技巧: 如果外设不需要保持状态,休眠时直接关断VDD_IO域,可以省下不少功耗。但要注意,关断后IO引脚电平会变成高阻,外部电路可能受影响。

2.2.3 VDD_RTC — 实时时钟电源域

VDD_RTC是专门给RTC模块、备份寄存器、部分唤醒逻辑供电的。这个域最大的特点就是——永远在线。即使主电源断了,只要VDD_RTC还有电,RTC就能继续走时,闹钟也能按时唤醒芯片。

我记得有个项目做智能门锁,电池供电,要求待机一年。核心就是靠VDD_RTC域。主芯片休眠时VDD和VDD_IO全关,只留VDD_RTC供电,功耗降到了几个微安。嗯,这才是低功耗设计的正确姿势。

  • 供电对象: RTC模块、备份寄存器、唤醒逻辑
  • 典型电压: 1.8V 或 3.3V(取决于芯片)
  • 功耗特点: 极低,通常几个微安到几十微安
  • 低功耗策略: 永远不断电,使用纽扣电池或超级电容供电

关键点: VDD_RTC域是低功耗设计的「生命线」。只要它还在,芯片就能被唤醒。所以,这个域的电源设计要格外用心,滤波电容不能省。

2.2.4 VDD_SYS — 系统电源域

VDD_SYS是个比较特殊的域。它给PLL、振荡器、内部LDO等模拟电路供电。这些电路对电源噪声很敏感,所以VDD_SYS通常需要独立的LDO供电,或者加磁珠隔离。

你可能会问:为什么不能和VDD共用?因为PLL和振荡器对纹波要求极高,VDD上的数字噪声会干扰它们。我见过一个案例,VDD_SYS和VDD没隔离,结果PLL输出抖动太大,USB通信直接挂掉。

  • 供电对象: PLL、振荡器、内部LDO、模拟比较器
  • 典型电压: 1.1V ~ 1.2V(与VDD相同或略高)
  • 功耗特点: 静态功耗为主,动态功耗较小
  • 低功耗策略: 休眠时关断PLL和振荡器,VDD_SYS可降至最低

警告: VDD_SYS域的电源质量直接影响系统稳定性。建议使用独立的LDO供电,并在靠近芯片引脚处放置0.1uF + 1uF的滤波电容。

2.3 电源域之间的依赖关系

这四个域不是完全独立的。它们之间有上电顺序和电压匹配的要求。我整理了一张表,你设计电源时可以参考。

电源域 依赖关系 上电顺序 注意事项
VDD_RTC 无依赖 最先上电 必须最先稳定,否则RTC数据可能丢失
VDD_SYS 依赖VDD_RTC 第二 VDD_RTC稳定后才能上电
VDD 依赖VDD_SYS 第三 VDD_SYS稳定后才能上电
VDD_IO 依赖VDD 最后 VDD稳定后才能上电,否则IO可能误触发

这个顺序很重要。我曾经在项目里偷懒,把VDD和VDD_IO用同一个LDO供电,结果每次上电IO都会有个毛刺,把外设搞死。后来老老实实按顺序来,问题就解决了。

2.4 低功耗设计中的电源域管理

了解了电源域,怎么用它们做低功耗?我分享几个实战经验。

2.4.1 休眠模式下的电源域配置

进入深度休眠时,我的做法是:

  1. 关断VDD域(CPU和SRAM断电)
  2. 关断VDD_IO域(IO口置高阻)
  3. 保留VDD_RTC域(RTC继续走时)
  4. VDD_SYS域降至最低(关PLL,保留振荡器)

这样配置下来,整机功耗可以降到10uA以下。嗯,具体数值要看芯片型号和外设情况。

2.4.2 唤醒时的电源域恢复

唤醒时,要按照上电顺序反向恢复:先VDD_SYS,再VDD,最后VDD_IO。每个域之间留个几百微秒的延时,让电源稳定。

经验之谈: 我习惯在唤醒代码里加个延时循环,比如:

// 唤醒后恢复电源域
power_on(VDD_SYS);      // 开启系统电源
delay_us(500);          // 等待稳定
power_on(VDD);          // 开启核心电源
delay_us(500);          // 等待稳定
power_on(VDD_IO);       // 开启IO电源
delay_us(200);          // 等待IO稳定
// 然后才初始化外设

这个延时不能省,否则芯片可能启动异常。

2.5 总结一下

电源域划分,说白了就是把芯片的「用电地图」画清楚。VDD管核心、VDD_IO管接口、VDD_RTC管时钟、VDD_SYS管模拟。每个域都有自己的脾气,摸透了它们,低功耗设计就成功了一半。

下一章,我会讲如何根据这些电源域设计实际的电源电路,包括LDO选型、电容配置、PCB布局等。到时候再聊。