Thanks!
But when the MKL03 enter VLLS1.it cannot be wake up. Please help me !
/*******************************************************************************
* Variables for BOARD_BootClockRUN configuration
******************************************************************************/
const mcglite_config_t mcgliteConfig_BOARD_BootClockRUN =
{
.outSrc = kMCGLITE_ClkSrcLirc, /* MCGOUTCLK source is LIRC */
.irclkEnableMode = kMCGLITE_IrclkEnable, /* MCGIRCLK enabled, MCGIRCLK disabled in STOP mode */
.ircs = kMCGLITE_Lirc2M, /* Slow internal reference (LIRC) 2 MHz clock selected */
.fcrdiv = kMCGLITE_LircDivBy1, /* Low-frequency Internal Reference Clock Divider: divided by 1 */
.lircDiv2 = kMCGLITE_LircDivBy1, /* Second Low-frequency Internal Reference Clock Divider: divided by 1 */
.hircEnableInNotHircMode = false, /* HIRC source is not enabled */
};
const sim_clock_config_t simConfig_BOARD_BootClockRUN =
{
.er32kSrc = SIM_OSC32KSEL_OSC32KCLK_CLK, /* OSC32KSEL select: OSC32KCLK clock */
.clkdiv1 = 0x10000U, /* SIM_CLKDIV1 - OUTDIV1: /1, OUTDIV4: /2 */
};
const osc_config_t oscConfig_BOARD_BootClockRUN =
{
.freq = 32768U, /* Oscillator frequency: 32768Hz */
.capLoad = (kOSC_Cap4P | kOSC_Cap8P), /* Oscillator capacity load: 12pF */
.workMode = kOSC_ModeOscLowPower, /* Oscillator low power */
.oscerConfig =
{
.enableMode = OSC_ER_CLK_DISABLE, /* Disable external reference clock */
}
};
/*******************************************************************************
* Code for BOARD_BootClockRUN configuration
******************************************************************************/
void BOARD_BootClockRUN(void)
{
/* Set the system clock dividers in SIM to safe value. */
CLOCK_SetSimSafeDivs();
/* Enable RTC oscillator. */
//CLOCK_CONFIG_EnableRtcOsc(RTC_OSC_CAP_LOAD_12PF);
/* Initializes OSC0 according to board configuration. */
//CLOCK_InitOsc0(&oscConfig_BOARD_BootClockRUN);
//CLOCK_SetXtal0Freq(oscConfig_BOARD_BootClockRUN.freq);
/* Set MCG to LIRC2M mode. */
CLOCK_SetMcgliteConfig(&mcgliteConfig_BOARD_BootClockRUN);
/* Set the clock configuration in SIM module. */
//CLOCK_SetSimConfig(&simConfig_BOARD_BootClockRUN);
// /* Configure RTC clock. */
// CLOCK_CONFIG_SetRtcClock();
/* Set SystemCoreClock variable. */
SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;
}
void BOARD_PorClockRUN(void)
{
/* Set the system clock dividers in SIM to safe value. */
CLOCK_SetSimSafeDivs();
/* Enable RTC oscillator. */
CLOCK_CONFIG_EnableRtcOsc(RTC_OSC_CAP_LOAD_12PF);
/* Initializes OSC0 according to board configuration. */
CLOCK_InitOsc0(&oscConfig_BOARD_BootClockRUN);
CLOCK_SetXtal0Freq(oscConfig_BOARD_BootClockRUN.freq);
/* Set MCG to LIRC2M mode. */
CLOCK_SetMcgliteConfig(&mcgliteConfig_BOARD_BootClockRUN);
/* Set the clock configuration in SIM module. */
CLOCK_SetSimConfig(&simConfig_BOARD_BootClockRUN);
/* Configure RTC clock. */
CLOCK_CONFIG_SetRtcClock();
/* Set SystemCoreClock variable. */
SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;
CLOCK_SetRtcClkOutClock(0);
}
//rtc.c
void app_rtc_init(void)
{
rtc_config_t config;
rtc_datetime_t date;
RTC_GetDefaultConfig(&config);
config.wakeupSelect = 0;
config.supervisorAccess = 1;
config.updateMode = 1;
RTC_Init(RTC, &config);
RTC_StopTimer(RTC);
/* Set a start date time and start RT */
date.year = 2017U;
date.month = 9U;
date.day = 8U;
date.hour = 10U;
date.minute = 39;
date.second = 0;
/* Set RTC time to default */
RTC_SetDatetime(RTC, &date);
RTC_StartTimer(RTC);
}
uint32_t app_rtc_get_second(void)
{
CLOCK_EnableClock(kCLOCK_Rtc0);
return RTC->TSR;
}
void app_rtc_clear_alarm(void)
{
CLOCK_EnableClock(kCLOCK_Rtc0);
RTC_ClearStatusFlags(RTC, kRTC_AlarmInterruptEnable);
}
void app_rtc_set_alarm(uint16_t second)
{
uint32_t currSeconds;
//CLOCK_EnableClock(kCLOCK_Rtc0);
currSeconds = RTC->TSR;
RTC->TAR = currSeconds + second;
/* Enable RTC alarm interrupt */
RTC_EnableInterrupts(RTC, kRTC_AlarmInterruptEnable);
//EnableIRQ(RTC_IRQn);
}
void app_rtc_enable_second_alarm(void)
{
CLOCK_EnableClock(kCLOCK_Rtc0);
RTC_DisableInterrupts(RTC, RTC_IER_TIIE_MASK);
RTC_DisableInterrupts(RTC, RTC_IER_TOIE_MASK);
RTC_DisableInterrupts(RTC, RTC_IER_TAIE_MASK);
RTC_EnableInterrupts(RTC, kRTC_SecondsInterruptEnable);
}
void app_rtc_disable_second_alarm(void)
{
RTC_DisableInterrupts(RTC, kRTC_SecondsInterruptEnable);
}
//main.c
void RTC_IRQHandler(void)
{
if (RTC_GetStatusFlags(RTC) & kRTC_AlarmFlag)
{
RTC_ClearStatusFlags(RTC, kRTC_AlarmFlag);
Ht1621_Bus_Init();
run_para->lcd_second++;
run_para->lcd_second = run_para->lcd_second % 10;
Display_Small_No1(run_para->lcd_second);
app_rtc_set_alarm(2);
/* Clear alarm flag */
}
}
void RTC_Seconds_IRQHandler(void)
{
Ht1621_Bus_Init();
run_para->lcd_second++;
run_para->lcd_second = run_para->lcd_second % 10;
Display_Small_No1(run_para->lcd_second);
}
/*!
* @brief LLWU interrupt handler.
*/
void LLWU_IRQHandler(void)
{
if(LLWU_GetExternalWakeupPinFlag(LLWU, LLWU_WAKEUP_PIN_IDX))
{
LLWU_ClearExternalWakeupPinFlag(LLWU, LLWU_WAKEUP_PIN_IDX);
}
Ht1621_Bus_Init();
run_para->lcd_second++;
run_para->lcd_second = run_para->lcd_second % 10;
Display_Small_No1(run_para->lcd_second);
}
void PORTB_IRQHandler(void)
{
if ((1U << WAKE_PIN) & PORT_GetPinsInterruptFlags(PORTB))
{//WAKE
PORT_ClearPinsInterruptFlags(PORTB, (1U << WAKE_PIN));
}
}
int main(void) {
extern void BOARD_PorClockRUN(void);
SMC_SetPowerModeProtection(SMC, kSMC_AllowPowerModeAll); //CPUÔËÐÐÔÚËùÓеçÔ´¹¤×÷ģʽÏÂ
if (kRCM_SourcePor & RCM_GetPreviousResetSources(RCM)) /* Wakeup POR */
{
//por reset
//check flash crc or load default para
BOARD_PorClockRUN();
//MCG->C2 |= MCG_C2_EREFS0_MASK;
app_rtc_init();
app_rtc_enable_second_alarm();
//app_rtc_set_alarm(1);
}
else
{
BOARD_InitBootClocks();
CLOCK_EnableClock(kCLOCK_Rtc0);
//RTC_StartTimer(RTC);
}
Ht1621_Init();
Ht1621_clear();
run_para->lcd_second++;
run_para->lcd_second = run_para->lcd_second % 10;
button_init();
wake_init();
NVIC_EnableIRQ(RTC_Seconds_IRQn);
//NVIC_EnableIRQ(RTC_IRQn);
NVIC_EnableIRQ(LLWU_IRQn);
if (kRCM_SourceWakeup & RCM_GetPreviousResetSources(RCM)) /* Wakeup from VLLS. */
{
}
enable_llwu_interrupt();
power_mode_vlls1();
while(1) {
}
}