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(¶ms);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, ¶ms);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
Viki Shi:
50ms:GPTimerCC26XX_Value loadVal = freq.lo / 20 – 1;
100ms:GPTimerCC26XX_Value loadVal = freq.lo / 10 – 1;
user6359397:
回复 Viki Shi:
GPTimerCC26XX_setMatchValue是做什么的呢?不是用来计时的吗?
Viki Shi:
回复 user6359397:
定时器的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(¶ms);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, ¶ms);if(hTimer == NULL) {Log_error0("Failed to open GPTimer");Task_exit();}Types_FreqHzfreq;BIOS_getCpuFreq(&freq);GPTimerCC26XX_Value loadVal = freq.lo / 1000 - 1; //47999GPTimerCC26XX_setLoadValue(hTimer, loadVal);GPTimerCC26XX_registerInterrupt(hTimer, timerCallback, GPT_INT_TIMEOUT);GPTimerCC26XX_start(hTimer);while(1) {Task_sleep(BIOS_WAIT_FOREVER);} }