4

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

我将CubeMX配置为不生成MX_RTC_Init()函数,目前运行正常。(我正在使用伦敦政治经济学院)

我需要从 GSM 时间更新时间/日期,但是当我将年份设置为18HAL_SetDate(),我读了一小段时间后HAL_GetDate()sDate.Year给了我20。除了Year,其他值都是正确的。

我尝试了什么:

  • 二手 LSI
  • 而 (HAL_SetDate != HAL_GetDate) HAL_SetDate(ActualDate)
  • HAL_GetDate然后HAL_SetDate

我没有进步,事情甚至变得更糟,比如Month= 56,Day= 45等。

提前致谢。最好的祝福。

4

3 回答 3

7

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

我有同样的问题。我发现问题是:没有将值设置为WeekDay. 在函数范围内创建结构RTC_DateTypeDef时,该字段WeekDay将获得一个随机值。我发现:该值WeekDay必须设置为 0 到 7 之间的值,如果超出此范围,则可以更改 year

解释:

在函数中设置日期的代码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占用位 8-12(5 位):两个 BCD 位但左位只能是 0 或 1 -> 5 位就足够了。
  • WeekDay占用位 13-15(3 位):一个 BCD 位,取值范围为 1-7 -> 3 位就足够了。
  • Year占用 16-24 位(9 位)。

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

于 2019-01-17T13:03:54.320 回答
0

在使用HAL_SetDate(). 使用该函数读取了错误的值Hal_GetDate()

MX_RTC_Init()首先检查 RTC BKP 寄存器中的特定值,以了解 RTC 域上是否发生了复位。如果已经完成,它可以防止再次设置时间和日期。

我终于做了同样的事情,我第一次读到 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 论坛上提问并在我知道后尽快编辑这个答案。

同时你能检查一下它是否也适合你吗?

于 2018-04-20T06:35:52.173 回答
0

将您的WeekDay参数设置为有效值。

于 2018-08-09T19:34:07.517 回答