rtc_demo.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #include <stdio.h>
  2. #include "amt630hv160_lib.h"
  3. #ifdef _RTC
  4. #if RTC_DEMO
  5. static uint8_t __attribute__( ( section( "sleep_critical_data" ) ) ) PRIVATE1_RAM_BUFFER[16];
  6. static uint8_t __attribute__( ( section( "sleep_critical_data" ) ) ) PRIVATE2_RAM_BUFFER[16];
  7. /*
  8. 唤醒源配置可提前在系统启动时配置
  9. */
  10. #if RTC_DEMO == RTC_ACCWAKEUP_DEMO
  11. void entry_acc_sleep(int fastboot, u8 wakeup_mode)
  12. {
  13. if (wakeup_mode >= RTC_WAKEUP_HIGHLEVEL) {
  14. printf("acc not support wakeup mode, sleep fail.\n");
  15. return;
  16. }
  17. //wakeup source config
  18. RTC_SetWakeup(RTC_WAKEUP_GPIO0, RTC_WAKEUP_RISING, 0);
  19. RTC_SetWakeup(RTC_WAKEUP_GPIO1, RTC_WAKEUP_RISING, 0);
  20. RTC_SetWakeup(RTC_WAKEUP_CAN1, RTC_WAKEUP_RISING, 0);
  21. RTC_SetWakeup(RTC_WAKEUP_CAN0, RTC_WAKEUP_RISING, 0);
  22. RTC_SetWakeup(RTC_WAKEUP_RTC, RTC_WAKEUP_RISING, 0);
  23. RTC_SetWakeup(RTC_WAKEUP_ACC, RTC_WAKEUP_RISING, 1);
  24. if (RTC_SaveSleepData())
  25. return;
  26. printf("entry sleep.\n");
  27. RTC_PowerDown(fastboot);
  28. }
  29. #elif RTC_DEMO == RTC_RTCWAKEUP_DEMO
  30. void entry_rtc_sleep(u32 time_s)
  31. {
  32. if (time_s == 0)
  33. time_s = 1;
  34. //wakeup source config
  35. RTC_SetWakeup(RTC_WAKEUP_GPIO0, RTC_WAKEUP_RISING, 0);
  36. RTC_SetWakeup(RTC_WAKEUP_GPIO1, RTC_WAKEUP_RISING, 0);
  37. RTC_SetWakeup(RTC_WAKEUP_CAN1, RTC_WAKEUP_RISING, 0);
  38. RTC_SetWakeup(RTC_WAKEUP_CAN0, RTC_WAKEUP_RISING, 0);
  39. RTC_SetWakeup(RTC_WAKEUP_RTC, RTC_WAKEUP_RISING, 1);
  40. RTC_SetWakeup(RTC_WAKEUP_ACC, RTC_WAKEUP_RISING, 0);
  41. printf("entry sleep time %ds.\n", time_s);
  42. RTC_SendCmd(RTC_DelayWakeUp, 1);
  43. if (RTC->CNT_L > 0x6000) //若小数部分超过0.75s,则加1s
  44. time_s += 1;
  45. RTC_WriteReg(RTC_RAMH, &RTC->RAM_H, RTC->CNT_H + time_s);//config sleep time
  46. RTC_PowerDown(0);
  47. }
  48. #elif RTC_DEMO == RTC_GPIO0WAKEUP_DEMO
  49. void entry_gpio0_sleep(int fastboot, u8 wakeup_mode)
  50. {
  51. if (wakeup_mode >= RTC_WAKEUP_NOCHANGE) {
  52. printf("gpio0 not support wakeup mode, sleep fail.\n");
  53. return;
  54. }
  55. //wakeup source config
  56. RTC_SetWakeup(RTC_WAKEUP_GPIO0, wakeup_mode, 1);
  57. RTC_SetWakeup(RTC_WAKEUP_GPIO1, RTC_WAKEUP_RISING, 0);
  58. RTC_SetWakeup(RTC_WAKEUP_CAN1, RTC_WAKEUP_RISING, 0);
  59. RTC_SetWakeup(RTC_WAKEUP_CAN0, RTC_WAKEUP_RISING, 0);
  60. RTC_SetWakeup(RTC_WAKEUP_RTC, RTC_WAKEUP_RISING, 0);
  61. RTC_SetWakeup(RTC_WAKEUP_ACC, RTC_WAKEUP_RISING, 0);
  62. printf("entry sleep.\n");
  63. RTC_PowerDown(fastboot);
  64. }
  65. #elif RTC_DEMO == RTC_GPIO1WAKEUP_DEMO
  66. void entry_gpio1_sleep(int fastboot, u8 wakeup_mode)
  67. {
  68. if (wakeup_mode >= RTC_WAKEUP_NOCHANGE) {
  69. printf("gpio1 not support wakeup mode, sleep fail.\n");
  70. return;
  71. }
  72. //wakeup source config
  73. RTC_SetWakeup(RTC_WAKEUP_GPIO0, RTC_WAKEUP_RISING, 0);
  74. RTC_SetWakeup(RTC_WAKEUP_GPIO1, wakeup_mode, 1);
  75. RTC_SetWakeup(RTC_WAKEUP_CAN1, RTC_WAKEUP_RISING, 0);
  76. RTC_SetWakeup(RTC_WAKEUP_CAN0, RTC_WAKEUP_RISING, 0);
  77. RTC_SetWakeup(RTC_WAKEUP_RTC, RTC_WAKEUP_RISING, 0);
  78. RTC_SetWakeup(RTC_WAKEUP_ACC, RTC_WAKEUP_RISING, 0);
  79. printf("entry sleep.\n");
  80. RTC_PowerDown(fastboot);
  81. }
  82. #endif
  83. void rtc_wakeup_demo(void)
  84. {
  85. if (!RTC_ReadSleepData()) {
  86. printf("P1_BUF[0]: 0x%x, P1_BUF[15]: 0x%x, P2_BUF[0]: 0x%x, P2_BUF[15]: 0x%x.\n",
  87. PRIVATE1_RAM_BUFFER[0], PRIVATE1_RAM_BUFFER[15], PRIVATE2_RAM_BUFFER[0], PRIVATE2_RAM_BUFFER[15]);
  88. }
  89. }
  90. void rtc_sleep_demo(void)
  91. {
  92. vTaskDelay(5000); //系统延时5s后进入休眠
  93. if (!(RTC->RTCSTA & RTC_STA_SLEEPMODE)) {
  94. #if RTC_DEMO == RTC_ACCWAKEUP_DEMO
  95. //The simulation goes to sleep after accessing swl data
  96. PRIVATE1_RAM_BUFFER[0] = 0x55;
  97. PRIVATE1_RAM_BUFFER[15] = 0xaa;
  98. PRIVATE2_RAM_BUFFER[0] = 0x5a;
  99. PRIVATE2_RAM_BUFFER[15] = 0xa5;
  100. entry_acc_sleep(0, RTC_WAKEUP_RISING);
  101. #elif RTC_DEMO == RTC_RTCWAKEUP_DEMO
  102. entry_rtc_sleep(10);
  103. #elif RTC_DEMO == RTC_GPIO0WAKEUP_DEMO
  104. entry_gpio0_sleep(0, RTC_WAKEUP_RISING);
  105. #elif RTC_DEMO == RTC_GPIO1WAKEUP_DEMO
  106. entry_gpio1_sleep(0, RTC_WAKEUP_RISING);
  107. #endif
  108. } else {
  109. printf("normal running.\n");
  110. //The simulated fault generation results in a wdt reset.
  111. #if RTC_DEMO == RTC_ACCWAKEUP_DEMO
  112. //wakeup boot delay 10s entry wdt reset
  113. if (RTC->RTCSTA & RTC_STA_ACCACT) {
  114. vTaskDelay(10000);
  115. WDT_McuReboot();
  116. }
  117. #endif
  118. }
  119. }
  120. #endif
  121. #endif