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.

CC2640R2F TImer 捕获模式的时间设置



void timerCallback(GPTimerCC26XX_Handle handle, GPTimerCC26XX_IntMask interruptMask) {
     // interrupt callback code goes here. Minimize processing in interrupt.
    timer_Value = GPTimerCC26XX_getValue(hTimer);
    Log_info0("timer_working!");
    Log_info1("Value is %u",timer_Value);
    HWREG(handle->hwAttrs->baseAddr + offset + GPT_O_TBR) = 0;

 }



extern void timer_init(void)
{

    GPTimerCC26XX_Params params;
    GPTimerCC26XX_Params_init(&params);
    params.width          = GPT_CONFIG_16BIT;
    params.mode           = GPT_MODE_EDGE_COUNT;
    params.direction      = GPTimerCC26XX_DIRECTION_UP;
    params.debugStallMode = GPTimerCC26XX_DEBUG_STALL_OFF;
    hTimer = GPTimerCC26XX_open(Board_GPTIMER1B, &params);
    if(hTimer == NULL) {
        Log_error0("Failed to open GPTimer");
        Task_exit();
    }
    if(TimerPinHandle==NULL)
    {
        TimerPinHandle = PIN_open(&TimerPins,TimerinitTable);
    }
    PINCC26XX_setMux(TimerPinHandle, PIN_TIMER, GPT_PIN_1B );
    //GPTimerCC26XX_getPinMux(hTimer);
    xdc_runtime_Types_FreqHz  freq;
    BIOS_getCpuFreq(&freq);
    GPTimerCC26XX_Value loadVal = freq.lo / 10000 - 1;
    GPTimerCC26XX_setLoadValue(hTimer, loadVal);
    GPTimerCC26XX_setMatchValue(hTimer, 10000);
    GPTimerCC26XX_setCaptureEdge(hTimer,GPTimerCC26XX_BOTH_EDGES);
    GPTimerCC26XX_registerInterrupt(hTimer, timerCallback, GPT_INT_CAPTURE_MATCH);
   // GPTimerCC26XX_enableInterrupt(hTimer, 0xFFFF);
    HWREG(hTimer->hwAttrs->baseAddr + offset + GPT_O_TBR) = 0;
    timer_status = STANDBY;

}

设置了捕获模式来捕捉一定时间内产生的电平变化,但我的定时一直设置的不对,有人能跟我讲讲

GPTimerCC26XX_setLoadValue(hTimer, loadVal);和 GPTimerCC26XX_setMatchValue如何设置定时呢?

在上述代码中,居然每隔41秒触发一次中断,TBPR也未设置成功,能设置一个50MS 和 100MS的例子帮助我理解呢?

以下是寄存器的截图,使用的是TImerB

  • 50ms: GPTimerCC26XX_Value loadVal = freq.lo / 20 - 1;
    100ms: GPTimerCC26XX_Value loadVal = freq.lo / 10 - 1;
  • GPTimerCC26XX_setMatchValue是做什么的呢?不是用来计时的吗?
  • 定时器的match value,可以这么理解,定一个match value,一旦到达这个值,可以有选择地触发中断,复位定时器,重启定时器等【PS:具体功能请参考每个芯片的手册描述】。这部分建议你看一下芯片的TRM: https://www.ti.com/lit/ug/swcu117i/swcu117i.pdf

    至于要实现50ms/100ms的定时,请直接参照下面的代码修改load value:

    GPTimerCC26XX_Handle hTimer;
    void timerCallback(GPTimerCC26XX_Handle handle, GPTimerCC26XX_IntMask interruptMask) {
        // interrupt callback code goes here. Minimize processing in interrupt.
    }
    void taskFxn(uintptr_t a0, uintptr_t a1) {
      GPTimerCC26XX_Params params;
      GPTimerCC26XX_Params_init(&params);
      params.width          = GPT_CONFIG_16BIT;
      params.mode           = GPT_MODE_PERIODIC;
      params.direction      = GPTimerCC26XX_DIRECTION_UP;
      params.debugStallMode = GPTimerCC26XX_DEBUG_STALL_OFF;
      hTimer = GPTimerCC26XX_open(CC2650_GPTIMER0A, &params);
      if(hTimer == NULL) {
        Log_error0("Failed to open GPTimer");
        Task_exit();
      }
      Types_FreqHz  freq;
      BIOS_getCpuFreq(&freq);
      GPTimerCC26XX_Value loadVal = freq.lo / 1000 - 1; //47999
      GPTimerCC26XX_setLoadValue(hTimer, loadVal);
      GPTimerCC26XX_registerInterrupt(hTimer, timerCallback, GPT_INT_TIMEOUT);
      GPTimerCC26XX_start(hTimer);
      while(1) {
        Task_sleep(BIOS_WAIT_FOREVER);
      }
    }