查看: 2813|回复: 1

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

[复制链接]
  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3875

    主题

    7479

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    39287
    最后登录
    2025-7-22
    发表于 2021-9-23 09:39:37 | 显示全部楼层 |阅读模式
    i.MX RT超低功耗模式捉虫记
    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.如果没有从低电平拉到高电平的状态,一直都是在高电平或者较高电压的状态,则需要考虑系统电源存在漏电情况。

    对于漏电的这种情况我们需要避免,在数据手册上有所描述:
    13.png
    举个栗子,啊不,例子。例如我们某个GPIO使用了上拉电阻到3.3V,当系统进入SNVS模式后,外部上拉电阻的电源没有关闭,此时将会产生leakage(漏电)。因此在做系统整体电源设计的时候,需要考虑到这一点。

    qiandao qiandao
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-5-15 09:29
  • 签到天数: 178 天

    连续签到: 1 天

    [LV.7]常住居民III

    11

    主题

    423

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    1392
    最后登录
    2025-5-15
    发表于 2021-9-24 08:59:07 | 显示全部楼层
    赞赞赞赞。。。。
    加油加油
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-22 15:24 , Processed in 0.084254 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表