К1921ВГ015 RTC + CR2032

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

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

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

Re: К1921ВГ015 RTC + CR2032

Сообщение mkf »

Готовый рецепт для тех, у кого проблемы с запуском генератора и не требуется микропотребления в режиме POWER_OFF:
Поставить резистор 2 МОм между выводом XI_OSC и GND (параллельно конденсатору). Резистор между XI_OSC и XO_OSC по мануалу - 1 МОм.
Получаем при питании 3,3В смещение по постоянному току как при питании 2,2В. Старт кварца стабильный:
Старт с резисторами 2М и 1М.jpg
Старт с резисторами 2М и 1М.jpg (80.34 КБ) 1073 просмотра
А с батарейным питанием - alles kaputt - ставим внешние часы.
mkf
Сообщения: 39
Зарегистрирован: 14 апр 2025, 11:31
Предприятие: AO TEMZ

Re: К1921ВГ015 RTC + CR2032

Сообщение mkf »

Можно и в такой ситуации выкрутиться (транзистор с низким пороговым напряжением, типа АО3416 - как ERRATA):
OSC_LP.jpg
OSC_LP.jpg (17.95 КБ) 887 просмотров
Резистор при выключении LDO0 будет также отключаться и не будет тянуть питание батареи на себя. Для 2 МОм и батарейки 3В - это дополнительные 1,5 мкА. Может и не много, но встроенные часы жрут от часовой батарейки чуть меньше 4 мкА, вместе с подтяжкой будет 5,5 мкА. Транзистор же позволит сохранить потребление на на прежнем уровне. С другой стороны внешние часы потребляют порядка 0,5 мкА.
В общем, это для истинных любителей искусства, т.к. количество костылей по занимаемой площади на плате уже сильно превышает размер внешних часов. И самое, что может быть критично, - все костыли вокруг цепей, которые нежелательно слишком вольно по плате растаскивать
mkf
Сообщения: 39
Зарегистрирован: 14 апр 2025, 11:31
Предприятие: AO TEMZ

Re: К1921ВГ015 RTC + CR2032

Сообщение mkf »

mkf писал(а): ↑15 сен 2026, 05:03 Для 2 МОм и батарейки 3В - это дополнительные 1,5 мкА.
Похоже, что немного ошибся - ток от дополнительного резистора будет 1 мкА. К выходу подключено ведь суммарное сопротивление 1МОм +2 МОм. 500 нА сэкономили :lol: Ради оставшегося 1 мкА может и не стоит транзистор ставить :lol:
mkf
Сообщения: 39
Зарегистрирован: 14 апр 2025, 11:31
Предприятие: AO TEMZ

Re: К1921ВГ015 RTC + CR2032

Сообщение mkf »

Не дает покоя идея заставить честно работать встроенные часы с батарейкой :lol:
В регистре RTC_WAKECFG есть биты DIS5 (15..14). Про них в РП буквально сказано:
Значение будет скопировано в RTC_CFG1.REGDIS при возникновении события WKUP[5]
Про RTC_CFG1.REGDIS сказано:
Когда бит REGDIS[k] установлен, регулятор k останется выключен даже при активном сигнале тревоги
Когда делаю так

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

PMURTC->RTC_CFG1 |= PMURTC_RTC_CFG1_REGDIS_Msk;
отключаются LDO0 и LDO1, а также основной кварцевый генератор HSE. Вроде как правильно.

Но когда делаю так:

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

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) ;
}
LDO0 отключается только на 5й..10й раз раз отключения основного питания, в других случаях LDO0 и HSE остается включенным и батарейка проедается значительно бОльшим током.
VCC1 = 3,3В, Напряжение батареи CR2032 3,15..3,10В в зависимости от нагрузки. На вход VBAT напряжение поступает через диоды от батареи и VCC1.
Строка

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

PMURTC->RTC_WAKECFG_bit.WAKEEN = (1<<5);
ни на что не влияет, судя по описанию и не должна, поведение с ней и без нее одинаково.

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

Re: К1921ВГ015 RTC + CR2032

Сообщение mkf »

Так и не получилось заставить срабатывать событие WKUP[5] (при условии V_BAT>VCC1)
Изображение
Но вот интересный момент. В РП написано:
При включении микроконтроллера контроллер APC переключает внутреннее питание
VAON на вход батарейного питания V_BAT. При наличии на выводе VCC1(№ 12)
напряжения, превышающего V_BAT, контроллер APC переключает внутреннее питание
VAON на вход питания VCC1(№ 12).
Медленно поднимаю напряжение V_BAT до 3,6В (VCC1=3.3В). Ожидал, что в какой-то момент VAON_CAP переключится обратно на батарею.
А не переключается!
При этом VCC1=3,293В, VAON_CAP=3,287В. И событие WKUP[5] (при условии V_BAT=3,6В > VCC1=3,29В) не происходит!
Возвращаю напряжение V_BAT к примерно 3.15В, выключаю основное питание:
Переключение VCC1-V_BAT.jpg
Переключение VCC1-V_BAT.jpg (51.49 КБ) 638 просмотров
Переключение обратно происходит примерно при разнице 0,6В (желтый - VAON_CAP, синий V_BAT).
Событие WKUP[5] не ловится :(
ea
Администратор
Сообщения: 137
Зарегистрирован: 10 окт 2014, 09:08

Re: К1921ВГ015 RTC + CR2032

Сообщение ea »

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]
в обработчике прерывания от часов:

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

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: Собственно к этому и склонялся, но решил убедиться в обоснованности.

Добрый день.
1) Для корректной обработки события WAKEUP[5] необходимо обработку прерывания RTC делать как можно короче, чтобы не пропустить новые события модуля RTC.
2) Повторная подача питания после его понижения возможна только на полностью обесточенный (до напряжения 0В) микроконтроллер. В этом случае будет обеспечен корректный запуск.
mkf
Сообщения: 39
Зарегистрирован: 14 апр 2025, 11:31
Предприятие: AO TEMZ

Re: К1921ВГ015 RTC + CR2032

Сообщение mkf »

ea писал(а): ↑21 сен 2026, 16:13 Добрый день.
1) Для корректной обработки события WAKEUP[5] необходимо обработку прерывания RTC делать как можно короче, чтобы не пропустить новые события модуля RTC.
Доброго дня!
А я то как раз пытаюсь пока без прерываний разобраться. С прерываниями еще более не прозрачно - вариантов чтобы не заработало очень много.

Пошел от простого (без прерываний):
Меня привлекло описание регистра PMURTC->RTC_WAKECFG_bit.DIS5, см описание регистров в РП:
Значение будет скопировано в RTC_CFG1.REGDIS при
возникновении события WKUP[5]
Когда прямо записываю RTC_CFG1.REGDIS = 0x03 - сразу отключается LDO0, LDO1, HSE - что мне и требуется.
Теперь пытаюсь заставить процессор записать 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) ;
}
Команды выполняются и, виснем в вечном цикле. Больше ничего в программе нет. С этим кодом иногда таки выключатся LDO0, LDO1, HSE, но чаще LDO0, HSE - остаются включенными и продолжают работать от батареи.
Разбираюсь дальше, не трогая код. В отладчике меняю полярность у 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 без участия ядра. Если удастся его реализовать, то победа!
ea писал(а): ↑21 сен 2026, 16:13 2) Повторная подача питания после его понижения возможна только на полностью обесточенный (до напряжения 0В) микроконтроллер. В этом случае будет обеспечен корректный запуск.
Включение, надеюсь, будет попроще.
mkf
Сообщения: 39
Зарегистрирован: 14 апр 2025, 11:31
Предприятие: AO TEMZ

Re: К1921ВГ015 RTC + CR2032

Сообщение mkf »

Промежуточный результат изысканий по определению порогов переключения:
Переключение VAON.png
Переключение VAON.png (9.32 КБ) 550 просмотров
Напряжение на выводе 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
mkf
Сообщения: 39
Зарегистрирован: 14 апр 2025, 11:31
Предприятие: AO TEMZ

Re: К1921ВГ015 RTC + CR2032

Сообщение mkf »

Отсюда следует, что если не нужна батарея, то вывод V_BAT(14) можно смело подключать к VCC1(12), не боясь ложных переключений.
Мерседес
Сообщения: 42
Зарегистрирован: 05 авг 2026, 12:53
Предприятие: Каскад

Re: К1921ВГ015 RTC + CR2032

Сообщение Мерседес »

mkf писал(а): ↑23 сен 2026, 07:35 Отсюда следует, что если не нужна батарея, то вывод V_BAT(14) можно смело подключать к VCC1(12), не боясь ложных переключений.
почти на грани понимания..... если - "этот вывод подключен к источнику через диод (вместо батареи подключен источник питания)", - то зачем его вообще куда то подключать дополнительно?
Ответить

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