Перейти к содержанию

RTC и BKP регистры STM32F103

День добрый. Так получилось, что в одном проекте связался с HAL. Сделал часы и запись в бэкап регистры. На Vbat установлена батарейка 2032. Пока есть питание - часы идут, бэкап регистры пишутся и читаются. Стоит только выключить основное питание (батарейка к Vbat подключена) и часы, и бэкап регистры обнуляются. До этого делал 2 проекта с часами, но не на HAL, все работало. Никто не сталкивался с похожими сложностями?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(rat @ Nov 22 2017, 12:10) <{POST_SNAPBACK}>
День добрый. Так получилось, что в одном проекте связался с HAL. Сделал часы и запись в бэкап регистры. На Vbat установлена батарейка 2032. Пока есть питание - часы идут, бэкап регистры пишутся и читаются. Стоит только выключить основное питание (батарейка к Vbat подключена) и часы, и бэкап регистры обнуляются. До этого делал 2 проекта с часами, но не на HAL, все работало. Никто не сталкивался с похожими сложностями?



Инит модуля RTC можете показать? Тамперы не включены случаем?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(charkin @ Nov 22 2017, 17:40) <{POST_SNAPBACK}>
Инит модуля RTC можете показать? Тамперы не включены случаем?


Инит стандартный, приду на работу выложу, тампер выключен (бит).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(rat @ Nov 22 2017, 13:10) <{POST_SNAPBACK}>
… До этого делал 2 проекта с часами, но не на HAL, все работало.

Ну а сравнить под отладчиком, что не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Вспомнил, была у меня похожая проблема - последнее, что проверил, это напряжение на батарейке. Оказалось 0,5 В - заменил и все стало хорошо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Obam @ Nov 22 2017, 18:30) <{POST_SNAPBACK}>
Ну а сравнить под отладчиком, что не так?


Повторяю, все гладко работает, пока не выключишь питание, биты в регистрах посмотрел, все похоже на правду. Такое впечатление, что HAL при старте что-то фиксит, либо при выключении питания что-то происходит.

Цитата(charkin @ Nov 22 2017, 18:46) <{POST_SNAPBACK}>
Вспомнил, была у меня похожая проблема - последнее, что проверил, это напряжение на батарейке. Оказалось 0,5 В - заменил и все стало хорошо.


Батарейку проверил в первую очередь, даже пробовал другую.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(rat @ Nov 22 2017, 16:20) <{POST_SNAPBACK}>
Повторяю, все гладко работает, пока не выключишь питание, биты в регистрах посмотрел, все похоже на правду. Такое впечатление, что HAL при старте что-то фиксит, либо при выключении питания что-то происходит.

Подразумевалось, что если без "хала" работает, то различия в регистрах быть должны.

Цитата
Стоит только выключить основное питание (батарейка к Vbat подключена) и часы, и бэкап регистры обнуляются.

"A backup domain reset is generated when one of the following events occurs:
1. Software reset, triggered by setting the BDRST bit in the Backup domain control
register (RCC_BDCR).
2. VDD or VBAT power on, if both supplies have previously been powered off." какой-то из ваших случаев.
Напряжение от исправной (да-да проверили) батарейки до вывода доходит?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Obam @ Nov 22 2017, 19:56) <{POST_SNAPBACK}>
Подразумевалось, что если без "хала" работает, то различия в регистрах быть должны.


"A backup domain reset is generated when one of the following events occurs:
1. Software reset, triggered by setting the BDRST bit in the Backup domain control
register (RCC_BDCR).
2. VDD or VBAT power on, if both supplies have previously been powered off." какой-то из ваших случаев.
Напряжение от исправной (да-да проверили) батарейки до вывода доходит?


За BDCR смотрел в отладчике. На выводе смотрел осциллографом, напряжение доходит. В референс мануале пишут про стронгли рекомендед диод на Vbat при определенных условиях, но батарейка под них вроде не попадает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(rat @ Nov 22 2017, 16:10) <{POST_SNAPBACK}>
Стоит только выключить основное питание (батарейка к Vbat подключена) и часы, и бэкап регистры обнуляются.

Однозначно при включении происходит полная инициализация RTC. А надо 1 раз при первом включении.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(HardEgor @ Nov 22 2017, 20:55) <{POST_SNAPBACK}>
Однозначно при включении происходит полная инициализация RTC. А надо 1 раз при первом включении.

С работы выложу код инициализации, там нет ничего, что может сбрасывать домен бэкапа, к тому же бэкап регистры (в отладчике) обнулены уже при самом старте, еще до функции инициализации RTC.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(HardEgor @ Nov 22 2017, 15:55) <{POST_SNAPBACK}>
Однозначно при включении происходит полная инициализация RTC. А надо 1 раз при первом включении.

99% так и есть.

rat, в эти бекап регистры запишите что-то осознанное при инициализации и при старте проверяйте. Если там мусор - то повторная инициализация.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(alex2103 @ Nov 22 2017, 21:40) <{POST_SNAPBACK}>
99% так и есть.

rat, в эти бекап регистры запишите что-то осознанное при инициализации и при старте проверяйте. Если там мусор - то повторная инициализация.

Записываю осознанное, при старте после выключения питания там всегда только нули.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
странно.
У меня стандартная инициализация HAL-ом STM32L476.
Если есть батарейка - ничего не теряется.
Хотя год назад в старой версии STM32Cube_FW_L4 было такое - при инициализации RTC они сбрасывали все часы в нуль.
Приходилось вручную поправлять (комментировать это место). Но потом и они поправили.

Вот как было:

CODE
void MX_RTC_Init(void)
{
RTC_TimeTypeDef sTime;
RTC_DateTypeDef sDate;

/**Initialize RTC Only
*/
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = 127;
hrtc.Init.SynchPrediv = 255;
hrtc.Init.OutPut = RTC_OUTPUT_WAKEUP;
hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
}

/**Initialize RTC and set the Time and Date
sTime.Hours = 0x0;
sTime.Minutes = 0x0;
sTime.Seconds = 0x0;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}

sDate.WeekDay = RTC_WEEKDAY_MONDAY;
sDate.Month = RTC_MONTH_JANUARY;
sDate.Date = 0x1;
sDate.Year = 0x0;

if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
*/

/**Enable the WakeUp
*/
if (HAL_RTCEx_SetWakeUpTimer(&hrtc, 0, RTC_WAKEUPCLOCK_CK_SPRE_16BITS) != HAL_OK)
{
Error_Handler();
}

}
Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(serglg @ Nov 22 2017, 22:31) <{POST_SNAPBACK}>
странно.
У меня стандартная инициализация HAL-ом STM32L476.
Если есть батарейка - ничего не теряется.
Хотя год назад в старой версии STM32Cube_FW_L4 было такое - при инициализации RTC они сбрасывали все часы в нуль.
Приходилось вручную поправлять (комментировать это место). Но потом и они поправили.


У меня STM32F103, там другие часы, вернее просто счетчик, не как в 4 семействе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Код инициализации

/* RTC init function */
static void MX_RTC_Init(void)
{

/**Initialize RTC Only
*/
hrtc.Instance = RTC;
hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
hrtc.Init.OutPut = RTC_OUTPUTSOURCE_CALIBCLOCK;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
}

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация