MIMXRT1172 SNVS模式Wakeup唤醒

电子说

1.3w人已加入

描述

FlaSh

FlaSh

FlaSh

    当 I.MXRT1170进入 SNVS模式,所有的电源域除了 SNVS域以外都会关闭,功耗最低达到uA级,这意味着 ROM将会在唤醒后运行。ROM会使用SPI模式读命令,Octal Flash会在 OCR(Octal读)模式。在进入 SNVS模式前复位 Octal Flash芯片,或者将设置 RT1170进入SNVS模式的代码放在RAM中运行,使用 POR引脚作为复位信号复位 Octal Flash,使用BOOT ROM 去复位 Octal Flash。

FlaSh

FlaSh

FlaSh

       WAKEUP引脚默认内部是输入上拉的,大约在 35k左右。

FlaSh

FlaSh

    唤醒引脚是一个 GPIO,由 SNVS 电源域供电配置为唤醒源。唤醒引脚会将 PMIC_ON_REQ为高电平,请求主SOC上电以退出SNVS模式。

FlaSh

    请求主SoC电源状态改变的硬件ON/OFF按钮输入信号。在OFF模式下与GND的短暂连接会导致内部电源管理状态机将状态更改为ON。在ON模式下,与GND短暂连接会产生中断(与GND大约5秒或更长时间)会导致强制OFF。

    唤醒引脚会将 PMIC_ON_REQ 设置为高,而不是翻转。

FlaSh

    此外除了 GPIO唤醒外,也可以通过内部 RTC唤醒,相关参考代码如下。

#include "fsl_device_registers.h"

#include "fsl_debug_console.h"

#include "pin_mux.h"

#include "clock_config.h"

#include "board.h"

#include "fsl_snvs_hp.h"

void GPC_EnableWakeupSource(uint32_t irq)

{

    GPC_CM_EnableIrqWakeup(GPC_CPU_MODE_CTRL_0, irq, true);

}

void gpc_configure_lprtc_wakeup(uint32_t time_length){

  SNVS->LPCR &= ~SNVS_LPCR_SRTC_ENV_MASK;

  while ((SNVS->LPCR & SNVS_LPCR_SRTC_ENV_MASK))

  {  }

  /* 禁止 SRTC 告警中断 */

  SNVS->LPCR &= ~SNVS_LPCR_LPTA_EN_MASK;

  while ((SNVS->LPCR & SNVS_LPCR_LPTA_EN_MASK))

  {  }

  SNVS->LPSRTCMR = 0x00;

  SNVS->LPSRTCLR = 0x00;

  SNVS->LPTAR = time_length;

  EnableIRQ(SNVS_HP_NON_TZ_IRQn);

  SNVS->LPCR |= SNVS_LPCR_SRTC_ENV_MASK | SNVS_LPCR_LPTA_EN_MASK;

  while (!(SNVS->LPCR & SNVS_LPCR_LPTA_EN_MASK))

  {   }       /* 使能 GPC 中断*/

  GPC_EnableWakeupSource(SNVS_HP_NON_TZ_IRQn);

}

void SNVS_HP_NON_TZ_IRQHandler(void)

{

//    if (SNVS_HP_RTC_GetStatusFlags(SNVS) & kSNVS_RTC_AlarmInterruptFlag)

//    {

//        SNVS_HP_RTC_ClearStatusFlags(SNVS, kSNVS_RTC_AlarmInterruptFlag);

//    }

//    

//    SNVS_HP_RTC_GetEnabledInterrupts(SNVS);

    //SNVS->LPSR &= ~(1<<30);

    SNVS->LPSR |= 0x1;

    SDK_ISR_EXIT_BARRIER;

}

int main(void)

{

    char ch;

    BOARD_ConfigMPU();

    BOARD_InitPins();

    BOARD_BootClockRUN();

    BOARD_InitDebugConsole();

    PRINTF("hello world. ");

    GETCHAR();

    gpc_configure_lprtc_wakeup(5);    

    SNVS->LPCR |= SNVS_LPCR_TOP_MASK;

    while(1);

}

    SNVS唤醒源可以是:GPIO唤醒引脚;RTC唤醒;POR。通常,使用SRC->SRSR[ipp_reset_b]来检测POR复位。但测试后,即使使用WAKEUP引脚退出SNVS模式,SRC->SRSR[ipp_reset_b]仍为1,与退出SNVS方式的按键复位相同。那么,在退出SNVS模式后,有其他方法可以检测细节唤醒源吗?主要需要知道从SNVS低功耗模式唤醒,而不仅仅是从电源POR唤醒。

    从SOC的角度来看,POR或SNVS唤醒复位相同。因此,无论POR或使用WAKEUP引脚退出SNVS模式,SRC->SRSR[ipp_reset_b]始终为1。一种可以知道从SNVS或POR唤醒的解决方案是使用SNVS_LP GPR寄存器作为标志。例如:

    1.将1写入LPGPR0;2.SOC进入SNVS低功耗模式;3.当SOC启动时,读取LPGPR0。4.如果LPGPR0=0,则为POR。如果LPGPR0=1,则从SNVS低功耗模式唤醒。

    操作方法如下:通过SNVS LP控制寄存器中的GPR_Z_DIS位禁用GPR归零。使用SNVS->LPCR |= 1<<24;操作代码。如果不执行这个代码,直接写入 LPGPR寄存器是无效的。

FlaSh

FlaSh

FlaSh

    从 SNVS唤醒到 PMIC_ON_REQ输出大约是 0.1ms的时间,如下图所示。对于用户来说,需要考虑PMIC_ON_REQ 到外部电源之间的时间间隔,上电顺序的时间间隔这取决于外部电路,尤其是复位IC。

FlaSh

2) PMIC_ON_REQ 输出使能外部的电源,这个时间间隔取决于外部电路,对于EVK来说大约需要40ms。

FlaSh

    通电后,关于上电顺序的时间间隔大约是SOC复位到第一个MCU指令,大约为8ms。FlaSh

    从唤醒按键释放到处理器 MCU 执行指令大约需要260或270毫秒!这是因为开发板外部复位电路给了非常充裕的时间来释放复位。

1)  外部GPIO输入触发和PMIC_ON_REQ输出

例如,这将使PMIC使能信号上升。从SNVS唤醒引脚输入到PMIC_ON_REQ输出大约需要0.1ms。

2) 电源上电(取决于系统)

   2.1 ) PMIC_ON_REQ 输出以启用外部加电.

    例如,PMIC启用DCDC_3v3。这可能需要一些时间,从6毫秒(测量值)到40毫秒。

  2.2 ) 复位释放

    在EVK中,复位监控IC将等待大量时间来解除MCU复位。例如,260ms。该延迟是确保所有电源域已经达到稳定的最安全裕度。

3) 复位后的MCU引导时间

    这将需要 6~7ms(考虑到在GPIO切换之前一直在测量,测量时间为9ms)。希望在 20毫秒动力CAN或者 100毫秒车身CAN 要求更短的时间内从SNVS中唤醒并执行代码。应该注意电源上电序列!例如,确保调整外部复位电路复位的时间。此外,与其他电源模式相比,SNVS不会占用最大的延迟。MCU 将简单地从复位中恢复!会发现系统可能需要更长的恢复时间,但这是因为外部电源再次通电(包括复位)。

FlaSh

    对于wakeup唤醒电平要求:

FlaSh

    支持低电平,高电平,上升沿,下降沿唤醒。

FlaSh

    当器件从SNVS模式唤醒时,用户可以知道系统从SNVS方式恢复的另外一种方法。试图检查SRC和SRSR,但找不到任何适合此要求的标志。使用SNVS-GPR32,当发生篡改事件时不会清除。还有一个锁定位控制,可以用来阻止位修改,直到重新上电。

FlaSh

    RT1170在内部处理上电序列,LPSR LDO将在开启DCDC之前启用。LPSR_1P0必须在DCDC启用之前通电,唤醒流程将在内部处理此问题。(LPSR_1P0是LDO,而不是DCDC,VCC_SOC和VDDA_1V8)。

FlaSh

    如果有唤醒异常的情况,比如VDD_SOC_IN电压一直为0的情况,这时需要检查 DCDC_PSWITCH的电压是否有从低到高变化的过程。与EVK相同的原始硬件:30k上拉电阻+0.22uF对地电容:如果3.3V系统电压没有降至0并立即通电,则无法产生1.1V内核电压。将30k电阻更改为130k,然后在这种情况下,1.1V内核电压正确启动。如果在某些情况下,3.3V系统电压不能从0V通电,例如从2V通电,那么RC延迟时间的要求是什么?

FlaSh    从DCDC_IN 稳定在 3V时到 DCDC-PSWITCH达到 0.5*DCDC_IN(1.5v)的延迟必须至少为1ms。如果 DCDC_IN电压短时下降,该电压不会降至0(例如仅降至2V),并立即升到3.3V,内部1.1V内核电压降至0,并且由于PSWITCH没有从0开始上升,而导致内核电压不会再次产生。这种情况在应用中是可能的,如何确保PSWITCH RC延迟时间?这个问题是由RC电路没有完全放电引起的,电源关闭,RC电路放电到低电平也需要时间,所以要使其工作,可以检测PSWITCH,确保它是0V,然后再通一次电源,它应该工作。在电压骤降的情况下,3.3V DCDC_IN到DCDC-PSWITCH之间的1ms延迟达到0.5*DCDC_IN(1.5v)就不能保证,因为3.3V DCDC _IN可能在任何电压下下降(例如>1.5v)并立即启动(这可能发生在工业现场)。

FlaSh

解答:上电复位,在任何条件下,都需要确保 DCDC_PSWITCH 引脚在上电前低于 0.5 V。建议使用RC延迟电路来提供DCDC_IN 稳定和DCDC_PSWITCH之间的延迟,总 RC延迟应为5-40毫秒。

•DCDC_IN必须在0.3 x RC时间范围内达到最低3.0 V。

•从DCDC_IN稳定在3.0 V (最小电压)到DCDC_PSWITCH达到0.5 x DCDC_IN(1.5 V)的延迟必须至少为1 ms。DCDC_PSWITCH延迟超过1ms以打开内部DCDC。

•其他电源域的加电转换速率规格为360V/s–36KV/s。

FlaSh

FlaSh

FlaSh

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分