【问题标题】:programming a 1ms delay using RTC clock使用 RTC 时钟编程 1ms 延迟
【发布时间】: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)。当然还有其他计时器模块。

标签: c embedded cortex-m


【解决方案1】:

你把它复杂化了;你只需要TPR。通过将 TPR 值左移 1 位并将其分配给 uint16_t,自然模 216 算法会为您处理翻转:

#define RTC_TPR_MILLISEC ((32768<<1)/1000)
void wait_1ms_RTC(void)
{
    // RTC Time Prescaler Register: 0 to 2^15, 
    // shift-left 1 but to make it 2^16 so uint16_t modulo arithmetic works
    uint16_t start = RTC->TPR << 1 ; 

    while( (RTC->TPR << 1) - start < RTC_TPR_MILLISEC )
    {
        // spin 
    }
}

事实上它可能比这更简单。 user manual 表明 TPR 是一个 16 位寄存器,当 TPR:14 从 1 转换为 0 时 TSR 递增。这并不意味着 TPR 是一个 15 位值,并且计数器在 32767 之后重置为零。我不熟悉这部分,但如果实际上它是一个完整的 16 位计数器,正如文档所建议的那样,则不需要移位:

#define RTC_TPR_MILLISEC (32768/1000)
void wait_1ms_RTC(void)
{
    // RTC Time Prescaler Register: 0 to 2^16
    uint16_t start = RTC->TPR ; 

    while( RTC->TPR - start < RTC_TPR_MILLISEC )
    {
        // spin 
    }
}

如果您不确定为什么会这样,请参阅How to deal with a wrapping counter in embedded C(示例中有一个 32 位计数器,但同样适用于 16 位)。

【讨论】:

  • 是的!这种方式效率更高,并且有效。谢谢!
  • @Liz - 随时等待其他答案,但在某些时候您应该将答案标记为已接受。即使出现了更好的答案,您也可以在事后更改“已接受的答案”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多