Other Parts Discussed in Thread: CC2640, SYSBIOS
void timerCallback1A(GPTimerCC26XX_Handle handle, GPTimerCC26XX_IntMask interruptMask)
{
//int i;
//i = GPTimerCC26XX_getValue(hTimer0A);
j = GPTimerCC26XX_getValue(hTimer0A);
GPTimerCC26XX_setLoadValue(hTimer0A, 0);
printf("%d\n",j);
GPIO_toggle(Board_GPIO_LED0);
GPIO_toggle(Board_GPIO_LED1);
}
void timerCallback0A_cap(GPTimerCC26XX_Handle handle, GPTimerCC26XX_IntMask interruptMask)
{
//static int j;
if(j == 0xFFFF-1)
{
j = 0;
}
j++;
//i = GPTimerCC26XX_getFreeRunValue(hTimer0A);
//printf("%d\n",i);
}
void *mainCAPTURE(void *arg0)
{
/* Open LED pins */
ledPinHandle = PIN_open(&ledPinState, pinTable);
if (ledPinHandle == NULL)
{
while(1);
}
GPTimerCC26XX_Params params0A;
GPTimerCC26XX_Params_init(¶ms0A);
params0A.width = GPT_CONFIG_16BIT;
params0A.mode = GPT_MODE_EDGE_COUNT;
params0A.debugStallMode = GPTimerCC26XX_DEBUG_STALL_OFF;
hTimer0A = GPTimerCC26XX_open(CC2640R2_LAUNCHXL_GPTIMER0A, ¶ms0A);
if(hTimer0A == NULL)
{
while(1);
}
GPTimerCC26XX_registerInterrupt(hTimer0A, timerCallback0A_cap, GPT_INT_CAPTURE);
GPTimerCC26XX_PinMux pinMux = GPTimerCC26XX_getPinMux(hTimer0A);
PINCC26XX_setMux(ledPinHandle, IOID_0, pinMux);
GPTimerCC26XX_setCaptureEdge(hTimer0A, GPTimerCC26XX_NEG_EDGE);
//GPTimerCC26XX_setLoadValue(hTimer0A, 0xFFFF);
//GPTimerCC26XX_setMatchValue(hTimer0A, 1);
LED_Init();
GPTimerCC26XX_Params params1A;
GPTimerCC26XX_Params_init(¶ms1A);
params1A.width = GPT_CONFIG_32BIT;
params1A.mode = GPT_MODE_PERIODIC;
params1A.debugStallMode = GPTimerCC26XX_DEBUG_STALL_OFF;
hTimer1A = GPTimerCC26XX_open(CC2640R2_LAUNCHXL_GPTIMER1A, ¶ms1A);
if(hTimer1A == NULL)
{
while(1);
}
GPTimerCC26XX_registerInterrupt(hTimer1A, timerCallback1A, GPT_INT_TIMEOUT);
GPTimerCC26XX_setLoadValue(hTimer1A, 0x2DC6C00);
GPTimerCC26XX_start(hTimer1A);
GPTimerCC26XX_start(hTimer0A);
while(1)
{
Task_sleep(BIOS_WAIT_FOREVER);
}
}
这是我用于测试频率的2个中断处理函数以及主函数。
采用Timer0A用于采集下降沿并进行j++,采用Timer1A用于定时1S最后通过 j = GPTimerCC26XX_getValue(hTimer0A);。
最终打印数据:19955
39914
59871(测试20KHz的方波)
这几个值都相差19950左右的值,但并不准确。
且还存在以下几个问题:
①.在timerCallback1A()函数中,我想采用 GPTimerCC26XX_setLoadValue(hTimer0A, 0);将Timer0A中计数器的值进行归0,但并没有成功,我翻看了GPTimerCC26XX.h文件,最终只找到了setLoadValue与setMatchValue函数,setMatchValue应该不行,但setLoadValue也无法满足我的需求,我想知道哪个函数能将Timer0A中的COUNT清0。
②.因为STM32可以使用下降沿中断计数,并且打开定时器进行单独计时,当在一次下降沿中断中检测到例如if(TIM5->CCR1 > 1000000)(这里采用了84分频,所以1M代表1S)之后便直接将中断里用于计数的参数输出并清零,所以最开始我想在CC2640R2F中使用一个定时器将测频程序完成,但最后并没有成功。想请问是否能使用一个定时器完成测频操作,如果有的话请指出方法。谢谢!
③.在params0A.mode = GPT_MODE_EDGE_COUNT;, GPTimerCC26XX_registerInterrupt(hTimer0A, timerCallback0A_cap, GPT_INT_CAPTURE);配置下的32位定时器并不能设置params0A.width = GPT_CONFIG_32BIT;一旦设置为32位,程序将无法完成初始化。这点我不是很明白。
我现在还是个学生,接触CC2640没几天,可能提出的一些问题会太过简单,但我确实不明白,这两天我一直在调定时器想达到测频目的,但一直没实现。
还请工程师解答一下,谢谢了!!