當(dāng) I.MXRT1170進(jìn)入 SNVS模式,所有的電源域除了 SNVS域以外都會(huì)關(guān)閉,功耗最低達(dá)到uA級(jí),這意味著 ROM將會(huì)在喚醒后運(yùn)行。ROM會(huì)使用SPI模式讀命令,Octal Flash會(huì)在 OCR(Octal讀)模式。在進(jìn)入 SNVS模式前復(fù)位 Octal Flash芯片,或者將設(shè)置 RT1170進(jìn)入SNVS模式的代碼放在RAM中運(yùn)行,使用 POR引腳作為復(fù)位信號(hào)復(fù)位 Octal Flash,使用BOOT ROM 去復(fù)位 Octal Flash。
WAKEUP引腳默認(rèn)內(nèi)部是輸入上拉的,大約在 35k左右。
喚醒引腳是一個(gè) GPIO,由 SNVS 電源域供電配置為喚醒源。喚醒引腳會(huì)將 PMIC_ON_REQ為高電平,請(qǐng)求主SOC上電以退出SNVS模式。
請(qǐng)求主SoC電源狀態(tài)改變的硬件ON/OFF按鈕輸入信號(hào)。在OFF模式下與GND的短暫連接會(huì)導(dǎo)致內(nèi)部電源管理狀態(tài)機(jī)將狀態(tài)更改為ON。在ON模式下,與GND短暫連接會(huì)產(chǎn)生中斷(與GND大約5秒或更長(zhǎng)時(shí)間)會(huì)導(dǎo)致強(qiáng)制OFF。
喚醒引腳會(huì)將PMIC_ON_REQ 設(shè)置為高,而不是翻轉(zhuǎn)。
此外除了 GPIO喚醒外,也可以通過內(nèi)部 RTC喚醒,相關(guān)參考代碼如下。
#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]來(lái)檢測(cè)POR復(fù)位。但測(cè)試后,即使使用WAKEUP引腳退出SNVS模式,SRC->SRSR[ipp_reset_b]仍為1,與退出SNVS方式的按鍵復(fù)位相同。那么,在退出SNVS模式后,有其他方法可以檢測(cè)細(xì)節(jié)喚醒源嗎?主要需要知道從SNVS低功耗模式喚醒,而不僅僅是從電源POR喚醒。
從SOC的角度來(lái)看,POR或SNVS喚醒復(fù)位相同。因此,無(wú)論P(yáng)OR或使用WAKEUP引腳退出SNVS模式,SRC->SRSR[ipp_reset_b]始終為1。一種可以知道從SNVS或POR喚醒的解決方案是使用SNVS_LP GPR寄存器作為標(biāo)志。例如:
1.將1寫入LPGPR0;2.SOC進(jìn)入SNVS低功耗模式;3.當(dāng)SOC啟動(dòng)時(shí),讀取LPGPR0。4.如果LPGPR0=0,則為POR。如果LPGPR0=1,則從SNVS低功耗模式喚醒。
操作方法如下:通過SNVS LP控制寄存器中的GPR_Z_DIS位禁用GPR歸零。使用SNVS->LPCR |= 1<<24;操作代碼。如果不執(zhí)行這個(gè)代碼,直接寫入 LPGPR寄存器是無(wú)效的。
從 SNVS喚醒到 PMIC_ON_REQ輸出大約是 0.1ms的時(shí)間,如下圖所示。對(duì)于用戶來(lái)說(shuō),需要考慮PMIC_ON_REQ 到外部電源之間的時(shí)間間隔,上電順序的時(shí)間間隔這取決于外部電路,尤其是復(fù)位IC。
2) PMIC_ON_REQ 輸出使能外部的電源,這個(gè)時(shí)間間隔取決于外部電路,對(duì)于EVK來(lái)說(shuō)大約需要40ms。
通電后,關(guān)于上電順序的時(shí)間間隔大約是SOC復(fù)位到第一個(gè)MCU指令,大約為8ms。
從喚醒按鍵釋放到處理器 MCU 執(zhí)行指令大約需要260或270毫秒!這是因?yàn)殚_發(fā)板外部復(fù)位電路給了非常充裕的時(shí)間來(lái)釋放復(fù)位。
1)外部GPIO輸入觸發(fā)和PMIC_ON_REQ輸出
例如,這將使PMIC使能信號(hào)上升。從SNVS喚醒引腳輸入到PMIC_ON_REQ輸出大約需要0.1ms。
2) 電源上電(取決于系統(tǒng))
2.1 ) PMIC_ON_REQ 輸出以啟用外部加電.
例如,PMIC啟用DCDC_3v3。這可能需要一些時(shí)間,從6毫秒(測(cè)量值)到40毫秒。
2.2 ) 復(fù)位釋放
在EVK中,復(fù)位監(jiān)控IC將等待大量時(shí)間來(lái)解除MCU復(fù)位。例如,260ms。該延遲是確保所有電源域已經(jīng)達(dá)到穩(wěn)定的最安全裕度。
3) 復(fù)位后的MCU引導(dǎo)時(shí)間
這將需要 6~7ms(考慮到在GPIO切換之前一直在測(cè)量,測(cè)量時(shí)間為9ms)。希望在20毫秒動(dòng)力CAN或者 100毫秒車身CAN 要求更短的時(shí)間內(nèi)從SNVS中喚醒并執(zhí)行代碼。應(yīng)該注意電源上電序列!例如,確保調(diào)整外部復(fù)位電路復(fù)位的時(shí)間。此外,與其他電源模式相比,SNVS不會(huì)占用最大的延遲。MCU 將簡(jiǎn)單地從復(fù)位中恢復(fù)!會(huì)發(fā)現(xiàn)系統(tǒng)可能需要更長(zhǎng)的恢復(fù)時(shí)間,但這是因?yàn)橥獠侩娫丛俅瓮姡ò◤?fù)位)。
對(duì)于wakeup喚醒電平要求:
支持低電平,高電平,上升沿,下降沿喚醒。
當(dāng)器件從SNVS模式喚醒時(shí),用戶可以知道系統(tǒng)從SNVS方式恢復(fù)的另外一種方法。試圖檢查SRC和SRSR,但找不到任何適合此要求的標(biāo)志。使用SNVS-GPR32,當(dāng)發(fā)生篡改事件時(shí)不會(huì)清除。還有一個(gè)鎖定位控制,可以用來(lái)阻止位修改,直到重新上電。
RT1170在內(nèi)部處理上電序列,LPSR LDO將在開啟DCDC之前啟用。LPSR_1P0必須在DCDC啟用之前通電,喚醒流程將在內(nèi)部處理此問題。(LPSR_1P0是LDO,而不是DCDC,VCC_SOC和VDDA_1V8)。
如果有喚醒異常的情況,比如VDD_SOC_IN電壓一直為0的情況,這時(shí)需要檢查 DCDC_PSWITCH的電壓是否有從低到高變化的過程。與EVK相同的原始硬件:30k上拉電阻+0.22uF對(duì)地電容:如果3.3V系統(tǒng)電壓沒有降至0并立即通電,則無(wú)法產(chǎn)生1.1V內(nèi)核電壓。將30k電阻更改為130k,然后在這種情況下,1.1V內(nèi)核電壓正確啟動(dòng)。如果在某些情況下,3.3V系統(tǒng)電壓不能從0V通電,例如從2V通電,那么RC延遲時(shí)間的要求是什么?
????從DCDC_IN 穩(wěn)定在 3V時(shí)到 DCDC-PSWITCH達(dá)到 0.5*DCDC_IN(1.5v)的延遲必須至少為1ms。如果 DCDC_IN電壓短時(shí)下降,該電壓不會(huì)降至0(例如僅降至2V),并立即升到3.3V,內(nèi)部1.1V內(nèi)核電壓降至0,并且由于PSWITCH沒有從0開始上升,而導(dǎo)致內(nèi)核電壓不會(huì)再次產(chǎn)生。這種情況在應(yīng)用中是可能的,如何確保PSWITCH RC延遲時(shí)間?這個(gè)問題是由RC電路沒有完全放電引起的,電源關(guān)閉,RC電路放電到低電平也需要時(shí)間,所以要使其工作,可以檢測(cè)PSWITCH,確保它是0V,然后再通一次電源,它應(yīng)該工作。在電壓驟降的情況下,3.3V DCDC_IN到DCDC-PSWITCH之間的1ms延遲達(dá)到0.5*DCDC_IN(1.5v)就不能保證,因?yàn)?.3V DCDC _IN可能在任何電壓下下降(例如>1.5v)并立即啟動(dòng)(這可能發(fā)生在工業(yè)現(xiàn)場(chǎng))。
解答:上電復(fù)位,在任何條件下,都需要確保 DCDC_PSWITCH 引腳在上電前低于0.5 V。建議使用RC延遲電路來(lái)提供DCDC_IN 穩(wěn)定和DCDC_PSWITCH之間的延遲,總 RC延遲應(yīng)為5-40毫秒。
?DCDC_IN必須在0.3 x RC時(shí)間范圍內(nèi)達(dá)到最低3.0 V。
?從DCDC_IN穩(wěn)定在3.0 V (最小電壓)到DCDC_PSWITCH達(dá)到0.5 x DCDC_IN(1.5 V)的延遲必須至少為1 ms。DCDC_PSWITCH延遲超過1ms以打開內(nèi)部DCDC。
?其他電源域的加電轉(zhuǎn)換速率規(guī)格為360V/s–36KV/s。
審核編輯:湯梓紅
-
FlaSh
+關(guān)注
關(guān)注
10文章
1642瀏覽量
148437 -
soc
+關(guān)注
關(guān)注
38文章
4199瀏覽量
218800 -
SPI
+關(guān)注
關(guān)注
17文章
1721瀏覽量
91955 -
引腳
+關(guān)注
關(guān)注
16文章
1219瀏覽量
50783 -
GPIO
+關(guān)注
關(guān)注
16文章
1216瀏覽量
52280
原文標(biāo)題:MIMXRT1172 SNVS模式Wakeup喚醒
文章出處:【微信號(hào):嵌入式 MCU,微信公眾號(hào):嵌入式 MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論