在前几篇中,我们千方百计地让 CPU 睡觉(Tickless)、让它睡得死(Standby)、让它起得快(HSI)。但问题来了:活儿谁干?
如果传感器每毫秒都在吐数据,串口时刻都有可能来指令,CPU 是不是就得不停地被叫醒?
这就是低功耗设计的“终极悖论”。解决它的钥匙,在于打破“CPU 中心论”,把权力下放给外设。这一篇,我们看看 STM32G0 和 RL78/G23 是如何构建“自动化流水线”,实现 Zero CPU Intervention(零 CPU 干预) 的。
一、 核心理念:让外设通过“私聊”解决问题
在传统的单片机编程思维里,CPU 是绝对的控制中心:
Timer 溢出 -> 中断叫醒 CPU -> CPU 启动 ADC -> CPU 等待 -> ADC 完成 -> 中断叫醒 CPU -> CPU 搬运数据 -> CPU 判断阈值。
这一套流程下来,CPU 就像个保姆,事必躬亲。而在低功耗设计中,我们要追求的是:
Timer 溢出 -> (硬件信号) -> ADC 启动 -> (硬件信号) -> DMA 搬运 -> (硬件比较) -> 只有异常才叫醒 CPU。
外设之间建立了直接的连接通道,这就是 Event Link (事件链)。
二、 STM32G0 的重武器:DMAMUX 与 Analog Watchdog
STM32G0 在这方面继承了 Arm 生态的强大算力和灵活性,它的打法是**“批量处理”**。
1. DMAMUX (DMA请求复用器):任意互联
在老款 STM32 (如 F1) 上,ADC1 的 DMA 请求只能连到 DMA1_Channel1,这是写死的。如果你想同时用 SPI1 和 ADC1,可能会冲突。
STM32G0 引入了 DMAMUX。
-
原理: 它就像一个巨大的电话交换机。它允许任何外设的触发信号,连接到任何 DMA 通道。
-
低功耗应用:
-
配合 LPUART (低功耗串口)。在 Stop 模式下,LPUART 接收到数据唤醒时钟,通过 DMAMUX 触发 DMA 将数据搬入 SRAM。
-
关键点: 这个过程 CPU 不需要醒来处理每个字节中断,而是等收满了 100 个字节,DMA 才会发一个中断说“活干完了,老板请过目”。
-
2. Analog Watchdog (模拟看门狗)
这是 STM32 对抗 RL78 Snooze 模式的核心武器。
-
场景: 监测电池电压,低于 3.0V 报警。
-
做法: 配置 ADC 的 AWD (Analog Watchdog) 寄存器。
-
效果: DMA 默默地把 ADC 数据搬到内存(用于事后分析),而 AWD 默默地在硬件层面比较电压值。只有电压跌破 3.0V 瞬间,AWD 才会产生中断唤醒 CPU。
-
功耗节省: 省去了 CPU 每次都要醒来做
if (adc_val < 3.0)的判断逻辑。
三、 RL78/G23 的杀手锏:ELC 与 DTC 的微操艺术
如果说 STM32 是开着卡车(DMA)拉货,那么 RL78 就是雇了一群蚂蚁(DTC)在搬家。RL78 的设计哲学是**“极致的细碎管理”**。
1. ELC (Event Link Controller):硬件多米诺骨牌
RL78 拥有一个专门的硬件模块叫 ELC。它允许将一个外设的输出事件(Event),直接连到另一个外设的输入。
-
经典连招:
-
Timer 溢出事件 ---> 触发 ADC 转换。
-
ADC 转换结束事件 ---> 触发 Timer 捕获。
-
Button 外部中断事件 ---> 触发 Timer 启动。
-
-
优势: 这完全是组合逻辑电路在干活,没有时钟延迟,不需要 CPU 执行任何指令,甚至不需要总线仲裁。
2. DTC (Data Transfer Controller):比 DMA 更懂“省电”
这是 Renesas 相比于 ARM 架构的一个显著区别。RL78 既有 DMA,又有 DTC。但低功耗首选 DTC。
-
DMA vs DTC:
-
DMA: 适合搬运“大数据块”(比如 LCD 刷屏,SPI Flash 读取)。需要在总线上霸占控制权。
-
DTC: 适合搬运“离散小数据”(比如 ADC 的 2 个字节,串口的 1 个字节)。
-
-
工作流:
-
DTC 的控制块(描述源、目的、长度)放在 RAM 里,不占寄存器。
-
事件触发 DTC。
-
DTC 像个“影子 CPU”一样,耗费 2-3 个时钟周期,偷一个指令周期,把 1 个字节搬完。
-
关键: 它可以配置为 "Chain Transfer" (链式传输)。比如:ADC 完成 -> DTC 搬数据 -> DTC 再去写一个 GPIO 寄存器翻转 LED。
-
这实际上实现了一种**“无 CPU 的简易编程”**。
-
四、 巅峰对决:Snooze 模式下的 ADC 采样
为了讲清楚原理,我们对比同一个场景:“每秒采集一次温度,超过 50℃ 唤醒报警,否则丢弃数据继续睡”。
选手 A:STM32G0 (Stop Mode 1 + LPTIM + ADC)
-
LPTIM 计时到了。
-
LPTIM 触发 ADC 启动 (通过 Event System)。
-
ADC 转换完成。
-
Analog Watchdog (AWD) 检查数据。
-
情况 1 (正常): AWD 没反应。但 STM32G0 在 Stop 模式下 ADC 动作通常需要 HSI 时钟,这意味着 ADC 采样期间,系统时钟必须是开启的(虽然 CPU 可能还在 WFI)。
-
情况 2 (异常): AWD 触发中断,CPU 醒来。
-
-
软肋: STM32 在 Stop 模式下的外设联动能力受限,往往需要退回到 Sleep 模式(高功耗)或者使用更复杂的 U5 系列(LPBAM)才能完美实现。
选手 B:RL78/G23 (Stop Mode + Snooze)
-
Interval Timer 计时到了。
-
触发 Snooze Mode:CPU 保持睡眠(Deep Sleep),只唤醒 ADC 模块和时钟。
-
ELC 触发 ADC 转换。
-
硬件窗口比较器 检查数据。
-
情况 1 (正常): 比较通过。ADC 关机,系统自动回到全 Stop 模式。全程 CPU 无感,且没有产生任何中断,不执行任何软件代码。
-
情况 2 (异常): 比较失败。生成中断,唤醒 CPU。
-
-
胜出: 在这种“低频监控”应用中,RL78 的 Snooze 机制是无敌的。它不仅省了搬运数据的功耗,连唤醒时钟树的开销都省到了极致。
五、 实战建议与避坑
1. 什么时候用 STM32G0 的 DMA?
当你需要高吞吐量时。
例如:通过 SPI 采集 MEMS 麦克风的音频数据(16kHz 采样率),先存满 1KB 的 Buffer 再唤醒 CPU 进行 DSP 处理。
-
配置要点: 必须使用
__WFI()进入 Sleep 模式,而不是 Stop 模式(因为 G0 的 DMA 在 Stop 下通常不工作,除非特定的 LPUART/LPTIM 唤醒机制)。
2. 什么时候用 RL78 的 ELC+DTC?
当你需要低延迟逻辑控制或极低功耗监控时。
例如:做一个烟雾报警器、燃气表、水表。
-
配置要点: 利用 Code Generator (e2 studio) 的图形化界面配置 ELC,因为 ELC 的寄存器映射非常复杂,手写容易错。
3. “幽灵数据”的陷阱
使用 DMA/DTC 最大的坑在于数据一致性 (Coherency)。
-
现象: CPU 醒来读 Buffer,发现数据还是旧的?
-
原因: CPU 的 Cache(虽然 M0+ Cache 很少,但在高级系列常见)或者总线仲裁延迟。
-
解决:
-
STM32:使用
volatile关键字修饰 DMA 缓冲区;在读取前检查 DMA 的 Transfer Complete 标志位。 -
RL78:DTC 搬运是原子的,但要确保 CPU 不要和 DTC 同时访问同一个 RAM 地址。
-
六、 总结
| 特性 | STM32G0 | RL78/G23 |
| 互联核心 | DMAMUX (矩阵式) | ELC (点对点事件链) |
| 数据搬运 | DMA (适合大数据块) | DTC (适合离散小数据) |
| 阈值监控 | Analog Watchdog | 硬件窗口比较器 + Snooze |
| CPU 睡眠状态 | DMA 运行时通常需在 Sleep (浅睡) | Snooze 模式下 CPU 可在 Stop (深睡) |
| 适用场景 | 通信网关、数据采集卡 | 电池供电仪表、传感器节点 |
3592

被折叠的 条评论
为什么被折叠?



