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.

[参考译文] CC2652R7:计时器回调

Guru**** 2747345 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1276978/cc2652r7-timer-callback

器件型号:CC2652R7
主题中讨论的其他器件:SysConfig

您好!

我一直在尝试停止并启动一个无阻塞的单触发回调计时器。 我注意到、每当我尝试启动备份计时器时、它将从停止的地方启动、而不是从上次启动时开始。 在下面提供的代码中、我显示了我如何尝试启动计时器、使其进入睡眠状态500ms。停止、关闭它、打开它、然后重新启动。 不过、在代码运行5秒后、我在回调中获得 printf 语句、而不是在计时器最后一次启动后5秒。 我做错了什么、如果不是、最有效的工作是什么?

空 timerCallback (Timer_Handle 句柄、int_fast16_t 状态)
{
   printf ("计时器 cb\r\n ");

空测试()

{
Timer_Params _timer_params;
Timer_Params_(&_timer_params);
_timer_params.periodUns = Timer_period_us;
Timer_Handle _timer = NULL;

_timer_params.period = 5000000;
_timer_params.timerCallback = timerCallback;
_timer_params.timerMode = Timer_OneShot 回调函数;

_TIMER = Timer_open (CONFIG_TIMER_3、&_TIMER_PARAMS);


Timer_start (_timer);
usleep(500000);
printf ("usleep1\r\n");

Timer_stop (_timer);
timer_close (_timer);
_TIMER = Timer_open (CONFIG_TIMER_3、&_TIMER_PARAMS);
Timer_start (_timer);
usleep(500000);
printf ("usleep2\r\n");

Timer_stop (_timer);
timer_close (_timer);
_TIMER = Timer_open (CONFIG_TIMER_3、&_TIMER_PARAMS);
Timer_start (_timer);
usleep(500000);
printf ("usleep3\r\n");

Timer_stop (_timer);
timer_close (_timer);
_TIMER = Timer_open (CONFIG_TIMER_3、&_TIMER_PARAMS);
Timer_start (_timer);
usleep(500000);
printf ("usleep4\r\n");

Timer_stop (_timer);
timer_close (_timer);
_TIMER = Timer_open (CONFIG_TIMER_3、&_TIMER_PARAMS);
Timer_start (_timer);
usleep(500000);
printf ("usleep5\r\n");

Timer_stop (_timer);
timer_close (_timer);
_TIMER = Timer_open (CONFIG_TIMER_3、&_TIMER_PARAMS);
Timer_start (_timer);
printf ("timer go\r\n");

睡眠(60);

timer_close (_timer);

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

    您好、 Kenneth Thomas:

    希望你好。 我以基本 timerled 示例为例、我能够以类似的方式使用 Oneshot_callback、更具体地说、我使用了一个基本 while (1)循环、仅调用 timer_start 来保持计时器运行(LED 持续闪烁、就像连续回调一样)。 当您想"恢复"时钟时、为什么要使用 Timer_stop/close? 您能否尝试删除 timer_stop/close、看看它如何改变您看到的情况? 此外、您能否提供所使用的 SDK 以及基于 SDK 的示例?  

    Unknown 说:
    但是在代码运行5秒钟后、我在回调中得到 printf 语句、而不是在计时器最后一次启动后5秒

    因此、为了证实这一点、您目前看到的是一条 printf 语句、其中显示"Timer is CB"、而不是预期的"usleep1"消息? 并且您不会看到任何其他消息(该消息之后程序是否继续)?

    谢谢。
    A·F  

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

    否、我看到所有 usSleep 消息、但计时器 CB 在最后一个 Timer_start 后1秒发生、而不是在它之后5秒。 本质上、我正尝试在按下最后一个后续按钮后计数5秒的周期。 为此、我首先停止并在每次按下按钮时再次启动计时器。 我注意到最后一个按钮按下1到2次后的时间间隔有差异、而4到6次时应该是连续的5秒、似乎是从第一次按键而不是最后一次按键开始计数。 此外、SDK 为 simplelink_cc13xx_cc26xx_sdk_7_10_01_24。

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

    您好、 Kenneth Thomas:

    我想问您在您的应用中是否需要进入低功耗模式、这可能是您想要停止然后关闭计时器而不是再次启动计时器的原因。 所包含的是一小段我放在一起的代码、它在启动计时器之前读取 BTN 的状态、并在5秒后切换绿色 LED (如果您每秒按一次 btn1或按住它); 这是否与您尝试实现的目标有所相似? 在您的程序中、BTN 具体是如何处理/与您的计时器相关的(包括代码片段)? 如果您手头还有逻辑分析仪、可以在回调中添加 GPIO 高电平来读取特定的时序间隔。    

        while(1){
    
        if(GPIO_read(CONFIG_GPIO_BTN1) == 0)
        {
        Timer_start(timer0);
        }
        else
            counter1++;
        }
        return (NULL);
    }
    
    /*
     * This callback is called every 1,000,000 microseconds, or 1 second. Because
     * the LED is toggled each time this function is called, the LED will blink at
     * a rate of once every 2 seconds.
     */
    void timerCallback(Timer_Handle myHandle, int_fast16_t status)
    {
        GPIO_toggle(CONFIG_GPIO_LED_0);
        globalCount++;
        if (globalCount > 4)
        {
            globalCount = 0;
            GPIO_toggle(CONFIG_GPIO_LED_1);
        }
    }

    谢谢。
    A·F  

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

    尊敬的 Alex:

    因此、我能够通过使用两个信标和一个全局计数器使按钮正常工作(从这个示例中了解相关想法)。 但我仍然想更具体地了解计时器的功能、看看计时器是否 在关闭并重新打开它之后重置其计数。 从我最初发布的测试来看、计数似乎仍然保持不变、并从停止的位置继续计数、直到达到超时。  

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

    您好、 Kenneth Thomas:

    使用 Timer_close 时、将显示以下内容:Timer_close --> GPTMERCC26XX_CLOSE --> GPTMERCC26XX_resetHw (应重置计时器/计数)。

    查看 SDK 中的文件 TimerCC26XX.c 和 GPTimerCC26XX.c、获取有关这些函数的更详细信息(SysConfig 中还有一个 GPTimer 复选框)。  

    您可以看到计时器是否 通过寄存器中的 GPT#(在本例中为 GPT0)更新/复位。 您还应该尝试坚持使用一种计时器功能(GPTimer 或 Timer)。 使用计时器函数时、即使存在前一个 Timer_open 中残留的值、新的 Timer_open 也将覆盖计数。  

    谢谢。
    A·F

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

    尊敬的 Alex:

    再次感谢您的帮助。

    肯尼斯 T