确定微控制器开机后秒数的更好方法?

Better way to determine seconds since power on in microcontroller?

小问题:如何在 STM32L051T6 微控制器中获取复位后的秒数?

我的努力和详细问题:

我使用的是STM32L051T6系列微控制器。我需要计算开机后的秒数。我也在使用低功耗模式。所以我编写了代码来使用微控制器内部 RTC 的唤醒定时器中断功能。我使用 1 秒间隔唤醒定时器和 32768 Hz 的外部 LSE 时钟。 3天后,我观察了开机后的累计秒数(SSPO),发现它比实际经过的时间落后了115秒。我对这种漂移的猜测是执行唤醒定时器中断时的中断延迟。如何消除这 115 秒的漂移?或者有什么比使用唤醒中断来计算开机秒数更好的方法吗?

更新:

我尝试将 Systick 与 HAL_GetTick() 函数一起使用作为开机后的秒数。但即使是 systick 也会随着时间的推移而延迟。

如果您想在较长时间内准确测量时间,RTC 是最佳选择。正如你提到的你有一个 RTC,你可以使用下面的方法。

启动时,将 RTC 加载为零。

然后您可以在需要时读取经过的秒数而不会出现上述错误。

编辑:根据评论,用户可以更改 RTC。在那种情况下,

如果你可以修改用户调用的RTC写入函数,那么当用户调用RTC写入函数时,你更新了一个全局变量VarA = time set by user。经过的时间将为 Time read by RTC - VarA.

如果 RTC 准确,您应该通过在启动时存储它的值并稍后与保存的值进行比较来使用 RTC。但是你说 RTC 可以由用户重置所以我可以看到两种方法来应对它:

  • 如果您对系统有足够的控制权,请将用户可用于重置时钟的命令或 IHM 替换为包装器,该包装器会通知您模块并允许在重置前后读取 RTC
  • 如果你没有足够的控制或不能包装用户的重置(因为它使用直接系统调用等)使用定时器来控制每秒的 RTC 值

但是您应该在 RTC 时钟的增量上定义一个阈值。如果它是 small,它很可能是一个调整,因为除非你的系统使用原子钟,否则即使是 RTC 也可以随时间推导。在那种情况下,我不会在意,因为你几乎不知道它是否是自上次重启后派生的。如果你想要一个更聪明的算法,你可以使阈值依赖于自上次重启以来的当前时间:系统运行的时间越长,它从那时起得出的概率就越高。

相反,large delta 可能是修正,因为 RTC 明显错误,节电电池没用了,或者其他原因。在这种情况下,您应该计算新的开始 RTC 时间,它给出与新 RTC 值相同的持续时间。

根据经验,我会在没有 RTC 时钟调整的情况下使用每个正常运行时间大约 1 或 2 秒的阈值 (ref) - 这意味着我还会存储上次 RTC 调整的时间,最初启动时间。