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
外,其他值都是正确的。
我尝试了什么:
- 二手LSI
- while (HAL_SetDate != HAL_GetDate) HAL_SetDate(实际日期)
- 先
HAL_GetDate
然后HAL_SetDate
我没有任何进展,事情甚至变得更糟,例如 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)。
我将 STM32F030RCT6 与 CubeMX 一起使用。设备是一个数据记录器,RTC 是不能失败的主要部分。在 Errata Sheet 上有一些关于 RTC 影子寄存器的内容。
我将CubeMX设置为不生成MX_RTC_Init()
功能,目前运行正常。 (我正在使用 LSE)
我需要从 GSM 时间更新 time/date,但是当我使用 HAL_SetDate()
将年份设置为 18 并在短暂的延迟后我阅读了HAL_GetDate()
,sDate.Year
给了我20。除了Year
外,其他值都是正确的。
我尝试了什么:
- 二手LSI
- while (HAL_SetDate != HAL_GetDate) HAL_SetDate(实际日期)
- 先
HAL_GetDate
然后HAL_SetDate
我没有任何进展,事情甚至变得更糟,例如 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)。