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 и отредактирую этот ответ, как только я знаю.

А пока можешь проверить, работает ли он и у тебя?

Установите для параметра WeekDay правильное значение

Другие вопросы по тегам