NXP MCU Lowpower mode

NXP MCU Lowpower mode

六月 01, 2018

近来在研究NXP系列芯片的低功耗问题,走了许多弯路,这里做些一些总结

KL系列一共有10种工作模式。

  1. Normal Run:单片机正常运行模式,支持CPO时钟选项。
  2. VLPR(Very Low Power Run):MCU的最大工作频率相纸为4MHZ内核和1MHZ总线/闪存时钟,支持CPO时钟选项,LVD保护模式关闭,Flash编程禁止。
  3. Wait:这个模式,内核已经进入休眠,各个模块的时钟仍然在工作,NVIC仍然工作,允许外设功能
  4. VLPW(Very Low Power Wait): 内核进入深度休眠,NVIC关掉,NVIC将用来唤醒单片机,外设时钟停止。单片机工作在低频
  5. Stop:内核深度休眠状态,NVIC关掉,AWIC将用来唤醒单片机,外设时钟停止,LVD保护开启,节能外设操作在异步的DMA特性下,可唤醒DMA执行传输,当传输完成之后返回当前模式AWIC检测CPU的唤醒源,低功耗的PLL保持激活。
  6. VLPS(Very Low Power Stop):内核已经进入深度休眠。NVIC关掉,AWIC将用来唤醒单片机,外设时钟停止,单片机工作在低频,LVD保护关闭,节能外设操作具有ADMA特性
  7. LLS(Low Leakage Stop):内核进入深度休眠状态,NVIC禁止,外设时钟停止但现有状态保持,只是不能操作。SRAM工作,GPIO状态保持。LLWU检测CPU唤醒源,包括LPTMR, RTC, TSI, CMP, 以及选择引脚中断。快速唤醒时间<5us
  8. VLLS3(Very Low Leakage Stop3):内核进入深度休眠状态,NVIC禁止,外设时钟停止,SRAM工作,GPIO状态保持。大部分内部逻辑下电。所有系统的RAM 内容保持,I/O状态保持。LLWU控制CPU的唤醒源,和LLS模式类似
  9. VLLS1(Very Low Leakage Stop1):内核深度休眠,NVIC禁止,LLWU被用于唤醒,外设时钟停止,SRAM不保持,GPIO状态保持。
  10. VLLS0(Very Low Leakage Stop0):内核深度休眠,NVIC禁止,LLWU被用于唤醒,外设时钟停止,SRAM不保持,GPIO状态保持,LPO禁止。

下面以图片的方式展示一下不同的功耗模式下的系统的工作状态











1. 低功耗模式的进入流程

  1. SMC_PMPROT必须设置成需要允许进入的模式 (只写一次)
  2. 时钟监控必须被关闭,在进入任何的低功耗模式时,除了WAIT模式
  3. 在进入低功耗模式时,唤醒源必须使能。针对VLPS的中断以及针对LLS模式的
    LLWU唤醒。
  4. 在寄存器SMC_PMCTRLSMC_STOPCTRL中选择既定的低功耗模式
  5. 置位/清零ARM SLEEPDEEP位,用于STOP/WAIT
  6. 在执行WFI指令前,读取上次写入的SMC寄存器的状态
  7. 执行ARM WFI指令
  8. 如果需要进入VLPR ,需要如下操作:
    • 在 BLPI 模式 (使用快速的 IRC) 或者 BLPE 时钟模式
    • 设置内核时钟频率为4MHz或者更小。Flash时钟频率为1MHz或者更小。
    • 关闭时钟监视功能
    • SMC_PMCTRLRUNM

2. 低功耗模式的退出流程(唤醒)

  1. 所有的功耗模式都在相同的时钟模式下退出,除了如下情况
    • PEE退出时在PBE, 再切回到PEE模式时候,需要等待LOCK位被置位。需要长
      时间等待,代码才可全速执行
    • VLLSx, 退出时经过复位流程默认的时钟是FEI模式
  2. 退出 VLPR
    • SMC中软件写RUNM
    • 在时钟模式或频率上没有改变
  3. 退出WAIT/STOP/VLPS
    • 通过中断
    • 在退出中断ISR后,代码重新从低功耗模式进入的地方开始执行
  4. 退出LLS流程
    • 通过低泄漏唤醒事件 (LLWU)
    • 在唤醒后,LLWU中断优先执行
    • LLWU中断服务程序中,内部的模块标志必须被清除
      • NVIC中的模块中断在LLWU中断服务程序中被清除,防止模块的ISR被执行
    • 如果引脚作为唤醒源,同时使能作为中断源, 引脚中断不会被挂起,不需要在LLWU中断服务程序中被清除。
    • 需要最小化进入中断服务程序的中断个数,因此在一个中断服务程序中处理多个中断源是可能的。
    • 在退出中断ISR后,代码重新从低功耗模式进入的地方开始执行。
  5. 退出VLLSx
    • VLLSx 的恢复经过了复位流程
    • 在退出任何的VLLSx模式后,IO保持为栓锁,直到PMC中的ACKISO位被写入1之后释放。
    • 在写ACKISO位之前,GPIO必须重新配置。
    • 如果对于任何的外部IO没有要求,在重新进入VLLSx之前不需要重新配置。
    • 如果时钟振荡器在VLLS1或者VLLS3模式下保持运行,在写ACKISO位之前需要重新配置(除非它被配置为RTC时钟)
    • LLWU中断被挂起.
    • 如果是通过模块唤醒,相关模块的中断也将会被挂起
    • 在复位流程中,中断是首先被使能的
    • 如果LLWU中断首先使能,LLWU ISR中需要清除模块中断标志位
    • 如果模块中断首先使能,模块的ISR服务程序将清除中断标志,LLWU ISR将不再被挂起
    • 引脚唤醒标志需要在LLWU中断服务程序中清除
    • VLLS 唤醒在RCM中有记录
    • 如果有允许多个模式的情况下,初始化代码需要判断是哪个VLLSx模式退出。
    • 需要检查RAM的内容是否需要重新初始化。

LLWU的唤醒源列表图

不同低功耗模式之间的转化图