i.MX RT超低功耗模式捉虫记

cathy的头像
cathy 发布于:周四, 09/23/2021 - 13:40 ,关键词:

SNVS模式是i.MX RT10XX和i.MX RT11XX系列MCU中功耗最低的状态,其标志性特点是除SNVS电源域保持供电,其余的电源域均处于断电状态。与此同时,SNVS的电流通常是uA这个数量级,对于i.MX RT10XX系列,通常是20uA左右,对于i.MX RT11XX系列,电流通常是10uA以下。正因为如此,SNVS模式在电池应用或者功耗敏感的应用场景得到了较为广泛的应用。

本文将会根据笔者支持客户时遇到的问题进行总结,涉及SNVS模式的进入,唤醒以及电流泄露(currents leakage)。

1、无法进入SNVS状态

通常进入SNVS模式有以下两种方法:

  • 长按ONOFF button 5秒以上

  • 在SNVS的LPCR寄存器位6写1

使用以上两种方法,芯片将会触发进入SNVS模式的状态机(纯硬件),在正常情况下会将PMIC_ON_REQ引脚的电平从高电平变为低电平,进而关闭除SNVS电源域以外部分的供电。

当使用上面两种方法无法使PMIC_ON_REQ引脚变为低电平时,则说明系统存在异常,进入SNVS模式的状态机流程被打断强制退出了。

A)未处理的中断

未处理的中断会影响系统进入SNVS模式。

其具体的案例是,用户使用RTC作为SNVS模式下的唤醒源,进行定时唤醒,在第一次运行时可以顺利的进入SNVS模式,接着RTC定时时间到,系统唤醒,再次使用写LPCR寄存器的方法让系统进入SNVS模式。

在此时我们就需要查看NVIC寄存器,看看是否有一些中断没有处理,比如说pending寄存器,active寄存器等。

如果发现有相关的中断没有处理,则需要先把中断进行处理后,才能顺利的进入SNVS模式。

在发现有中断没有处理后,应该检查在中断处理函数中,是否没有正确的清除标志位。比如说RTC有HP和LP两部分,定时器用的是LP部分,而用户清除的是HP部分。

B)LPCR寄存器位5

LPCR寄存器位5的作用可以理解为是权限设置,写1的时候允许用户使用软件的方法——在LPCR寄存器位6写1——关闭系统的电源。如果这个位默认是1,实际使用中,有可能因为软件的原因,比如说驱动程序,或者寄存器赋值将其清0,则会导致系统无法通过使用软件的方法让系统进入SNVS模式。

负面典型案例:用户使用RTC时需要使能校准功能,具体的校准数值也存放在LPCR寄存器中,此时查看驱动程序:

base->LPCR= SNVS_LPCR_LPCALB_VAL_MASK & (config->srtcCalValue <<SNVS_LPCR_LPCALB_VAL_SHIFT);

我们将具体的参数代入代码:

base->LPCR= 0x7C00U& (1<<10);

最后写入LPCR寄存器的数值是:0x0400

那么问题来了,位5被清0了,系统无法通过软件的方法进入SNVS模式。这个具体的函数是:

void SNVS_LP_SRTC_Init(SNVS_Type *base, const snvs_lp_srtc_config_t *config)

这行代码设想的功能,是将校准的数值放到指定寄存器位置,但是实际的功能是,将校准数值放到指定的寄存器位置,其余的寄存器清0。

正确的操作方法应该是先将相关的寄存器位清0(与非的方法清0),然后再将校准的数值写入(或的方法写入)即:

base->LPCR&= ~SNVS_LPCR_LPCALB_VAL_MASK;

base->LPCR|=  (config->srtcCalValue <<SNVS_LPCR_LPCALB_VAL_SHIFT);

2、进入SNVS模式后无法唤醒

常见的SNVS模式下的唤醒方法有:

  • 使用RTC定时器唤醒

  • 短按ON/OFF按钮

  • 使用WakeUP引脚

对于前两种方式来说,所有的i.MX RT10XX和i.MX RT11XX芯片都可以实现,但是对于第三种方法,并不是所有的芯片都可以实现。因为有些芯片没有wakeup引脚, 例如RT1010。

对于第一种和第三种方法,首先需要排除的是中断是否配置正常,可以在运行(RUN)模式下触发中断,检查中断是否被触发。

对于第二种方法,短按ON/OFF按钮, 不需要任何配置,在进入SNVS模式后短按即可唤醒芯片。

当系统顺利进入SNVS模式后,使用ON/OFF按钮也无法唤醒时,可以按照下面的步骤进行检查

a、短按ON/OFF后,PMIC_ON_REQ是否拉高

b、PMIC_ON_REQ拉高后,其所控制的DCDC是否输出了预期的输出电压

c、DCDC输出预期电压后,检查VDD_SOC_IN的电压是否输出正常,i.MX RT10XX和i.MX RT11XX系列在默认情况下应该都是1.1V左右。

d、若VDD_SOC_IN电压没有正常输出,需要检测DCDC_PSWITCH引脚在唤醒过程中的状态,是否有从低电平拉高到高电平的过程。

e、如果没有从低电平拉到高电平的状态,一直都是在高电平或者较高电压的状态,则需要考虑系统电源存在漏电情况。

对于漏电的这种情况我们需要避免,在数据手册上有所描述:

“i.MX

举个例子。例如我们某个GPIO使用了上拉电阻到3.3V,当系统进入SNVS模式后,外部上拉电阻的电源没有关闭,此时将会产生leakage(漏电)。因此在做系统整体电源设计的时候,需要考虑到这一点。

来源:恩智浦MCU加油站
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 437