petrdynin

K1921VG015+PowerOFF

Oct 24th, 2025 (edited)
1,087
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.13 KB | Source Code | 0 0
  1. void main(){
  2.   ................
  3.   RTC_init();
  4.   Wake_Vcc1_Off_config();
  5.   ..............
  6.   for(;;){
  7.      ........
  8.   }
  9. }
  10. /***********************************************************************************************************************************/
  11. void RTC_init()
  12. {
  13.     PMURTC->RTC_CFG0_bit.EXTOSC = 1;
  14.     PLIC_SetIrqHandler(Plic_Mach_Target, IsrVect_IRQ_PMURTC, RTC_IRQHandler);
  15.     PLIC_SetPriority(IsrVect_IRQ_PMURTC, 0x1);
  16.     PLIC_IntEnable(Plic_Mach_Target, IsrVect_IRQ_PMURTC);
  17.     PMURTC->RTC_CFG1 |= PMURTC_RTC_CFG1_REGEN_Msk;
  18. }
  19. /***********************************************************************************************************************************/
  20. /* Функция настройки Wake5 на событие "VBAT > VCC1" при отключении VCC1 */
  21. void Wake_Vcc1_Off_config()
  22. {
  23.     PMURTC->RTC_WAKECFG &= ~(0x20);                                   // сброс WAKEUP5
  24.     PMURTC->RTC_HISTORY = 0x0;
  25.     PMURTC->RTC_WAKECFG &= ~(0x20 << PMURTC_RTC_WAKECFG_WAKEPOL_Pos); // Устанавливаем полярность для WAKEUP5 - высокий уровень (VBAT > VCC1)
  26.     PMURTC->RTC_WAKECFG |= 0x20;                                      // Разрешаем событие WAKEUP5
  27.     PMURTC->RTC_HISTORY = 0x0;                                        // СБрасываем регистр событий
  28. }
  29. /***********************************************************************************************************************************/
  30. /* Функция настройки Wake5 на событие "VBAT < VCC1" при включении VCC1 */
  31. void Wake_Vсс1_On_config()
  32. {
  33.     PMURTC->RTC_WAKECFG &= ~(0x20);                                   // сброс WAKEUP5
  34.     PMURTC->RTC_HISTORY = 0x0;
  35.     PMURTC->RTC_WAKECFG |= (0x20 << PMURTC_RTC_WAKECFG_WAKEPOL_Pos); // Устанавливаем полярность для WAKEUP5 - низкий уровень (VBAT < VCC1)
  36.     PMURTC->RTC_WAKECFG_bit.WAKEEN = 0x20;                           // Разрешаем событие WAKEUP5
  37.     PMURTC->RTC_HISTORY = 0x0;                                       // СБрасываем регистр событий
  38. }
  39. /***********************************************************************************************************************************/
  40. void RTC_IRQHandler()
  41. {
  42.     uint32_t tmp_history;
  43.     tmp_history = PMURTC->RTC_HISTORY;
  44.     PMURTC->RTC_HISTORY = 0;
  45.     if (tmp_history & PMURTC_RTC_HISTORY_WKVFVBAK_Msk) {
  46.         // Если сработало событие (VBAT > VCC1) или (VBAT < VCC1)
  47.         if(PMURTC->RTC_WAKECFG_bit.WAKEPOL & 0x20) {
  48.             // VBAT < VCC1 — включилось питание VCC1
  49.             Wake_Vcc1_Off_config(); //настройка Wake5 на событие "VBAT > VCC1" при отключении VCC1,
  50.                                     //которое произойдет в случае выключения питания
  51.         } else {
  52.             // VBAT > VCC1 — отключилось питание VCC1, нужно работать от Vbat, чтобы работали часики
  53.             Wake_Vсс1_On_config(); //настройка Wake5 на событие "VBAT < VCC1" при включении VCC1,
  54.                                    //которое произойдет в случае включения питания
  55.             // Отключаем лишние функции для минимального тока
  56.             PMURTC->PMU_VBATPER_WFI = 0xFFFFFFFF;
  57.             PMURTC->RTC_REG[1].RTC_REG++;
  58.             PMURTC->RTC_CFG1_bit.ALARMEN = 0;
  59.             PMURTC->RTC_CFG1_bit.REGEN = 0;
  60.             PMURTC->RTC_CFG1 |= PMURTC_RTC_CFG1_ALARMRST_Msk;
  61.             PMURTC->WFI_PDEN_bit.EN = 1;
  62.             PMURTC->WFI_ENTR_bit.LDO0EN = 0;
  63.             PMURTC->WFI_ENTR_bit.LDO1EN = 0;
  64.             GPIOA->DATAOUTSET = (0b1) << 13;
  65.  
  66.             // Уходим в WFI и ждем появления VCC1
  67.              while (1) {
  68.                  __asm("WFI");
  69.             }
  70.         }
  71.     }
  72.     PMURTC->RTC_CFG1 |= PMURTC_RTC_CFG1_ALARMRST_Msk;
  73.     PMURTC->PMU_IRQEVT = 1;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment