原创 CC2510芯片功能学习:睡眠定时器(Sleep Timer)(转)

2011-3-2 10:40 6088 8 8 分类: 通信

睡眠定时器用来控制芯片从睡眠模式PM0/PM1/PM2中退出,返回到激活模式(active mode)。


 


睡眠定时器包含一个31比特的计数器。可以对睡眠定时器定义一个0事件(Event 0),当0事件发生时,芯片从PM0/PM1/PM2返回到激活模式。


 


睡眠定时器不能在PM3模式和激活模式下工作。


 


两次连续的0事件之间的时间tEvent0由下面的公式决定。(注:datasheet的这段文字产生了歧义:前文说睡眠定时器只能在PM0-2模式下工作,那么当第1次0事件发生,芯片从回到激活模式,运行处理代码,到再进入睡眠模式的这段时间,是否纳入在tEvent0的范围?)


 


若使用低功耗RC振荡器:


  tEvent0=750/fref * EVENT0 * 25*WOR_RES



若使用晶振:


  tEvent0=1/32768 * EVENT0 * 25*WOR_RES


 



上式中的EVENT0由WOREVT1.EVENT0与WOREVT0.EVENT0设定,幂由 WORCTRL.WOR_RES设定。


 


从芯片进入PM2到下一0事件发生之间的时间有个规定的最小值,大约为12ms。


 


EVENT0的值必须在芯片进入睡眠模式之前设置。


 


Reset睡眠定时器,设置EVENT0、进入睡眠模式的典型代码为:


WORCTRL |= 0x04; // Reset Sleep Timer


char temp = WORTIME0;


while(temp == WORTIME0); // Wait until a positive 32 kHz edge


temp = WORTIME0;


while(temp == WORTIME0); // Wait until a positive 32 kHz edge


WOREVT1 = desired event0; // Set Event0, high byte


WOREVT0 = desired event0; // Set Event0, low byte


PCON |= 0x01; // Enter PM


 


 


中断:


若0事件发生,则WORIRQ.EVENT0_FLAG事件标志被置位,若中断屏蔽位WORIRQ. EVENT0_MASK=1,则中断标志位IRCON.STIF被置位,如果中断允许IEN0.STIE=1,则产生中断。


 


注:如果电源模式SLEEP.MODE≠00,则不会产生中断。


 


若0事件发生,可以用来触发DMA,称为DMA trigger ST。


 


与sleep timer相关的寄存器有6个:


WORTIME0 (0xA5) - Sleep Timer Low Byte


WORTIME1 (0xA6) - Sleep Timer High Byte


WOREVT1 (0xA4) - Sleep Timer Event0 Timeout High


WOREVT0 (0xA3) - Sleep Timer Event0 Timeout Low


WORCTRL (0xA2) - Sleep Timer Control


WORIRQ (0xA1) - Sleep Timer Interrupt Control


 


 


WOR_RES在WORCTRL中,RES是resolution的意思,用来控制时间精度。其取值:


取值

精度

WORTIME对应31比特计数器中的比特范围

00

1个时钟周期

15:0

01

25个时钟周期

20:5

10

210个时钟周期

25:10

11

215个时钟周期

30:15


 


 


理解:


 


31比特计数器是一个自由运行的计数器,其驱动时钟是晶振或者RC时钟。


 


根据WORCTRL. WOR_RES的取值从31比特计数器中选出16比特,一方面显示在WORTIME0和WORTIME1寄存器中,另一方面用来与WOREVT1和WOREVT0中的值比较。WORTIME每递增WOREVT下就产生1次0事件。


 


当WOR_RES的值越大,从31比特计数器中选出的16比特的位置越高,WORTIME递增1下需要的时钟周期也越多,因此延时也越长。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
8
关闭 站长推荐上一条 /3 下一条