К1921ВГ015 RTC + CR2032
Модераторы: ea, dav, bkolbov, Alis, pip, _sva_
Re: К1921ВГ015 RTC + CR2032
Готовый рецепт для тех, у кого проблемы с запуском генератора и не требуется микропотребления в режиме POWER_OFF:
Поставить резистор 2 МОм между выводом XI_OSC и GND (параллельно конденсатору). Резистор между XI_OSC и XO_OSC по мануалу - 1 МОм.
Получаем при питании 3,3В смещение по постоянному току как при питании 2,2В. Старт кварца стабильный: А с батарейным питанием - alles kaputt - ставим внешние часы.
Поставить резистор 2 МОм между выводом XI_OSC и GND (параллельно конденсатору). Резистор между XI_OSC и XO_OSC по мануалу - 1 МОм.
Получаем при питании 3,3В смещение по постоянному току как при питании 2,2В. Старт кварца стабильный: А с батарейным питанием - alles kaputt - ставим внешние часы.
Re: К1921ВГ015 RTC + CR2032
Можно и в такой ситуации выкрутиться (транзистор с низким пороговым напряжением, типа АО3416 - как ERRATA):
Резистор при выключении LDO0 будет также отключаться и не будет тянуть питание батареи на себя. Для 2 МОм и батарейки 3В - это дополнительные 1,5 мкА. Может и не много, но встроенные часы жрут от часовой батарейки чуть меньше 4 мкА, вместе с подтяжкой будет 5,5 мкА. Транзистор же позволит сохранить потребление на на прежнем уровне. С другой стороны внешние часы потребляют порядка 0,5 мкА.
В общем, это для истинных любителей искусства, т.к. количество костылей по занимаемой площади на плате уже сильно превышает размер внешних часов. И самое, что может быть критично, - все костыли вокруг цепей, которые нежелательно слишком вольно по плате растаскивать
В общем, это для истинных любителей искусства, т.к. количество костылей по занимаемой площади на плате уже сильно превышает размер внешних часов. И самое, что может быть критично, - все костыли вокруг цепей, которые нежелательно слишком вольно по плате растаскивать
Re: К1921ВГ015 RTC + CR2032
Похоже, что немного ошибся - ток от дополнительного резистора будет 1 мкА. К выходу подключено ведь суммарное сопротивление 1МОм +2 МОм. 500 нА сэкономили
Re: К1921ВГ015 RTC + CR2032
Не дает покоя идея заставить честно работать встроенные часы с батарейкой
В регистре RTC_WAKECFG есть биты DIS5 (15..14). Про них в РП буквально сказано:
отключаются LDO0 и LDO1, а также основной кварцевый генератор HSE. Вроде как правильно.
Но когда делаю так:
LDO0 отключается только на 5й..10й раз раз отключения основного питания, в других случаях LDO0 и HSE остается включенным и батарейка проедается значительно бОльшим током.
VCC1 = 3,3В, Напряжение батареи CR2032 3,15..3,10В в зависимости от нагрузки. На вход VBAT напряжение поступает через диоды от батареи и VCC1.
Строка
ни на что не влияет, судя по описанию и не должна, поведение с ней и без нее одинаково.
Чего я делаю не так?
В регистре RTC_WAKECFG есть биты DIS5 (15..14). Про них в РП буквально сказано:
Про RTC_CFG1.REGDIS сказано:Значение будет скопировано в RTC_CFG1.REGDIS при возникновении события WKUP[5]
Когда делаю такКогда бит REGDIS[k] установлен, регулятор k останется выключен даже при активном сигнале тревоги
Код: Выделить всё
PMURTC->RTC_CFG1 |= PMURTC_RTC_CFG1_REGDIS_Msk;Но когда делаю так:
Код: Выделить всё
int main(void)
{
PMURTC->RTC_CFG1 |= PMURTC_RTC_CFG1_REGEN_Msk; //разрешаем работу LDO0, LDO1 без сигнала тревоги
PMURTC->RTC_CFG1 |= PMURTC_RTC_CFG1_ALARMRST_Msk; //снимаем сигнал тревоги от будильника
PMURTC->RTC_CFG0_bit.EXTOSC = 1; //внешний резонатор часов
PMURTC->RTC_WAKECFG_bit.WAKEEN = (1<<5);
PMURTC->RTC_WAKECFG_bit.DIS5 = 0x03; //эти биты будут скопированы в PMURTC_RTC_CFG1_REGDIS
//при событии WAKEUP[5]
while (1) ;
}VCC1 = 3,3В, Напряжение батареи CR2032 3,15..3,10В в зависимости от нагрузки. На вход VBAT напряжение поступает через диоды от батареи и VCC1.
Строка
Код: Выделить всё
PMURTC->RTC_WAKECFG_bit.WAKEEN = (1<<5);Чего я делаю не так?
Re: К1921ВГ015 RTC + CR2032
Так и не получилось заставить срабатывать событие WKUP[5] (при условии V_BAT>VCC1)

Но вот интересный момент. В РП написано:
А не переключается!
При этом VCC1=3,293В, VAON_CAP=3,287В. И событие WKUP[5] (при условии V_BAT=3,6В > VCC1=3,29В) не происходит!
Возвращаю напряжение V_BAT к примерно 3.15В, выключаю основное питание: Переключение обратно происходит примерно при разнице 0,6В (желтый - VAON_CAP, синий V_BAT).
Событие WKUP[5] не ловится
Но вот интересный момент. В РП написано:
Медленно поднимаю напряжение V_BAT до 3,6В (VCC1=3.3В). Ожидал, что в какой-то момент VAON_CAP переключится обратно на батарею.При включении микроконтроллера контроллер APC переключает внутреннее питание
VAON на вход батарейного питания V_BAT. При наличии на выводе VCC1(№ 12)
напряжения, превышающего V_BAT, контроллер APC переключает внутреннее питание
VAON на вход питания VCC1(№ 12).
А не переключается!
При этом VCC1=3,293В, VAON_CAP=3,287В. И событие WKUP[5] (при условии V_BAT=3,6В > VCC1=3,29В) не происходит!
Возвращаю напряжение V_BAT к примерно 3.15В, выключаю основное питание: Переключение обратно происходит примерно при разнице 0,6В (желтый - VAON_CAP, синий V_BAT).
Событие WKUP[5] не ловится
Re: К1921ВГ015 RTC + CR2032
mkf писал(а): ↑04 сен 2026, 13:48 Попытка использовать часы реального времени встроенные в К1921ВГ015 с часовой батарейкой CR2032. Но схема питания часов у К1921ВГ015 такова, что от VBAT питается еще много чего более прожорливого, чем просто модуль часов. И процессор при отключении основного питания не выключается, а автоматически переключается на батарею. Теперь нужно все выключить, что подключено к батарейке и перевести процессор в режим POWER_OFF. Из POWER_OFF его может вывести только прерывание.
В основной программе делаем примерно следущее:в обработчике прерывания от часов:Код: Выделить всё
;;; //настроить вектор обработчика прерываний 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]Ожидаем прерывания только от RTC, так как другие источники будут физически будут отключены от питания.Код: Выделить всё
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: Ответ "поставить отдельные часы" я знаюСобственно к этому и склонялся, но решил убедиться в обоснованности.
Добрый день.
1) Для корректной обработки события WAKEUP[5] необходимо обработку прерывания RTC делать как можно короче, чтобы не пропустить новые события модуля RTC.
2) Повторная подача питания после его понижения возможна только на полностью обесточенный (до напряжения 0В) микроконтроллер. В этом случае будет обеспечен корректный запуск.
Re: К1921ВГ015 RTC + CR2032
Доброго дня!
А я то как раз пытаюсь пока без прерываний разобраться. С прерываниями еще более не прозрачно - вариантов чтобы не заработало очень много.
Пошел от простого (без прерываний):
Меня привлекло описание регистра PMURTC->RTC_WAKECFG_bit.DIS5, см описание регистров в РП:
Когда прямо записываю RTC_CFG1.REGDIS = 0x03 - сразу отключается LDO0, LDO1, HSE - что мне и требуется.Значение будет скопировано в RTC_CFG1.REGDIS при
возникновении события WKUP[5]
Теперь пытаюсь заставить процессор записать RTC_CFG1.REGDIS = 0x03 самостоятельно. Короткий код (чтобы уж точно исключить все):
Код: Выделить всё
int main(void)
{
PMURTC->RTC_CFG1 |= PMURTC_RTC_CFG1_REGEN_Msk; //разрешаем работу LDO0, LDO1 без сигнала тревоги
PMURTC->RTC_CFG1 |= PMURTC_RTC_CFG1_ALARMRST_Msk; //снимаем сигнал тревоги от будильника
PMURTC->RTC_CFG0_bit.EXTOSC = 1; //внешний резонатор часов
PMURTC->RTC_WAKECFG_bit.WAKEEN = (1<<5);
PMURTC->RTC_WAKECFG_bit.DIS5 = 0x03; //эти биты будут скопированы в PMURTC_RTC_CFG1_REGDIS
//при событии WAKEUP[5]
while (1) ;
}Разбираюсь дальше, не трогая код. В отладчике меняю полярность у WKUP[5] на низкий активный уровень:
PMURTC->RTC_WAKECFG_bit.WAKEPOL = (1<<5);
Тут же отключаются LDO0, LDO1, HSE! Часы тикают (видно осциллографом на часовом кварце). Естественно, в отладчике ничего уже не могу посмотреть.
Но факт установлен - автоматическое копирование битов в RTC_CFG1.REGDIS работает! Что нам и надо!
Теперь пытаюсь выяснить, почему при изменении соотношения V_BAT и VCC1 не срабатывает событие WKUP[5], хотя при изменении активной полярности оно только что срабатывало. То есть логика автоматического копирования битов работает! Не работает само событие. Здесь пока тупик. Насколько могу понять, WKUP[5] при небольшой разнице напряжений не работает, либо условия какие-то более сложные, чем просто больше/меньше.
С прерываниями настолько все мутно получается... Вектор всего один, а прерываний у PLIC аж 31 шт (и событий у каждого -нцать). И любое может выполняться. И по умолчанию одно прерывание другим (даже с высшим приоритетом) не прерывается. А судя по описанию регистров процессора, таки предусмотрен автоматический переход в POWEROFF без участия ядра. Если удастся его реализовать, то победа!
Включение, надеюсь, будет попроще.
Re: К1921ВГ015 RTC + CR2032
Промежуточный результат изысканий по определению порогов переключения:
Напряжение на выводе V_BAT(14) всегда больше напряжения питания VCC1(12) на 0,55В..0,71В.
Изменение напряжения на V_BAT (70 мВ) связано в основном с тем, что этот вывод подключен к источнику через диод (вместо батареи подключен источник питания), поэтому при снятии нагрузки напряжение поднимается.
Гистерезис переключения оценивается как 0,16В (если бы напряжение V_BAT оставалось постоянным).
Событие WKUP[5] возникает и исчезает в соответствии с переключением VAON.
Получается условие для исчезновения WKUP[5]: (VBAT+0,55В)<VCC1
Условие для возникновения WKUP[5]: (VBAT+0,71В)>VCC1
Изменение напряжения на V_BAT (70 мВ) связано в основном с тем, что этот вывод подключен к источнику через диод (вместо батареи подключен источник питания), поэтому при снятии нагрузки напряжение поднимается.
Гистерезис переключения оценивается как 0,16В (если бы напряжение V_BAT оставалось постоянным).
Событие WKUP[5] возникает и исчезает в соответствии с переключением VAON.
Получается условие для исчезновения WKUP[5]: (VBAT+0,55В)<VCC1
Условие для возникновения WKUP[5]: (VBAT+0,71В)>VCC1
Re: К1921ВГ015 RTC + CR2032
Отсюда следует, что если не нужна батарея, то вывод V_BAT(14) можно смело подключать к VCC1(12), не боясь ложных переключений.
Re: К1921ВГ015 RTC + CR2032
почти на грани понимания..... если - "этот вывод подключен к источнику через диод (вместо батареи подключен источник питания)", - то зачем его вообще куда то подключать дополнительно?
