我正在使用STM32F030RCT6和CubeMX。设备是数据记录器,RTC是主要认为不能失败的。在Errata Sheet上有一些关于RTC影子注册的内容。
我将CubeMX配置为不生成MX_RTC_Init()函数,并且到目前为止它一直正常工作。 (我正在使用LSE)
我需要从GSM时间更新时间/日期,但是当我使用HAL_SetDate()将年份设置为 18 时,在稍微延迟之后我会使用HAL_GetDate()和sDate读取。一年给了我 20 。除了年份,其他值是正确的。
我尝试了什么:
我没有进步,甚至变得更糟,如月= 56,日= 45等。
提前致谢。 最好的问候。
答案 0 :(得分:1)
我有同样的问题。我发现问题不是设置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));
}
当WeekDay大于7时,它与Year的位重叠并可以更改。
答案 1 :(得分:0)
在使用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论坛上询问并尽快编辑这个答案。
在此期间你能检查一下它是否适合你?
答案 2 :(得分:-1)
将WeekDay参数设置为有效值