gpt4 book ai didi

stm32 - HAL_SetDate 将年份设置为错误的值

转载 作者:行者123 更新时间:2023-12-03 20:30:34 24 4
gpt4 key购买 nike

我将 STM32F030RCT6 与 CubeMX 一起使用。设备是一个数据记录器,RTC 是不能失败的主要部分。在 Errata Sheet有一些关于 RTC 影子寄存器的东西。

我将CubeMX设置为不生成MX_RTC_Init()函数,目前运行正常。 (我正在使用 LSE)

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

我尝试过的:

  • 使用过的大规模集成电路
  • while (HAL_SetDate != HAL_GetDate) HAL_SetDate(ActualDate)
  • 首先是 HAL_GetDate,然后是 HAL_SetDate

我没有任何进展,事情甚至变得更糟,例如 Month = 56,Day = 45 等

提前致谢。最好的问候。

最佳答案

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)。

关于stm32 - HAL_SetDate 将年份设置为错误的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49264383/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com