HAL_SetDate 将年份设置为错误的值

HAL_SetDate sets the year to wrong value

我将 STM32F030RCT6 与 CubeMX 一起使用。设备是一个数据记录器,RTC 是不能失败的主要部分。在 Errata Sheet 上有一些关于 RTC 影子寄存器的内容。

我将CubeMX设置为不生成MX_RTC_Init()功能,目前运行正常。 (我正在使用 LSE)

我需要从 GSM 时间更新 time/date,但是当我使用 HAL_SetDate() 将年份设置为 18 并在短暂的延迟后我阅读了HAL_GetDate()sDate.Year给了我20。除了Year外,其他值都是正确的。

我尝试了什么:

我没有任何进展,事情甚至变得更糟,例如 Month = 56,Day = 45 等

提前致谢。 最好的问候。

我在使用 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 参数设置为有效值。

WeekDay 必须设置为 0 到 7 之间的值

我遇到了同样的问题。我发现问题是:未将值设置为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));
}
  • Date占用0-7位(8位):两位BCD码。
  • Month占用bits 8-12(5位):两个BCD码但左边的数位可以 只有 0 或 1 -> 5 位就足够了。
  • WeekDay占用bits 13-15(3 bits):一个BCD数字,取值范围1-7 -> 3 bits 够了
  • Year占用16-24位(9位)。

WeekDay大于7时,MSB为1,与Year的LSB重叠,可以改变(如果LSB为0)。