第三章 STOP模式详解:进入与退出流程
STOP模式,说白了就是让芯片“打个盹”。
它不像STANDBY那样几乎完全断电,也不像RUN模式那样全速运转。STOP模式保留了RAM和大部分寄存器内容,同时关闭了核心时钟。我习惯把它比作“浅睡眠”——随时可以叫醒,醒来后继续干活。
3.1 STOP模式的进入流程
进入STOP模式,其实就三步。但每一步都有坑,我一个个说。
- 配置唤醒源:先想好谁叫醒你。是RTC闹钟?还是CAN报文?还是外部引脚?
- 设置STOP模式控制寄存器:主要是PMC和SCG相关的位。我记得第一次做S32K3项目时,忘了配置PMC的稳压器模式,结果进入STOP后电流根本没降下来。
- 执行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模式的内容就这些。说白了,它是个“性价比”很高的低功耗模式——功耗降得明显,唤醒也快。只要把唤醒源和延迟控制好,大部分应用场景都能用。