【发布时间】:2021-03-29 12:26:59
【问题描述】:
我目前正在使用 S32k142 微控制器。 我想使用 RTC 时钟配置 1ms 延迟。我有一个外部 RTC 时钟(32.768KHz),它已配置为驱动微控制器的 RTC 模块。 我编写了以下程序:
void wait_1ms_RTC(void)
{
UINT32 tpr = (UINT32)RTC->TPR; // RTC Time Prescaler Register: increments at a freq of 32.768KHz
UINT32 tsr = (UINT32)RTC->TSR; // RTC Time Seconds Register: increments every second
tpr = tpr + (UINT32)32; // 32->1ms(32*30.51us=976.32us)
if (tpr <= 32767)
{
while (((UINT32)RTC->TPR <= tpr)&& ((UINT32)RTC->TSR <= tsr));
}
else
{
while (((UINT32)RTC->TPR <= (tpr - 32768))&& ((UINT32)RTC->TSR <= tsr+1));
}
}
此代码只是读取 TPR 和 TSR 寄存器,并等待 TPR 寄存器和 TSR 寄存器达到对应于 1ms 的某个值。 这在大多数情况下都有效,除了在少数情况下它不会产生 1 毫秒的延迟,我假设它发生在翻转期间,但仍然无法弄清楚代码中的问题到底在哪里。
关于如何解决这个问题的任何想法?
【问题讨论】:
-
不能使用中断吗?
-
@BasileStarynkevitch。 1ms 中断的问题在于,当您等待下一个中断时,它将在 0 到 1ms 内出现。如果你想要正好 1ms 那是没有帮助的。然而,查看参考手册,RTC 中断率最大值为 128Hz(~7.8ms)。当然还有其他计时器模块。