第三章 STOP模式详解:进入与退出流程

STOP模式,说白了就是让芯片“打个盹”。

它不像STANDBY那样几乎完全断电,也不像RUN模式那样全速运转。STOP模式保留了RAM和大部分寄存器内容,同时关闭了核心时钟。我习惯把它比作“浅睡眠”——随时可以叫醒,醒来后继续干活。

3.1 STOP模式的进入流程

进入STOP模式,其实就三步。但每一步都有坑,我一个个说。

  1. 配置唤醒源:先想好谁叫醒你。是RTC闹钟?还是CAN报文?还是外部引脚?
  2. 设置STOP模式控制寄存器:主要是PMC和SCG相关的位。我记得第一次做S32K3项目时,忘了配置PMC的稳压器模式,结果进入STOP后电流根本没降下来。
  3. 执行WFI或WFE指令:这是最后一步。执行后,内核停止取指,时钟树被裁剪。

核心代码示例:进入STOP模式

/* 1. 配置唤醒源:这里用RTC闹钟 */
RTC->TSR = 0x00000001;  /* 设置闹钟值 */
RTC->CR |= RTC_CR_TSIE_MASK; /* 使能闹钟中断 */

/* 2. 设置PMC进入STOP模式 */
PMC->REGSC |= PMC_REGSC_STOP_MODE_MASK;

/* 3. 执行WFI指令 */
__WFI();  /* 这里就睡着了 */

你可能会问:为什么先配唤醒源,再进STOP?

嗯,这其实是个顺序问题。如果你先睡了,再配闹钟,那闹钟可能根本叫不醒你。我在项目中遇到过这种情况——调试了整整一天,最后发现是唤醒源配置在WFI之后执行了。

3.2 STOP模式的退出流程

退出STOP模式,比进入要复杂一点。

当唤醒事件发生时,芯片会经历以下过程:

  • 唤醒事件触发:比如RTC中断来了,或者CAN报文唤醒了。
  • 时钟恢复:内部振荡器重新启动,PLL重新锁定。这个过程需要时间。
  • 中断服务程序执行:如果唤醒源配置为中断模式,CPU会跳转到对应的ISR。
  • 继续执行WFI后的指令:ISR执行完后,程序从WFI的下一条指令继续跑。

个人经验:退出STOP后,我建议先检查一下唤醒源标志位。有时候多个唤醒源同时触发,你得知道是谁先叫醒的。我习惯在ISR里清掉所有标志位,避免重复唤醒。

3.3 STOP模式下的外设状态

进入STOP模式后,不是所有外设都睡觉。有些外设可以继续工作,有些必须关掉。我整理了一张表,方便你查阅:

外设模块 STOP模式下状态 备注
CPU内核 停止 时钟关闭,但寄存器保留
RAM 保持 数据不丢失
RTC 可运行 需要独立时钟源
LPTMR 可运行 常用作周期性唤醒
CAN (FlexCAN) 可运行 支持报文唤醒
UART 可运行 支持起始位唤醒
ADC 停止 需要重新初始化
PWM (FTM) 停止 输出保持最后状态
DMA 停止 传输暂停

这里有个关键点:RTC和LPTMR在STOP模式下能跑,是因为它们有独立的低速时钟源。说白了,它们不需要主时钟就能工作。我建议你优先用LPTMR做周期性唤醒,因为它功耗更低。

3.4 唤醒延迟分析

唤醒延迟,是STOP模式设计中最容易忽略的问题。

你想想看,芯片从睡到醒,不是瞬间完成的。时钟要重新起振,PLL要重新锁定,内部稳压器要恢复电压。这个过程需要时间。

我根据实际测试数据,整理了一个典型延迟表:

唤醒源 典型延迟 影响因素
外部引脚中断 5-10 µs 引脚滤波时间
LPTMR 10-20 µs 时钟源频率
RTC闹钟 15-25 µs 内部振荡器启动时间
CAN报文 30-50 µs CAN协议解析时间

避坑指南:我曾经在一个项目中,用CAN报文唤醒做实时响应。结果发现从收到报文到CPU真正开始处理,已经过去了40多微秒。这个延迟在低速应用里无所谓,但在高速控制场景下,直接导致系统响应超时。

我的建议是:如果对唤醒时间敏感,优先用外部引脚中断。它延迟最小,也最可控。

还有一个细节:唤醒延迟不是固定的。它受温度、电压、时钟源类型影响。比如低温下,内部振荡器启动会更慢。我建议你在产品设计阶段,留出20%的余量。

3.5 实战中的注意事项

最后,我总结几个实战中容易踩的坑:

  • 唤醒源配置后要确认:我习惯在进入STOP前,读一下唤醒源的状态寄存器,确保配置生效了。
  • 中断优先级要合理:如果多个唤醒源同时触发,优先级高的先响应。别让低优先级的唤醒源把高优先级的给堵了。
  • 时钟切换要平滑:退出STOP后,时钟源可能变了。比如从FIRC切到了SIRC,你得确保外设能适应新的时钟频率。
  • 别忘了清唤醒标志:不清标志的话,下次进STOP可能立刻被唤醒。我见过有人因为这个原因,芯片一直无法进入低功耗模式。

嗯,STOP模式的内容就这些。说白了,它是个“性价比”很高的低功耗模式——功耗降得明显,唤醒也快。只要把唤醒源和延迟控制好,大部分应用场景都能用。