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**** 2749395 points

Other Parts Discussed in Thread: CC2652R7

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1298843/cc2652r7-internal-timer-count-doesn-t-reset-in-one-shot-mode

器件型号:CC2652R7

您好!  

我尝试多次运行一次性计时器。 我所做的是 启动 计时器并在中间停止它、然后重新运行它。 第二次运行时、它未完成整个周期、而是从停止的位置开始。 我在下面创建了一个测试、用于显示此功能。 我使用的 CC2652R7板具有 SDK:7_10_01_24。 假设内部计时器计数直到计数达到周期时才复位。

此致、
肯尼斯·托马斯

sem_t timer_sem;

空 timerCallback (Timer_Handle 句柄、int_fast16_t 状态)
{
sem_post (&timer_sem);

空 testTimer()
{
sm_init (&timer_sem、0、0);

//配置一秒后一次性回调的计时器参数
Timer_Handle 定时器;
Timer_Params timer_params;
Timer_Params_(&timer_params);
Timer_params.periodUns = Timer_period_US;
Timer_params.period = 1000000;
Timer_params.timerCallback = timerCallback;
Timer_params.timerMode = Timer_Oneshot_callback;

//在计时器完成前启动/停止计时器
bool stop_early_and_restart =真;
如果(STOP_EARLY_AND_RESTART)
{
Timer_open (CONFIG_TIMER_3、&TIMER_PARAMS);
Timer_start (定时器);
usleep(500000);
Timer_stop (定时器);
Timer_close (定时器);

//重新启动计时器,但让它完成
Timer_open (CONFIG_TIMER_3、&TIMER_PARAMS);
uint32_t start_ticks = ClockP_getSystemTicks ();
Timer_start (定时器);
sm_wait (&timer_sem);
uint32_t stop_ticks = ClockP_getSystemTicks ();
Timer_stop (定时器);
Timer_close (定时器);

printf ("[timer]已用时间=%d msec"、((STOP_TICK - START_TICK)* ClockP_getSystemTickPeriod ())/ 1000);

sm_destroy (&timer_sem);

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

    您好、Kenneth Thomas:

    调用 timer_close 时、时间应复位、因为 timer_close 将调用  GPTimerCC26xx_resetHw (); 如果需要、可以调用该函数、但不需要该函数。 您也可以使用计时器函数来设置计时器周期(Timer_setPeriod)、以查看这对您的项目是否有帮助。  在这个 E2E 主题(https://e2e.ti.com/f/1/t/1269670/)上讨论的类似主题中、可以找到一个很好的资源来帮助解答一些其他问题、不过请注意这是针对不同器件的。  

    谢谢。
    A·F

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

    尊敬的 Alex:  

    感谢您提供 E2E 主题、它真的很有帮助。  

    这是我需要调用的代码、因为驱动程序代码有问题。
    HWREG (GPT_Handle->hwAttrs->baseAddr + GPT_O_TAV)= 0xFFFFFFFF;
    HWREG (GPT_Handle->hwAttrs->baseAddr + GPT_O_TBV)= 0xFFFFFFFF;

    此致、  
    肯尼斯

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

    尊敬的 Alex:  

    您还想检查该测试代码以查看我是否以"正确"的方式更改寄存器的值吗?  

    sem_t timer_sem;
    
    void timerCallback(Timer_Handle handle, int_fast16_t status)
    {
    sem_post(&timer_sem);
    }
    
    void testTimerDriver()
    {
    sem_init(&timer_sem, 0, 0);
    
    // Configure Timer parameters for one-shot callback after one second
    Timer_Handle timer;
    Timer_Params timer_params;
    Timer_Params_init(&timer_params);
    timer_params.periodUnits = Timer_PERIOD_US;
    timer_params.period = 1000000;
    timer_params.timerCallback = timerCallback;
    timer_params.timerMode = Timer_ONESHOT_CALLBACK;
    
    // Start/stop timer before it can finish
    bool stop_early_and_restart = true;
    if (stop_early_and_restart)
    {
    timer = Timer_open(CONFIG_TIMER_3, &timer_params);
    Timer_start(timer);
    usleep(500000);
    Timer_stop(timer);
    
    // Timer driver bug-fix/hack, implemented in our Timer class
    GPTimerCC26XX_Handle gpt_handle = ((TimerCC26XX_Object*)timer->object)->gptHandle;
    //CommandLine::log("TAV (0x%X) = %d", gpt_handle->hwAttrs->baseAddr + GPT_O_TAV, HWREG(gpt_handle->hwAttrs->baseAddr + GPT_O_TAV));
    //CommandLine::log("TBV (0x%X) = %d", gpt_handle->hwAttrs->baseAddr + GPT_O_TBV, HWREG(gpt_handle->hwAttrs->baseAddr + GPT_O_TBV));
    HWREG(gpt_handle->hwAttrs->baseAddr + GPT_O_TAV) = 0xFFFFFFFF;
    HWREG(gpt_handle->hwAttrs->baseAddr + GPT_O_TBV) = 0xFFFFFFFF; // TODO: Determine if this is invalid for 16-bit timers
    
    Timer_close(timer);
    }
    
    // Restart timer but let it finish
    timer = Timer_open(CONFIG_TIMER_3, &timer_params);
    uint32_t start_ticks = ClockP_getSystemTicks();
    Timer_start(timer);
    sem_wait(&timer_sem);
    uint32_t stop_ticks = ClockP_getSystemTicks();
    Timer_stop(timer);
    Timer_close(timer);
    
    CommandLine::log("[TIMER] Elapsed time = %d msec", ((stop_ticks - start_ticks) * ClockP_getSystemTickPeriod()) / 1000);
    
    sem_destroy(&timer_sem);
    }

    谢谢。
    肯尼斯

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

    您好、Kenneth:  

    希望你好。 看一下上面提供的代码片段乍一看很好、特别是看第34/35行 、您实际上是在尝试执行 HWREG (0x40010050)= 0xFFFFFFFF 和  HWREG (0x40010054)= 0xFFFFFFFF ? 如果这样、您的过程看起来是正确的、作为额外的步骤、您可以尝试在第34/35行(假设31)之前设置一个断点、然后看看寄存器在调试期间是如何更新的。  

    谢谢。
    A·F