#include #include "amt630hv160_lib.h" #ifdef _RTC #if RTC_DEMO static uint8_t __attribute__( ( section( "sleep_critical_data" ) ) ) PRIVATE1_RAM_BUFFER[16]; static uint8_t __attribute__( ( section( "sleep_critical_data" ) ) ) PRIVATE2_RAM_BUFFER[16]; /* 唤醒源配置可提前在系统启动时配置 */ #if RTC_DEMO == RTC_ACCWAKEUP_DEMO void entry_acc_sleep(int fastboot, u8 wakeup_mode) { if (wakeup_mode >= RTC_WAKEUP_HIGHLEVEL) { printf("acc not support wakeup mode, sleep fail.\n"); return; } //wakeup source config RTC_SetWakeup(RTC_WAKEUP_GPIO0, RTC_WAKEUP_RISING, 0); RTC_SetWakeup(RTC_WAKEUP_GPIO1, RTC_WAKEUP_RISING, 0); RTC_SetWakeup(RTC_WAKEUP_CAN1, RTC_WAKEUP_RISING, 0); RTC_SetWakeup(RTC_WAKEUP_CAN0, RTC_WAKEUP_RISING, 0); RTC_SetWakeup(RTC_WAKEUP_RTC, RTC_WAKEUP_RISING, 0); RTC_SetWakeup(RTC_WAKEUP_ACC, RTC_WAKEUP_RISING, 1); if (RTC_SaveSleepData()) return; printf("entry sleep.\n"); RTC_PowerDown(fastboot); } #elif RTC_DEMO == RTC_RTCWAKEUP_DEMO void entry_rtc_sleep(u32 time_s) { if (time_s == 0) time_s = 1; //wakeup source config RTC_SetWakeup(RTC_WAKEUP_GPIO0, RTC_WAKEUP_RISING, 0); RTC_SetWakeup(RTC_WAKEUP_GPIO1, RTC_WAKEUP_RISING, 0); RTC_SetWakeup(RTC_WAKEUP_CAN1, RTC_WAKEUP_RISING, 0); RTC_SetWakeup(RTC_WAKEUP_CAN0, RTC_WAKEUP_RISING, 0); RTC_SetWakeup(RTC_WAKEUP_RTC, RTC_WAKEUP_RISING, 1); RTC_SetWakeup(RTC_WAKEUP_ACC, RTC_WAKEUP_RISING, 0); printf("entry sleep time %ds.\n", time_s); RTC_SendCmd(RTC_DelayWakeUp, 1); if (RTC->CNT_L > 0x6000) //若小数部分超过0.75s,则加1s time_s += 1; RTC_WriteReg(RTC_RAMH, &RTC->RAM_H, RTC->CNT_H + time_s);//config sleep time RTC_PowerDown(0); } #elif RTC_DEMO == RTC_GPIO0WAKEUP_DEMO void entry_gpio0_sleep(int fastboot, u8 wakeup_mode) { if (wakeup_mode >= RTC_WAKEUP_NOCHANGE) { printf("gpio0 not support wakeup mode, sleep fail.\n"); return; } //wakeup source config RTC_SetWakeup(RTC_WAKEUP_GPIO0, wakeup_mode, 1); RTC_SetWakeup(RTC_WAKEUP_GPIO1, RTC_WAKEUP_RISING, 0); RTC_SetWakeup(RTC_WAKEUP_CAN1, RTC_WAKEUP_RISING, 0); RTC_SetWakeup(RTC_WAKEUP_CAN0, RTC_WAKEUP_RISING, 0); RTC_SetWakeup(RTC_WAKEUP_RTC, RTC_WAKEUP_RISING, 0); RTC_SetWakeup(RTC_WAKEUP_ACC, RTC_WAKEUP_RISING, 0); printf("entry sleep.\n"); RTC_PowerDown(fastboot); } #elif RTC_DEMO == RTC_GPIO1WAKEUP_DEMO void entry_gpio1_sleep(int fastboot, u8 wakeup_mode) { if (wakeup_mode >= RTC_WAKEUP_NOCHANGE) { printf("gpio1 not support wakeup mode, sleep fail.\n"); return; } //wakeup source config RTC_SetWakeup(RTC_WAKEUP_GPIO0, RTC_WAKEUP_RISING, 0); RTC_SetWakeup(RTC_WAKEUP_GPIO1, wakeup_mode, 1); RTC_SetWakeup(RTC_WAKEUP_CAN1, RTC_WAKEUP_RISING, 0); RTC_SetWakeup(RTC_WAKEUP_CAN0, RTC_WAKEUP_RISING, 0); RTC_SetWakeup(RTC_WAKEUP_RTC, RTC_WAKEUP_RISING, 0); RTC_SetWakeup(RTC_WAKEUP_ACC, RTC_WAKEUP_RISING, 0); printf("entry sleep.\n"); RTC_PowerDown(fastboot); } #endif void rtc_wakeup_demo(void) { if (!RTC_ReadSleepData()) { printf("P1_BUF[0]: 0x%x, P1_BUF[15]: 0x%x, P2_BUF[0]: 0x%x, P2_BUF[15]: 0x%x.\n", PRIVATE1_RAM_BUFFER[0], PRIVATE1_RAM_BUFFER[15], PRIVATE2_RAM_BUFFER[0], PRIVATE2_RAM_BUFFER[15]); } } void rtc_sleep_demo(void) { vTaskDelay(5000); //系统延时5s后进入休眠 if (!(RTC->RTCSTA & RTC_STA_SLEEPMODE)) { #if RTC_DEMO == RTC_ACCWAKEUP_DEMO //The simulation goes to sleep after accessing swl data PRIVATE1_RAM_BUFFER[0] = 0x55; PRIVATE1_RAM_BUFFER[15] = 0xaa; PRIVATE2_RAM_BUFFER[0] = 0x5a; PRIVATE2_RAM_BUFFER[15] = 0xa5; entry_acc_sleep(0, RTC_WAKEUP_RISING); #elif RTC_DEMO == RTC_RTCWAKEUP_DEMO entry_rtc_sleep(10); #elif RTC_DEMO == RTC_GPIO0WAKEUP_DEMO entry_gpio0_sleep(0, RTC_WAKEUP_RISING); #elif RTC_DEMO == RTC_GPIO1WAKEUP_DEMO entry_gpio1_sleep(0, RTC_WAKEUP_RISING); #endif } else { printf("normal running.\n"); //The simulated fault generation results in a wdt reset. #if RTC_DEMO == RTC_ACCWAKEUP_DEMO //wakeup boot delay 10s entry wdt reset if (RTC->RTCSTA & RTC_STA_ACCACT) { vTaskDelay(10000); WDT_McuReboot(); } #endif } } #endif #endif