HAL_SetDate устанавливает год в неправильное значение
Я использую STM32F030RCT6 с CubeMX. Устройство - это регистратор данных, и RTC - главная мысль, которая не может выйти из строя. На листах ошибок есть что-то о RTC Shadow Register.
Я настроил CubeMX, чтобы он не генерировал функцию MX_RTC_Init(), и до сих пор он работал нормально. (Я использую LSE)
Мне нужно обновить время / дату от времени GSM, но когда я установил год на 18 с помощью HAL_SetDate() и после небольшой задержки я прочитал с помощью HAL_GetDate() и sDate. Год дал мне 20. Помимо года другие значения верны.
Что я пробовал:
- LSI б
- while(SetDate!=GetDate) SetDate(ActualDate)
- Сначала SetTime, затем SetDate
У меня нет прогресса и даже ухудшается, как месяц = 56, день = 45 и т. Д.
Заранее спасибо. С наилучшими пожеланиями.
2 ответа
У меня такая же проблема. Я обнаружил, что проблема не в установке WeekDay (при создании struct RTC_DateTypeDef поле WeekDay получает случайное значение). Значение WeekDay должно быть установлено в диапазоне от 0 до 7.
Объяснение: Код для установки даты в функции HAL_RTC_SetDate:
if (Format == RTC_FORMAT_BIN)
{
assert_param(IS_RTC_YEAR(sDate->Year));
assert_param(IS_RTC_MONTH(sDate->Month));
assert_param(IS_RTC_DATE(sDate->Date));
datetmpreg = (((uint32_t)RTC_ByteToBcd2(sDate->Year) << 16U) | \
((uint32_t)RTC_ByteToBcd2(sDate->Month) << 8U) | \
((uint32_t)RTC_ByteToBcd2(sDate->Date)) | \
((uint32_t)sDate->WeekDay << 13U));
}
else
{
assert_param(IS_RTC_YEAR(RTC_Bcd2ToByte(sDate->Year)));
assert_param(IS_RTC_MONTH(RTC_Bcd2ToByte(sDate->Month)));
assert_param(IS_RTC_DATE(RTC_Bcd2ToByte(sDate->Date)));
datetmpreg = ((((uint32_t)sDate->Year) << 16U) | \
(((uint32_t)sDate->Month) << 8U) | \
((uint32_t)sDate->Date) | \
(((uint32_t)sDate->WeekDay) << 13U));
}
- Дата занимает биты 0-7: две цифры BCD.
- Месяц занимает биты 8-12: две цифры BCD, но левой цифры может быть только 0 или 1 - 5 битов достаточно.
- WeekDay занимает биты 13-15. достаточно одной цифры BCD от 1 до 7 - 3 бита.
- Год занимает биты 16-24.
Когда WeekDay больше 7, он перекрывается с битами года и может изменить его.
У меня была точно такая же проблема с установкой значения года после использования HAL_SetDate()
, Неправильные значения были прочитаны с Hal_GetDate()
функция.
MX_RTC_Init()
сначала проверяет определенное значение в регистре RTC BKP, чтобы узнать, произошел ли сброс в домене RTC. Он не позволяет снова установить время и дату, если это уже было сделано.
Я, наконец, сделал то же самое, и в первый раз tadaaaam я читаю хорошее значение года 18!
if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR10) != 0x32F2){ // Mandatory: workaround found ?
if(HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) == HAL_OK){
if(HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) == HAL_OK){
HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR10, 0x32F2);
}
}
}
Я не понимаю точно, почему это работает, я спрошу на форуме ST и отредактирую этот ответ, как только я знаю.
А пока можешь проверить, работает ли он и у тебя?