睡眠定时器用来控制芯片从睡眠模式PM0/PM1/PM2中退出,返回到激活模式(active mode)。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
睡眠定时器包含一个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
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
若使用晶振:
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下需要的时钟周期也越多,因此延时也越长。
文章评论(0条评论)
登录后参与讨论