STM32F051 HAL_RTC_SetDate 没有正确设置年份

STM32F051 HAL_RTC_SetDate not setting Year correctly

所以我正在使用智能 phone 应用程序来设置微控制器上 RTC 的 TimeDate。 RTC 在 LSE 上运行。

我发送给微控制器的字符串格式正确。当我在 "Watch 1" 上设置相关变量时,我可以确定这一点。我正在使用 Keil uVision 5.

/** 
  * @brief  RTC Date structure definition  
  */
typedef struct
{
  uint8_t WeekDay;  /*!< Specifies the RTC Date WeekDay.
                         This parameter can be a value of @ref RTC_WeekDay_Definitions */

  uint8_t Month;    /*!< Specifies the RTC Date Month (in BCD format).
                         This parameter can be a value of @ref RTC_Month_Date_Definitions */

  uint8_t Date;     /*!< Specifies the RTC Date.
                         This parameter must be a number between Min_Data = 1 and Max_Data = 31 */

  uint8_t Year;     /*!< Specifies the RTC Date Year.
                         This parameter must be a number between Min_Data = 0 and Max_Data = 99 */

}RTC_DateTypeDef;

所以我发送的命令实际上设置了 DD/MM/YY,当然还有时间,但我没有时间问题。

设置后调用HAL_RTC_GetDateHAL_RTC_GetTime,除了Year字段外,其他都正确

我发送的命令将始终是 2018 年,但是 HAL_RTC_GetTime 函数将始终 return 一个更高的随机值,例如 24、22、21 和 19。偶尔,发送后多次执行相同的命令但分秒不同,年份将回到 18...

可能是什么问题?另外,我是否必须设置 WeekDay 参数,因为我只设置了 DayMonthYear.

谢谢!

*我有一个功能可以帮助我获取我发送过来的 2018 年的最后两位数字,并将值 18 推送到微控制器。

查看结构的定义。 年份仅为 uint8_t,因此最大值为 255。 如果您阅读定义后面的注释,年份被限制在 0 到 99 之间。

最棒的是只写 18 而不是 2018 到你的 RTC。

所以我决定先通过硬编码来尝试设置 WeekDay 参数。因此,我向微控制器发送了完全相同的命令,即以 DD/MM/YY 格式设置 Date 和带日期的时间,到目前为止,我的回读值是正确的。我遵循了 A.Rech 给出的 link:

即使用相同的 DD/MM/YY 重复发送相同的命令但时间不同,我从 HAL_RTC_GetDate() 读回的值到目前为止也是正确的!我希望情况会如此,而不仅仅是巧合。

谢谢!

*补充一下。在对 WeekDay 参数进行硬编码之前。每当我多次将带有 DD/MM/YY 的命令发送到微控制器时,设置不同的时间值,而 DD/MM/YY 相同。 WeekDay 参数的回读值将是一个随机数,在我的例子中是一个不超过 7 的数字。

我遇到了同样的问题。我发现问题不在于设置 WeekDay(在创建结构 RTC_DateTypeDef 时,字段 WeekDay 获取随机值)。 WeekDay 必须设置为 0 到 7 之间的值。

请参阅我对类似问题的完整回答及解释: