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.

[参考译文] LP-CC1352P7:当使用 Timer_setPeriod ()从一个长周期调整到一个短周期时,'在进入一个新的周期之前有一个等待期。

Guru**** 2482105 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1263760/lp-cc1352p7-when-using-timer_setperiod-to-adjust-from-a-long-period-to-a-short-period-there-s-a-waiting-period-before-entering-the-new-period

器件型号:LP-CC1352P7
主题中讨论的其他器件:SysConfig

您好、TI!

我 在"timerled"示例中添加了一个按钮来控制时间段。 当从一个很长的时期转变为一个较短的 时期时,我注意到一个意想不到的等待期进入新的时期 ,我不是很确定背后的原因。

Timer_Params_init(&params);
params.period = 5000000;
params.periodUnits = Timer_PERIOD_US;
params.timerMode = Timer_CONTINUOUS_CALLBACK;
params.timerCallback = timerCallback;

timer0 = Timer_open(CONFIG_TIMER_0, &params);

Timer_start(timer0);

当我按下按钮时计时器更改周期

static void btn_interrupt_handler(uint8_t index)
{
    if(index == CONFIG_GPIO_BTN1)
    {
       Timer_stop(timer0);
       Timer_setPeriod(timer0,Timer_PERIOD_US,5000000);
       Timer_start(timer0);

    }
    else if(index == CONFIG_GPIO_BTN2)
    {

       Timer_stop(timer0);
       Timer_setPeriod(timer0,Timer_PERIOD_US,100000);
       Timer_start(timer0)

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

    当我按下按钮时计时器更改周期

    static void btn_interrupt_handler(uint8_t index)
    {
        if(index == CONFIG_GPIO_BTN1)
        {
            Timer_stop(timer0);
    
            if (Timer_setPeriod(timer0,Timer_PERIOD_US,5000000) == Timer_STATUS_ERROR)
            {
                /* Failed to start timer */
                while (1) {}
            }
           if (Timer_start(timer0) == Timer_STATUS_ERROR)
          {
              /* Failed to start timer */
              while (1) {}
          }
    
        }
        else if(index == CONFIG_GPIO_BTN2)
        {
    
    
            Timer_stop(timer0);
    
            if (Timer_setPeriod(timer0,Timer_PERIOD_US,100000) == Timer_STATUS_ERROR)
           {
               /* Failed to start timer */
               while (1) {}
           }
    
            if (Timer_start(timer0) == Timer_STATUS_ERROR)
              {
                  /* Failed to start timer */
                  while (1) {}
              }
    
        }
    }

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

    您好、Neil:

    一种可能的解释是按钮回调本身略微延迟。 这是您可能会在计时器周期中被观察到的延迟更新。

    您可以 提高 GPIO 的中断优先级并进行检查吗?

    您可以在 SysConfig 中的 GPIO 模块中设置中断优先级。

    如果需要、请告知我们。  

    此致、

    SID

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

    尊敬的  Sid:  

    感谢您的答复。  

    我曾尝试将中断优先级提高到最高级别、但结果相同。

    另外、我还测试了交换由按钮控制的时间、但延迟仍然只在从长周期切换到短周期时发生。

    此致、

    尼尔

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

    您好、Neil:

    为了进行调试并引发延迟、最好在 btn_interrupt 处理程序中以及 timer_start 后切换 GPIO。 并在逻辑分析仪上捕捉此情况。  

    我们将得到与时间相关的事件、并允许我们查看延迟是否发生在按钮按下之后以及中断被服务之前。  

    此致、

    SID

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

    尊敬的 Sid:

    遗憾的是、我没有逻辑分析仪来测试它。

    但是、我尝试使用timerCallback函数增加周期、然后在达到最大间隔后将其恢复为原始周期。 结果正常、没有延迟。

    我想这是因为任务不能在 btn_interrupt 时间内完成。我想验证这部分、但我不知道怎么做。

    此致、

    尼尔

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

    您好、Neil:

    如果您可以在调试模式下运行并观察计时器寄存器、这可能是一种跟踪计时器更新时间的可能方法。 也许你可以在按钮回调中添加一个断点、并且步越来观察计时器寄存器

    此致、

    SID

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

    尊敬的 Sid:

    我目前正在您提到的位置添加一个断点并逐步执行、但操作中似乎没有异常。 我观察到寄存器是 GPT0、如随附图片所示。 此部件可能需要您的指导。 我想与您确认当前步骤是否正确?

    此致、

    尼尔

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

    您好、Neil:

    重点是确保在按下按钮后立即加载寄存器。 似乎 TAMR 中的 TAILD 字段也设置为0。 因此该值会在下一个时钟周期立即加载、而不是在超时后立即加载。 如果在按下按钮和执行此加载之间发生延迟、则表示存在中断优先级问题。  

    有关这些寄存器和计时器行为的更多信息、可在此处找到技术参考手册第15章: https://dev.ti.com/tirex/explore/node?node=A__AKmzYuZ2B4krLKxi7R.HsQ__cc13x0_devices__coGQ502__LATEST

    此致、
    SID

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

    尊敬的 Sid:

    很抱歉响应延迟。

    我观察到、在按下按钮直到下一次更新寄存器后、有两个不同的结果。 第一个是成功的更新和执行、而另一个是延迟。 不同之处在于我设置周期时间的顺序、从1秒转换到5秒、然后从5秒转换到1秒。

    此外,我发现 PowerCC26XX_STANDBYPolicy ()尽管有延迟仍执行,该函数似乎控制 LED 开关,但在延迟条件下未触发 LED。 我看起来 timercallback 在按下按钮后进入 GPIO_toggle (),并卡在其中。

    void timerCallback (Timer_Handle myHandle、int_fast16_t status)
    {

       GPIO_TOGGLE (CONFIG_GPIO_LED_0);

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

    您好、Neil:  

    这只是试错、抱歉、如果计时器回调被阻止执行、那么您可能需要将计时器回调的优先级提高到最高优先级。 该操作可以在 SysConfig 中完成。 把 GPTimer 中断的中断优先级修改为更高

    由于您没有逻辑分析仪、因此或许您可以使用 Runtime Object 视图查看任务执行状态。  

    您可以启用 ROV、 在调试会话期间 "Run Time Object View"、开始调试会话。 这将使您能够检查任务状态  

    希望这对您有所帮助。  

    此致、

    SID

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

    尊敬的 Sid:

    在调整计时器优先级后、它成功切换了周期。

    谢谢。  

    尼尔