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.

[参考译文] TMS570LC4357:使用计时器时的队列导通延迟(在翻转条件下)

Guru**** 2393725 points
Other Parts Discussed in Thread: TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1375211/tms570lc4357-queiry-on-delay-using-the-timers-on-rollover-condition

器件型号:TMS570LC4357

工具与软件:

您好!

为了生成延迟、 我们有以下伪代码、这与 TI 的示例代码类似

延迟(微秒周期值)
  uint64 initial_time
  uint64 current_time

  GET_CURRENT_TIMER_VALUE (INITIAL_TIME);
  uint64  ticks_value = convert_microsec_to_ticks_values (period_value);
  
  应执行的操作
  {
    GET_CURRENT_TIMER_VALUE (CURRENT_TIME);
  }
  while ((Current_time  - initial_time)< ticks_value);

   返回
}
period_value 指所需的延迟量(作为参数传递)。

当控制器持续运行数天时、由于 uint64类型的翻转条件、CURRENT_TIME 值是否可能小于 initial_time 值。 问题是、如果上述变量发生翻转、如何在 TI 中完成处理? 或者我们是否应该在代码中添加任何翻转条件?
 

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

    尊敬的 Bharath:

    我验证了 TMS570LC4357的 RTI 驱动程序代码、但我没有找到名为"get_current_timer_value"的函数、因此我们有"rtiGetCurrentTick"

    您是否只讨论此函数? 如果没有、您能否提供完整的项目以供验证。

    ——
    谢谢、此致、
    Jagadish。

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

    尊敬的 Jagadish:
    是的、您指出的函数与我们所拥有的函数类似。 我们已根据我们的标准对其进行了修改。 因此,我对前面的评论感到好奇:

    当控制器持续运行数天时、由于 uint64类型的翻转条件、CURRENT_TIME 值是否可能小于 initial_time 值。 问题是、如果上述变量发生翻转、如何在 TI 中完成处理? 或者我们是否应该在代码中添加任何翻转条件?

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

    尊敬的 Bharath Kumar:

    uint64 不会发生翻转、但有一个边界条件需要在应用级别进行处理。 我想先解释一下行为:

    为了说明我为 RTI 比较0配置了1秒超时的行为、如下所示:

    而预分频后的 RTI 时钟为1MHz

    基于此、  为我的 COMPx 和 UDCPx 寄存器分配了1000000:

    因此、计时器将执行的操作是、它将 针对每个 RTC 时钟脉冲持续递增 FRCx (在预分频器之后)。 如果该 FRCx 值与 COMPx 匹配 、则意味着发生超时、并且将生成 COMPARE0中断。 现在、在该中断之后、为了周期性地生成中断、计时器模块会将 UDCPx 值与 COMPx 相加 、以生成下一个中断。 因此、FRCx 将  再次跟踪 COMPx 值、如果再次与该值匹配、我们将获得中断、并且此过程将继续。

    现在、如果我们验证 rtiGetCurrentTick 函数定义:

    它将返回节拍值、如下所示:

    Tick = RTI_CNT_FRCx -(RTI_CMP_COMPx - RTI_CMP_UDCPx);

    因此、该节拍值将为我们提供按 FRCx 计数的 RTI 时钟脉冲数。

    示例:

    在本例中、我们配置了1000000、这意味着我们将得到0到999999之间的周期、

    为了理解执行以下操作的行为、我持续读取节拍值并将其发送到 UART 端口

    如您所见、它将不断递增、直至达到1000000、然后回滚到零并再次开始。

    因此、如果应用程序希望使用此节拍值创建延迟、则应用程序应注意这一边界条件。

    在这种边界条件下、电流值可能小于初始值。

    解决方案如下:

    读取当前值后、将其与初始值进行比较、如果小于初始值、请将 UDCPx 与当前值相加。

    void delay(MicroSeconds period_value)
    {
        Uint64 initial_time;
        Uint64 current_time;
    
        get_current_timer_value(initial_time);
        Uint64 ticks_value = convert_microsec_to_ticks_values(period_value);
       
        do
        {
            get_current_timer_value(current_time);
    		if(current_time < initial_time)
    		{
    			current_time = current_time + rtiREG->CMP[0].UDCPx;
    		}
        }
        while ( (current_time - initial_time) < ticks_value );
    
         return;
    }

    ——
    谢谢、此致、
    Jagadish。