| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- #include <stdio.h>
- #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
|