Stm32 HAL_SetDate将年份设置为错误值

Stm32 HAL_SetDate将年份设置为错误值,stm32,hal,stm32f0,cubemx,Stm32,Hal,Stm32f0,Cubemx,我将STM32F030RCT6与CubeMX一起使用。设备是一个数据记录器,RTC是不能失败的主要因素。上有关于RTC卷影寄存器的内容 我将CubeMX配置为不生成MX\u RTC\u Init()函数,到目前为止它一直正常工作。(我用的是伦敦证交所) 我需要从GSM时间更新时间/日期,但当我使用HAL_SetDate()将年份设置为18时,经过一小段延迟后,我使用HAL_GetDate()读取数据,sDate.year给了我20。除了年份,其他值都是正确的 我尝试的是: 旧大规模集成电路 w

我将STM32F030RCT6与CubeMX一起使用。设备是一个数据记录器,RTC是不能失败的主要因素。上有关于RTC卷影寄存器的内容

我将CubeMX配置为不生成
MX\u RTC\u Init()
函数,到目前为止它一直正常工作。(我用的是伦敦证交所)

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

我尝试的是:

  • 旧大规模集成电路
  • while(HAL_SetDate!=HAL_GetDate)HAL_SetDate(ActualDate)
  • 首先
    HAL_GetDate
    然后
    HAL_SetDate
我没有进步,事情甚至变得更糟了,比如月=56,
=45等等

提前谢谢。
致以最诚挚的问候。

在使用
HAL\u SetDate()
后,我在设置年份值方面遇到了完全相同的问题。使用
Hal\u GetDate()
函数读取了错误的值

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

我终于也这么做了,Tadaaam第一次读到了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论坛上询问,并在我知道后尽快编辑这个答案


同时,您可以检查它是否也适用于您吗?

将您的
工作日
参数设置为有效值。

工作日
必须设置为0到7之间的值 我也有同样的问题。我发现问题是:没有将值设置为
工作日
。在函数作用域中创建结构时,
RTC_DateTypeDef
字段
WeekDay
获取一个随机值。我发现:
WeekDay
必须设置为0到7之间的值,如果超出此范围,则可以更改年份

说明: 在函数
HAL\u RTC\u 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));
}
if(格式==RTC\u格式\u-BIN)
{
断言参数(是RTC年(sDate->YEAR));
assert_param(是RTC_月(sDate->MONTH));
断言参数(是RTC日期(sDate->DATE));
datetmpreg=((uint32_t)RTC_ByteToBcd2(sDate->Year)Month)Date))\
((uint32_t)sDate->工作日年);
assert_param(是RTC_月(RTC_Bcd2ToByte(sDate->MONTH));
断言参数(是RTC日期(RTC Bcd2ToByte(sDate->DATE));
datetmpreg=(((uint32_t)sDate->年)月)日期)\
((uint32_t)sDate->WeekDay)5位就足够了
  • 工作日
    占用位13-15(3位):一个BCD位,值范围为1-7->3位 够了
  • 年份
    占用位16-24(9位)

  • 工作日
    大于7时,MSB为1,它与
    的LSB重叠,可以更改它(如果LSB为0)。

    谢谢回复。我已经用外部RTC更改了硬件,但我会尝试。您使用的是什么MCU?因为我的MX_RTC_Init()也不能正常工作,每次都会重置RTC。我使用的是驱动程序版本v1.9.0的STM32L476。