HAL_SetDate将年份设置为错误值

时间:2018-03-13 19:27:12

标签: stm32 rtc hal stm32f0 cubemx

我正在使用STM32F030RCT6和CubeMX。设备是数据记录器,RTC是主要认为不能失败的。在Errata Sheet上有一些关于RTC影子注册的内容。

我将CubeMX配置为不生成MX_RTC_Init()函数,并且到目前为止它一直正常工作。 (我正在使用LSE)

我需要从GSM时间更新时间/日期,但是当我使用HAL_SetDate()将年份设置为 18 时,在稍微延迟之后我会使用HAL_GetDate()和sDate读取。一年给了我 20 。除了年份,其他值是正确的。

我尝试了什么:

  • 使用LSI
  • 而(的setDate!= GETDATE)   的setDate(ActualDate)
  • First SetTime然后SetDate

我没有进步,甚至变得更糟,如月= 56,日= 45等。

提前致谢。 最好的问候。

3 个答案:

答案 0 :(得分:1)

我有同样的问题。我发现问题不是设置WeekDay(在创建结构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位。 1至7-3位的1个BCD数字 够了。
  • 年份占据16-24位。

当WeekDay大于7时,它与Year的位重叠并可以更改。

答案 1 :(得分:0)

在使用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论坛上询问并尽快编辑这个答案。

在此期间你能检查一下它是否适合你?

答案 2 :(得分:-1)

将WeekDay参数设置为有效值