Stm32 HAL_SetDate将年份设置为错误值
我将STM32F030RCT6与CubeMX一起使用。设备是一个数据记录器,RTC是不能失败的主要因素。上有关于RTC卷影寄存器的内容 我将CubeMX配置为不生成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
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
日
=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。