按照之前对datasheet的理解:
1、31比特计数器是一个自由运行的计数器,其驱动时钟是晶振或者RC时钟。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
2、根据WORCTRL. WOR_RES的取值从31比特计数器中选出16比特,一方面显示在WORTIME0和WORTIME1寄存器中,另一方面用来与WOREVT1和WOREVT0中的值比较。WORTIME每递增WOREVT下就产生1次0事件。
3、歧义:前文说睡眠定时器只能在PM0-2模式下工作,那么当第1次0事件发生,芯片从回到激活模式,运行处理代码,到再进入睡眠模式的这段时间,是否纳入在tEvent0的范围?
这些理解是否对呢?写个程序来测试一下。
//测试1:定时取Sleep Timer的计数器的值。
modInitSleepTimer(1, 10000, 0); //该方法设置WORCTL=1,WOREVT=10000
while (1) {
modWait(255);
modWait(255);
modWait(255);
modWait(255);
pBuffer[1]= WORTIME0;
pBuffer[0]= WORTIME1;
modUartSendPkt(0, 2, pBuffer); //该方法将pBuffer的数据通过串口发往PC
P1_0 = !P1_0; //toggle led
}
PC通过串口得到的数据为:
00 41 , 04 F2 , 09 A4 , 0E 55 , 13 07 , 17 B8 , 1C 6A , 21 1B , 25 CD , 03 6E , 08 20 , 0C D1 , 11 83 , 16 34 , 1A E6 , 1F 97 , 24 49 , 01 EA , 06 9C , 0B 4D , 0F FF , 14 B0 , 19 62 , 1E 13 , 22 C5 , 00 66
前后值相差:1201或1202(dec)
从该实验可以证明:
1、 即使在active状态下,Sleep Timer的计数器仍然在计数;
2、 Sleep Timer的计数器在计数到WOREVT1*256+WOREVT0的值时,自动回0;
另外还可以得到以下结论:
1、 读WORTIME的顺序是先读WORTIME0再读WORTIME1;
2、 若使用32k晶振作为本振,当WOR_RES取1时,Sleep Timer的time tick约1ms,当WOREVT的值为1024时,对应延时1秒;相应地推算,WOR_RES=2时,time tick约4ms,WOR_RES=3时,time tick约8ms;
以上数据是在Sleep Timer初始化时不重启计数器时取得的。
文章评论(0条评论)
登录后参与讨论