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

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

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

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


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

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

 

 

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

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


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

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

 

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

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


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

… До этого делал 2 проекта с часами, но не на HAL, все работало.

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

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


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

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

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


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

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

 

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

 

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

 

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

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


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

Повторяю, все гладко работает, пока не выключишь питание, биты в регистрах посмотрел, все похоже на правду. Такое впечатление, что 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." какой-то из ваших случаев.

Напряжение от исправной (да-да проверили) батарейки до вывода доходит?

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


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

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

 

 

"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 при определенных условиях, но батарейка под них вроде не попадает.

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


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

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

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

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


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

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

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

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


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

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

99% так и есть.

 

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

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


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

99% так и есть.

 

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

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

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


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

странно.

У меня стандартная инициализация HAL-ом STM32L476.

Если есть батарейка - ничего не теряется.

Хотя год назад в старой версии STM32Cube_FW_L4 было такое - при инициализации RTC они сбрасывали все часы в нуль.

Приходилось вручную поправлять (комментировать это место). Но потом и они поправили.

 

Вот как было:

 

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] - для короткого!

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


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

странно.

У меня стандартная инициализация 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();

}

 

}

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...