STM32F051 HAL_RTC_SetDate 没有正确设置年份
STM32F051 HAL_RTC_SetDate not setting Year correctly
所以我正在使用智能 phone 应用程序来设置微控制器上 RTC 的 Time
和 Date
。 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_GetDate
和HAL_RTC_GetTime
,除了Year
字段外,其他都正确
我发送的命令将始终是 2018 年,但是 HAL_RTC_GetTime
函数将始终 return 一个更高的随机值,例如 24、22、21 和 19。偶尔,发送后多次执行相同的命令但分秒不同,年份将回到 18...
可能是什么问题?另外,我是否必须设置 WeekDay
参数,因为我只设置了 Day
、Month
和 Year
.
谢谢!
*我有一个功能可以帮助我获取我发送过来的 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 之间的值。
请参阅我对类似问题的完整回答及解释:
所以我正在使用智能 phone 应用程序来设置微控制器上 RTC 的 Time
和 Date
。 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_GetDate
和HAL_RTC_GetTime
,除了Year
字段外,其他都正确
我发送的命令将始终是 2018 年,但是 HAL_RTC_GetTime
函数将始终 return 一个更高的随机值,例如 24、22、21 和 19。偶尔,发送后多次执行相同的命令但分秒不同,年份将回到 18...
可能是什么问题?另外,我是否必须设置 WeekDay
参数,因为我只设置了 Day
、Month
和 Year
.
谢谢!
*我有一个功能可以帮助我获取我发送过来的 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 之间的值。
请参阅我对类似问题的完整回答及解释: