请问TI的专家们,我现在使用CC2640R2F提供的GPTimerCC26XX.c的驱动,由于我们CC2640R2F使用48Mhz的主频32位定时器模式下不进行分频计数计数正常,但是如果我将模式更改为16位模式,计数出现问题。
static void GPtimerInit(void)
{
GPTimerCC26XX_Params params;
GPTimerCC26XX_Params_init(¶ms);
params.width = GPT_CONFIG_16BIT; //16位计数模式
params.mode = GPT_MODE_ONESHOT_UP; //周期向上计数模式
params.debugStallMode = GPTimerCC26XX_DEBUG_STALL_OFF;
hTimer = GPTimerCC26XX_open(CC2640R2DK_5XD_GPTIMER0A, ¶ms); //初始化硬件定时器
#if 0 Types_FreqHz freq; //获取CPU频率 48Mhz
BIOS_getCpuFreq(&freq);
GPTimerCC26XX_Value loadVal = freq.lo / 1000 – 1; //47999
#endif
GPTimerCC26XX_Value value = 0x00160000; GPTimerCC26XX_registerInterrupt(hTimer, GPtimerCallback, GPT_INT_TIMEOUT); //定时器溢出中断
GPTimerCC26XX_setLoadValue(hTimer, value);
GPTimerCC26XX_start(hTimer);
}
这个是初始化代码,我直接将重装载的值设置位0x00160000;分频比位0x16,计数值为0x0000但是定时器还是计数到65535才溢出产生中断,我将计数值改为0x001603E8也是计数到65535才进行溢出产生中断,请问这是为什么,16位模式必须计数满才进行中断吗?
Felix ZF:
16位能表示的最大数值只有2^16=65536=0x10000,0x00160000和0x001603E8都超出了0x10000,因此只能记到0x10000。
你可以使用小于0x10000的数值试一下16位模式。