К1921ВГ015 RTC + CR2032

32-разрядные микроконтроллеры разработки АО "НИИЭТ"

Модераторы: ea, dav, bkolbov, Alis, pip, _sva_

mkf
Сообщения: 39
Зарегистрирован: 14 апр 2025, 11:31
Предприятие: AO TEMZ

К1921ВГ015 RTC + CR2032

Сообщение mkf »

Попытка использовать часы реального времени встроенные в К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]
в обработчике прерывания от часов:

Код: Выделить всё

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.
	}
Ожидаем прерывания только от RTC, так как другие источники будут физически будут отключены от питания.
Но могут сработать любые прерывания, пока ядро не отключилось (22 мкФ на VCORE_CAP - выход LDO1), и вывести процессор из режима WFI. По крайней мере, так описывает логику работу ядра документация на RISC-V.
То есть можно получить ситуацию, когда с одновременным (или почти одновременным) падением VCC1 возникнет одно из других разрешенных прерываний. Процессор успеет перейти в режим WFI и выйти из него, питание окончательно провалится, ядро отключится. Процессор уже не не в POWER_OFF. В итоге LDO0 будет кушать батарею без внешнего питания значительно быстрее, чем одни часы.

Задача собственно прописать алгоритм, который гарантированно не позволит завесить процессор или досрочно убить батарею.
"Если неприятность может случиться - она обязательно случится".
Экспериментально проверку трудно осуществить, так как даже если событие будет возникать очень редко на одном устройстве, то на многих - уже будет не редко. Проверить это в отладчике - не представляю как.

Покритикуйте, если я где-то ошибаюсь в рассуждениях. Или может кто уже разбирался и знает правильный ответ.
PS: Ответ "поставить отдельные часы" я знаю :lol: Собственно к этому и склонялся, но решил убедиться в обоснованности.
RabidRabbit
Сообщения: 271
Зарегистрирован: 10 июн 2025, 12:11
Предприятие: HomeWork

Re: К1921ВГ015 RTC + CR2032

Сообщение RabidRabbit »

Могу ошибаться, но если ВГ015 при исполнении *команды" WFI перешёл в режим POWERDOWN|POWEROFF, то вывести его из этого режима может только (согласно РП):
- внешние события WAKEUP;
- событие TIME = ALARM (событие разрешено по умолчанию);
- события монитора вскрытия.
Т.е. если Вы поймали пропадание питание и находитесь в обработчике прерывания с отключенными прерываниями, то никакие другие прерывания больше в процесс влезть не смогут, а после перехода в режим энергосбережения - см выше.

Да, прерывание от чего-то другого может возникнуть чуть раньше, чем прерывание по падению напряжения, но это только повод не делать длительных обработчиков. Флаг поднял, флаг сбросил - и на выход.
mkf
Сообщения: 39
Зарегистрирован: 14 апр 2025, 11:31
Предприятие: AO TEMZ

Re: К1921ВГ015 RTC + CR2032

Сообщение mkf »

С прерываниями подолгу занимающими процессорное время к стати да, тоже могут быть проблемы. Тоже надо учесть.
Потому как перенастройку полярности WAKEUP[5] для пробуждения кто-то должен сделать. А сделать это может только процессорное ядро.
Ядро, которое питается никак не от батареи, а от конденсатора VCORE_CAP через LDO1 (сейчас думаю - зачем LDO1 в настройках отключать, если оно к батарейному питанию не имеет отношения).
Рис_5_1.jpg
Рис_5_1.jpg (65.36 КБ) 1000 просмотров
Питание ядра может провалиться раньше, чем активируется обработчик прерывания RTC с перенастройкой полярности WAKEUP[5] и командой WFI. А если при падении питания уже активен обработчик RTC и занят, например, обработкой других событий WAKEUP[0..4] :shock:
Тут еще и обращение к регистрам RTC не менее 1 мкс...
Практически это маловероятно, если не будет случайных замыканий цепи питания VCC1, когда питание просаживается мгновенно.
Но возможность такая есть - ядро отключится и не включится пока батарея не разрядится. А это очень плохо :(
Возможно это мы и ловили при отладке/перепрошивке - питание включалось/выключалось, обработчик IrqRTC еще был закомментарен, иногда приходилось перемыкать цепь V_BAT и GND, чтобы привести процессор в чувства (RESET по включению питания). Ножка RESET ведь перестает работать.
Горе с этими часами :cry: Уж лучше бы домен батарейного питания переключался на V_BAT не автоматически, а вручную (по крайней мере с разрешения). А часы бы жили бы всегда на батарее.
mkf
Сообщения: 39
Зарегистрирован: 14 апр 2025, 11:31
Предприятие: AO TEMZ

Re: К1921ВГ015 RTC + CR2032

Сообщение mkf »

Предварительно решение такое получилось:
1) Настраиваем пробуждение по сигналу WKUP[0], подключенному к монитору питания (вместо ~RESETа, который не будет работать с батарейкой).
2) Настраиваем отключение всего (POWER_OFF) при выполнении команды WFI. (именно в таком порядке)

В прерывании RTC проверяем RTC_HISTORY на предмет фактических активных состояний (см п.9 ERRATA)
- Если сигнал WKUP[5] активен - выполняем WFI (уходим в режим POWER_OFF);
- Если нужно, то проверяем другие сигналы модуля RTC, ставим флаги и выходим из прерывания.

В этом случае никакие полярности сигналов WAKEPOL [0..5] не меняем в процессе работы. Соответственно нет шансов не проснуться при любых колебаниях напряжений VBAT и VCC. При наличии основного питания пробуждение будет всегда.
Остается шанс провалиться по питанию ядра при падении VCC, если прерывание RTC с командой WFI вызовется слишком поздно (например, будет активен другой обработчик, а вложенные прерывания по умолчанию не разрешены) - получим досрочно разряженную батарею при отключенном основном питании. Достоверно не известно, поднимется ли из этого режима процессор при подаче основного питания с условно рабочей батареей (LDO0 останется работать, а LDO1 с ядром отключится и потом включится).

Собственно из этой проблемы вытекает другой вариант решения:
1) Настраиваем пробуждение по сигналу WKUP[0], подключенному к монитору питания (вместо ~RESETа, который не будет работать с батарейкой).
2) Настраиваем полярность WKUP[1] на низкий уровень (от тоже будет подключен к монитору питания параллельно WKUP[0])
3) Настраиваем отключение всего (POWER_OFF) при выполнении команды WFI. (именно в таком порядке)

В прерывании RTC проверяем RTC_HISTORY на предмет фактических активных состояний (см п.9 ERRATA)
- Если сигнал WKUP[1] низкий - выполняем WFI (уходим в режим POWER_OFF);
- Если нужно, то проверяем другие сигналы модуля RTC, ставим флаги и выходим из прерывания.

Тут, вроде бы, более надежно - монитор питания значительно раньше отсигналит о падении основного питания.
Что будет при медленно умирающей батареей при отсутствии основного питания надо проверять.
Про пороги срабатывания "ультранизкопотребляющего POR" нигде не нашел информации.
mkf
Сообщения: 39
Зарегистрирован: 14 апр 2025, 11:31
Предприятие: AO TEMZ

Re: К1921ВГ015 RTC + CR2032

Сообщение mkf »

Что-то я прошляпил самое интересное:
RTC_WAKECFG – регистр настройки пробуждения RTC, биты 17-16 RST5 - "Принудительный сброс домена питания LDO1, LDO0 при
возникновении события WKUP[5] (превышение напряжения V_BAT относительно VCC1)"
Это считается режимом POWER_OFF? Штатный вывод RESET все равно не будет работать, т.к. питается от LDO0.
Аналоговые компараторы и их ЦАП правда останутся включенными. Их можно отключить принудительно заранее, если они не используются
mkf
Сообщения: 39
Зарегистрирован: 14 апр 2025, 11:31
Предприятие: AO TEMZ

Re: К1921ВГ015 RTC + CR2032

Сообщение mkf »

mkf писал(а): ↑08 сен 2026, 14:53 1) Настраиваем пробуждение по сигналу WKUP[0], подключенному к монитору питания (вместо ~RESETа, который не будет работать с батарейкой).
Тут не учел, что прерывания от RTC не маскируемые. Сигнал WKUP[0] будет после пробуждения всегда вызывать прерывания RTC. Чтобы избежать вызовов прерывания, вывод WKUP[0] нужно, например, через MOSFET притягивать к GND после пробуждения (затвор MOSFETа зацепить к питанию ядра (VCORE_CAP). Или можно воспользоваться свободным GPIO если такие остались. После появления основного питания WKUP[0] поднимается, процессор пробуждается, далее появляется питание ядра и сигнал WKUP[0] снова становится не активным.
mkf
Сообщения: 39
Зарегистрирован: 14 апр 2025, 11:31
Предприятие: AO TEMZ

Re: К1921ВГ015 RTC + CR2032

Сообщение mkf »

В процессе тестов обнаружили то, на что никогда не обращали внимания:
В режиме POWER_OFF, когда выключились LDO0, LDO1, остановлены HSI, HSE, отключены аналоговые компараторы с его ЦАПом,
на выводах кварца (XO_OSC, XI_OSC) остается напряжение 2.9В, как на выводах VAON_CAP, VBAT (батарея подсевшая уже - 2.9В).
До этого, глядя на рисунок 5.1 руководства считали, что раз блок HSE подключен к домену питания через LDO0 (1.2В), то и напряжение там должно быть как на LDO0.
Потребление от батареи (2,9В) при этом 3,4 мкА (часы тикают). Но при включении основного питания очень долго может не стартовать кварцевый генератор. При этом уже все включилось (LDO0=1.2В и LDO1=1.2В).
Его можно пнуть коснувшись щупом осциллографа или отцепив батарею.
Теперь стало понятно, почему генератор потребляет почти как весь остальной процессор - генератор в отличии от ядра работает на полном напряжении питания.
mkf
Сообщения: 39
Зарегистрирован: 14 апр 2025, 11:31
Предприятие: AO TEMZ

Re: К1921ВГ015 RTC + CR2032

Сообщение mkf »

Похоже, что кварцевый генератор случайно (а может и не случайно) в кристалле посадили на полное напряжение питание, а не на выход LDO0.
К удивлению при падении питания до примерно 1 В, генератор заводится самостоятельно и очень легко в самых отвратительных условиях - один щуп осциллографа на XO_OSC и второй на XI_OSC. Щупы с делителем(10:1) 10 МОм, 22 пФ. Кварц 11.0592МГц, конденсаторы на плате 12пФ.
Тогда как при включении VCC = 3,3В и специальных пинках (7 шт) в таких же условиях с двумя щупами осциллографа (вход и выход) уже не заводится совсем:
Включение с двумя щупами.jpg
Включение с двумя щупами.jpg (87.88 КБ) 891 просмотр
Заводится только с одним щупом на XO_OSC:
Включение с одним щупом.jpg
Включение с одним щупом.jpg (96.24 КБ) 891 просмотр
Включение с одним щупом_2.jpg
Включение с одним щупом_2.jpg (92.33 КБ) 891 просмотр
Последний раз редактировалось mkf 11 сен 2026, 14:14, всего редактировалось 1 раз.
mkf
Сообщения: 39
Зарегистрирован: 14 апр 2025, 11:31
Предприятие: AO TEMZ

Re: К1921ВГ015 RTC + CR2032

Сообщение mkf »

Эта картинка при выключении питания (без батареи - просто тест), когда оно падает:
Выключение питания.jpg
Выключение питания.jpg (84.21 КБ) 890 просмотров
Здесь те же самые два щупа (вход и выход). И заводится сам, без пинков.
Это не часовой кварц. Это основной. При выходе из режима POWER_OFF стартует нестабильно совсем. Вот теперь надо подумать как это проблему решить. Затрудняет то, что в режиме POWER_OFF на выводах XO_OSC и XI_OSC напряжение батареи. А так бы делитель на выходе можно было бы попробовать поставить.
Процессор с кодом на корпусе 2436.
mkf
Сообщения: 39
Зарегистрирован: 14 апр 2025, 11:31
Предприятие: AO TEMZ

Re: К1921ВГ015 RTC + CR2032

Сообщение mkf »

Основной кварц стартует стабильно при напряжении питания процессора VCC=2,2В и ниже. Даже со щупами осциллографа.
На выходе LDO0 (1,2В) ему бы отлично жилось.
Ответить

Вернуться в «32-разрядные микроконтроллеры»