下面是我的RFD的部分程序,要实现的是进入while循环后系统休眠100MS,然后进睡眠定时器唤醒,开中断开始同协调器(coord)通讯,既发送接收数据5次,然后进入休眠100ms,被唤醒发送接收数据5次,休眠,唤醒,接收发送……
但是当进了睡眠定时器的中断出来,开始从下面程序的DISABLE_GLOBAL_INTERRUPT(); IEN0 = IEN0 & ~(1<<5); 依次往下运行倒是没有问题,但是就是不能通过无线接收发送数据了,协调器(coord)也不往 RFD发送数据了!不知道是还没有唤醒,还是少写了一些关键接收发送的程序,不是进了睡眠定时器的中断就可以唤醒了吗?还是在睡眠定时器里难道还要有专门的语句来唤醒呀?是什么呀?呵呵但是进了睡眠定时器后又回到主程序了,不是就代表被唤醒了吗?呵呵!问题多多呀!!!
我在网上搜到一个参考程序你们也可以看一下http://blog.csdn.net/beeboobeeboo/archive/2009/08/26/4485119.aspx 我不太懂,不过我的程序确实比人家少了些东西,但是又不知道少的是什么???它的一些子程序没有共享出来呢!
希望高手们帮我解答一下上面的问题哦!(*^__^*) 嘻嘻……谢谢谢谢!!!
while(1)
{
void halSleep_set(100)
{
UINT32_UNION t;
UINT32 delta;
BYTE i;
SAVE_AND_DISABLE_GLOBAL_INTERRUPT(gie_status);//保存中断的状态,并屏蔽
//read the sleep timer
delta = (32768 * msecs)/1000;
t.bytes[UINT32_LOWORD_LSB] = ST0;
t.bytes[UINT32_LOWORD_MSB] = ST1;
t.bytes[UINT32_HIWORD_LSB] = ST2;
//给睡眠定时器赋比较值compute the compare value
t.val = (t.val + delta)&0x00FFFFFF;
//write the new sleep timer value
ST2 = t.bytes[UINT32_HIWORD_LSB];
ST1 = t.bytes[UINT32_LOWORD_MSB];
ST0 = t.bytes[UINT32_LOWORD_LSB];
//clear the sleep flag, enable the interrupt
IRCON = IRCON & 0x7F; //clear the sleep flag IRCON.STIF = 0;
IEN0 = IEN0 | (1<<5); //enable the interrupt IEN0.STIE = 1;
ENABLE_GLOBAL_INTERRUPT(); //开中断interrupts must be enabled to wakeup!
//configure the power mode and sleep
SET_POWER_MODE(POWER_MODE_2); //设置进入省电模式2(既休眠模式2)
DISABLE_GLOBAL_INTERRUPT(); //关中断
IEN0 = IEN0 & ~(1<<5); // IEN0.STIE = 0;//清标志位
while(!XOSC_STABLE);
asm("NOP");
RESTORE_GLOBAL_INTERRUPT(gie_status); //还原进入休眠之前所在的中断。
ISRXON;
ISTXON;
conPrintROMString("\n DDDDFFFGGG\n ");
ppState = PP_STATE_START_RX;
for(i=0;i<5;i++)
{
PingPong(); //无线接收发送子程序
}
}
}
文章评论(0条评论)
登录后参与讨论