你好
我现在做一个应用是接收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(¶ms);params.enableInt = TRUE;params.priority = 1;Hwi_construct(&timerHwi, INT_GPT2A, &interruptTimerA, ¶ms, 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(¶ms);params.enableInt = TRUE;params.priority = 1;Hwi_construct(&timerHwi, INT_GPT2A, &interruptTimerA, ¶ms, 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,
};
TI中文支持网
