This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320C5517:RTC_ISR 丢失影响计时准确度

Guru**** 2479005 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1459064/tms320c5517-rtc_isr-loss-affecting-the-accuracy-of-timing

器件型号:TMS320C5517

工具与软件:

您好!

我已经注意到、当系统进入 IDLE ()或 SET_PLL ()(发生时钟转换)时、RTC ISR 将丢失。

我将使用毫秒寄存器(RTCMIL)作为 权变措施。 在这两个函数中、我在下面添加了以下代码、以便在时钟转换发生后清除中断标志。 但是、这仍会导致到达时间延迟。 例如、一个2分钟的计时器持续在2分6秒时完成。

if (CSL_RTC_REGS->RTCINTFL & 1){
 CSL_FINST (CSL_RTC_REGS->RTCINTFL、RTC_RTCINTFL_MSFL、SET);
}

这有什么原因吗? 有没有更好的方法可以处理 RTC ISR 事件的丢失?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!  

    我们关于这一主题的专家目前不在办公室。 我们应该能够在下周获得回复。  

    谢谢!

    -Randy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Dave、您好!

    我在 C5517 CSL 03.08.00中找不到 IDLE()和 SET_PLL()。 我不知道这些函数的作用是什么、因此不知道为什么它导致了 RTC 事件中断丢失。 您能解释 IDLE()和 SET_PLL()函数的作用吗?

    唯一可能导致 RTC 事件中断丢失的方法是 RTC_ISR()需要太长的时间才能完成、例如、在 RTC_ISR()中有 printf()、或者在 RTC_ISR()中有一个等待某些标志的循环。

    请确保您的 RTC_ISR()很短、而不是 printf()。

    此致、

    Ming   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ming Wei:

    - SET_PLL()函数用于确定是使用 PLL 作为系统时钟还是绕过系统时钟、如下图所示。 IDLE()函数具有类似的作用、它根据条件将参数传递给 SET_PLL()、其中涉及从低频转换到高频、反之亦然。


    - RTC_ISR()函数被设计为处理来自实时时钟的毫秒级中断。 每次调用 ISR 时、它都会检查是否设置了毫秒中断标志。 如果是、它会清除该标志并使计数器递增。 计数器用于跟踪时间经过、并递增、直到达到对应于一秒的值。 该 ISR 中没有 printf()调用或循环构造;它只执行标志检查、清除标志并递增计数器。

    此外,我还尝试了几种方法来处理 RTC 中断,例如在调用 set_pll()之前禁用 RTC 中断,然后重新启用它。 但是、这种方法似乎不起作用。

    -令人惊讶的是,另一种方法似乎有效,虽然我犹豫使用它。 时钟转换完成后、我清除寄存器并添加延迟、如下面的代码片段所示。 这里有这个延迟、当我运行一个2分钟的定时器时、它可以毫无延迟地到达2分钟标记处。 那么、我正在考虑延迟是否充当稳定器、以确保寄存器值稳定吗?  

    **请注意,以下代码片段在两个函数中实现,并且在时钟转换完成后:

      if ( (CSL_RTC_REGS->RTCINTFL & 1) )
      {
        CSL_FINST(CSL_RTC_REGS->RTCINTFL, RTC_RTCINTFL_MSFL, SET);
      }
    
      for (delay = 0; delay < 50; delay++);

    谢谢你。

    此致、
    Dave

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Dave、您好!

    我真的需要你的 SET_PLL 和 IDLE 函数代码来确定可能的根本原因。

    此外、我记得 PLL 需要一些时间才能稳定、因此在设置 PLL 后、在使用它之前需要增加一些延迟。

    此致、

    Ming