В основной программе делаем примерно следущее:
Код: Выделить всё
;;; //настроить вектор обработчика прерываний RTC
PMU_WCYC = 50; //длительность доступа к регистрам часов 1 мкс (не менее).
//Если выполняем до запуска PLL, то можно оставить по умолчанию
//после сброса (PMU_WCYC =20)
WFI_PDEN.EN=1; //разрешить переход в режим POWER_OFF при выполнении команды WFI
WFI_ENTR.LDO0EN=0; //разрешить выключение LDO0 при выполнении команды WFI
WFI_ENTR.LDO1EN=0; //разрешить выключение LDO1 при выполнении команды WFI
PMURTC->RTC_CFG1 |= PMURTC_RTC_CFG1_REGEN_Msk; //подготовка к магическому отключению прерывания по ALARM
//(см руководство - раздел 18. "Часы реального времени RTC" стр 144)
PMURTC->RTC_CFG1 |= PMURTC_RTC_CFG1_ALARMRST_Msk; //собственно само отключение ALARM
PMURTC->RTC_WAKECFG.WAKEEN[5] = 1; //разрешаем прерывание по сигналу WKUP[5]
Код: Выделить всё
if (PMURTC->RTC_WAKECFG.WAKEPOL[5]==0) //если уровень по умолчанию (прерывание возникло при VBAT>VCC1)
{
PMURTC->RTC_WAKECFG.WAKEPOL[5] = 1; //поменять полярность сигнала WKUP[5] соответствующую условию VCC1>VBAT
WFI(); //уходим в режим ожидания прерывания и спустя время по умолчанию
//WFI_DELENTR.VAL=0x64 (видимо через 100 тактов) отключаем LDO0 и LDO1.
}
Но могут сработать любые прерывания, пока ядро не отключилось (22 мкФ на VCORE_CAP - выход LDO1), и вывести процессор из режима WFI. По крайней мере, так описывает логику работу ядра документация на RISC-V.
То есть можно получить ситуацию, когда с одновременным (или почти одновременным) падением VCC1 возникнет одно из других разрешенных прерываний. Процессор успеет перейти в режим WFI и выйти из него, питание окончательно провалится, ядро отключится. Процессор уже не не в POWER_OFF. В итоге LDO0 будет кушать батарею без внешнего питания значительно быстрее, чем одни часы.
Задача собственно прописать алгоритм, который гарантированно не позволит завесить процессор или досрочно убить батарею.
"Если неприятность может случиться - она обязательно случится".
Экспериментально проверку трудно осуществить, так как даже если событие будет возникать очень редко на одном устройстве, то на многих - уже будет не редко. Проверить это в отладчике - не представляю как.
Покритикуйте, если я где-то ошибаюсь в рассуждениях. Или может кто уже разбирался и знает правильный ответ.
PS: Ответ "поставить отдельные часы" я знаю
