TI中文支持网
TI专业的中文技术问题搜集分享网站

CC1310 IDLE 模式下硬件定时器中断被打断

你好

我现在做一个应用是接收RF,收到数据后打开TIMER中断,在中断程序中给PWM置值。

程序只有一个任务(RF),一个硬件定时中断,在任务中程序接收到数据后,RF_close,执行PRCMDeepSleep()等语句,进入IDLE。定时器继续定时唤醒并置数。

现在接收,置数以及进出IDLE都正常,但是经常会出现中断程序被打断的情况,造成PWM置数时间误差。(正常情况中断程序执行时间几微妙,出问题时执行时间40多微妙,由此判断中断被打断)。有时是晚了40us进中断

如果不进IDLE,(屏蔽PRCMDeepSleep()),则完全正常。

请帮忙判断一下问题可能出哪儿了

另外,.cfg文件用的例子缺省rfExamples.cfg。也改过各种值,均没啥变化

谢谢

da qin zheng sheng:

idle=sleep

standby=deep sleep

Felix ZF:

你这里说的IDLE应该是进入standby了。

不同的中断响应时间,可能是因为中断发生时CC1310所处的状态不同。

如果中断发生时,CC1310处于standby,则需要有一个从standby切换到active的过程。

mingfeng fan:

回复 Felix ZF:

Felix
我在初始化定时器时加Power_setConstraint(PowerCC26XX_SB_DISALLOW)限制了进standby。
我只需要进IDLE,程序为HWREG(PRCM_BASE +PRCM_O_PDCTL1VIMS)&= ~PRCM_PDCTL1VIMS_ON; PRCMCacheRetentionEnable();PRCMPowerDomainOff(PRCM_DOMAIN_CPU);SysCtrlAonSync(); PRCMDeepSleep()
这个会进standby吗?
并且不是每次都有40多微妙延时,更多的是12微妙左右(正常idle到active时间)

只想进IDLE,到底该什么语句

谢谢

Felix ZF:

回复 mingfeng fan:

功耗控制都是由TI-RTOS进行的,只要让app task都处于pending就行了,不需要在应用中添加进入sleep的语句的。

mingfeng fan:

回复 Felix ZF:

我以前没有用过带操作系统的,我程序中也只有一个任务,所以就用了这些指令进入idle,这一个任务中有while死循环就是判断各种标志,我怎么pending呢,用什么函数吗
谢谢

Felix ZF:

回复 mingfeng fan:

你可以使用event,在while中用Event_pend()将task block掉,在你原来设置各种标志位的地方使用Event_post(),触发之前被block的task继续执行。
关于event相关API的使用说明,可以参考
dev.ti.com/…/Event.html
另外,SDK中的rfWsnConcentrator和rfWsnNode例程中也都用到了event,也可以参考。

mingfeng fan:

回复 Felix ZF:

好,我试试
谢谢

mingfeng fan:

回复 Felix ZF:

Felix_ZF
我用Semaphore方式简单试了一下,发现定时器和设置不一样了,设置125us,实际变成121us,8个周期后,有一个150us.以此循环。感觉还是进入standby
与用Task_sleep()一个现象
那怎么才能阻止进入standby呢
我定时器中断设置前面加了Power_setConstraint(PowerCC26XX_SB_DISALLOW);这个不管用吗
我初始化Timer的程序如下/* Switches the peripheral power domain on */Power_setDependency(PowerCC26XX_PERIPH_GPT2);/* Prevents the controller from going to standby */Power_setConstraint(PowerCC26XX_SB_DISALLOW);// register ISR and enable hardware interrupt for timerHwi_Params params;Hwi_Params_init(&params);params.enableInt = TRUE;params.priority = 1;Hwi_construct(&timerHwi, INT_GPT2A, &interruptTimerA, &params, NULL);/* Configure the timer hardware */TimerDisable(GPT2_BASE, TIMER_A);TimerConfigure(GPT2_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIODIC | TIMER_CFG_B_ONE_SHOT);//TIMER_CFG_B_ONE_SHOTTimerPrescaleSet(GPT2_BASE, TIMER_A, 9); // prescaler is 256 – 187.5 kHzTimerLoadSet(GPT2_BASE, TIMER_A, 600); // a random numberTimerIntClear(GPT2_BASE, TIMER_TIMA_TIMEOUT);TimerIntEnable(GPT2_BASE, TIMER_TIMA_TIMEOUT);TimerEnable(GPT2_BASE, TIMER_A);

另外中断优先级用什么命令置,我这个没设上

谢谢

mingfeng fan:

回复 Felix ZF:

Felix_ZF
我用Semaphore方式简单试了一下,发现定时器和设置不一样了,设置125us,实际变成121us,8个周期后,有一个150us.以此循环。感觉还是进入standby
与用Task_sleep()一个现象
那怎么才能阻止进入standby呢
我定时器中断设置前面加了Power_setConstraint(PowerCC26XX_SB_DISALLOW);这个不管用吗
我初始化Timer的程序如下/* Switches the peripheral power domain on */Power_setDependency(PowerCC26XX_PERIPH_GPT2);/* Prevents the controller from going to standby */Power_setConstraint(PowerCC26XX_SB_DISALLOW);// register ISR and enable hardware interrupt for timerHwi_Params params;Hwi_Params_init(&params);params.enableInt = TRUE;params.priority = 1;Hwi_construct(&timerHwi, INT_GPT2A, &interruptTimerA, &params, NULL);/* Configure the timer hardware */TimerDisable(GPT2_BASE, TIMER_A);TimerConfigure(GPT2_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIODIC | TIMER_CFG_B_ONE_SHOT);//TIMER_CFG_B_ONE_SHOTTimerPrescaleSet(GPT2_BASE, TIMER_A, 9); // prescaler is 256 – 187.5 kHzTimerLoadSet(GPT2_BASE, TIMER_A, 600); // a random numberTimerIntClear(GPT2_BASE, TIMER_TIMA_TIMEOUT);TimerIntEnable(GPT2_BASE, TIMER_TIMA_TIMEOUT);TimerEnable(GPT2_BASE, TIMER_A);

另外中断优先级用什么命令置,我这个没设上

谢谢

Felix ZF:

回复 mingfeng fan:

在下面代码中,将enablePolicy设成false,可以强制不让系统进入standby。
但是这样会增加系统的功耗,建议仅在调试阶段使用。

/**=============================== Power ===============================*/
#include <ti/drivers/Power.h>
#include <ti/drivers/power/PowerCC26XX.h>

const PowerCC26XX_Config PowerCC26XX_config = {.policyInitFxn= NULL,.policyFxn= &PowerCC26XX_standbyPolicy,.calibrateFxn= &PowerCC26XX_calibrate,.enablePolicy= true,.calibrateRCOSC_LF= true,.calibrateRCOSC_HF= true,
};

赞(0)
未经允许不得转载:TI中文支持网 » CC1310 IDLE 模式下硬件定时器中断被打断
分享到: 更多 (0)