关于CC2540低功耗情况下系统的enent的时间计算准确,但是ACMP比较器中断获取的时间就不准确,假如把低功耗power saving去掉就没问题
ACMP获取时间间隔函数
#pragma vector = P0INT_VECTOR //analog comparator
__interrupt void P0_INT(void)
{
if ((P0IFG&&(1<<5))) //边沿触发中断
{
IRCON = 0x00; //清中断标志,也可由硬件自动完成
P0IF = 0;
P0IFG = 0;
HalLedSet(HAL_LED_1,HAL_LED_MODE_TOGGLE);
uint8 i = 0,j = 0;
float average_rate = 0.0;
uint32 sum = 0;
last_val_flg = 1;
time2 = osal_GetSystemClock();
timeinterval = time2 - time1;
time1 = time2;
//算法................
timeinterval = 0;
}
}
用HEART PROFILE的发送notification时间获取时间间隔却很准确
static void heartRatePeriodicTask( void )
{
uint32 timeinterval_t = 0;
time_2 = osal_GetSystemClock();
timeinterval_t = time_2 - time_1;
time_1 = time_2;
//算法...........................
if (gapProfileState == GAPROLE_CONNECTED)
{
// static char buf[10];
// send heart rate measurement notification
heartRateMeasNotify();
// Restart timer
osal_start_timerEx( heartRate_TaskID, HEART_PERIODIC_EVT, DEFAULT_HEARTRATE_PERIOD );
}
}
两个都是用time2 -time1,然后再把time2的值赋给time1,把osal_GetSystemClock();的值赋给time2,以此计算每次ACMP中断的间隔,以准确的信号源产生中断,在没有低功耗的情况下准确,但是有低功耗的情况下就不准确了,例如本来应该是1200ms的时间间隔,但是在我的数组里面实际上的是1145,1250,1145,1250。。。。这样的数据,有规律,但不准确,又例如应该是600ms的间隔,数组缺位630,630,529,630,630,529.。。。。,假如把低功耗power saving去掉,则很正常,完全没误差
还有一种情况,在低功耗的情况下,刚刚广播时候时间间隔是不准的,然后过了几秒钟后,广播稳定了后,时间间隔又很正常了,但是一但建立连接,数据立马如上面所说的那样。
会不会是LL层的中断优先级比acmp的中断优先级高导致的呢?为什么只有在低功耗的情况下才会发生?求解答,谢谢