且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

zigbee学习之睡眠定时器

更新时间:2022-01-20 23:30:32

睡眠定时器:


void InitSleepTimer(void) 

    ST2 = 0x00; //设置时间
    ST1 = 0x00; 
    ST0 = 0x00; 
    EA = 1;     //开中断 
    STIE = 1;   //睡眠定时器中断使能 0: 中断禁止     1: 中断使能
    STIF = 0;   //睡眠定时器中断标志 0: 无中断未决   1: 中断未决
}




void SysPowerMode(uchar mode) //设置系统睡眠模式 mode等于0为PM0 1为PM1 2为PM2 3为PM3  

    if(mode < 4) 
    {  
        SLEEPCMD |= mode;    //设置系统睡眠模式 
        PCON = 0x01;         //进入睡眠模式 ,通过中断唤醒
    } 
    else 
        PCON = 0x00;         //通过中断唤醒系统 
}


#pragma vector = ST_VECTOR (中断向量)
__interrupt void ST_ISR(void) 

    STIF = 0;          //清标志位
    SysPowerMode(4);   //进入正常工作模式



void Set_ST_Period(uint sec) //设置睡眠时间 

    ulong sleepTimer = 0; 
    
    sleepTimer |= ST0; 
    sleepTimer |= (ulong)ST1 <<  8; 
    sleepTimer |= (ulong)ST2 << 16; //当前的值 
    sleepTimer += ((ulong)sec * (ulong)32768); //32768定时1s。
    ST2 = (uchar)(sleepTimer >> 16); 
    ST1 = (uchar)(sleepTimer >> 8); 
    ST0 = (uchar) sleepTimer; 
}
main函数中:
    InitSleepTimer();        //初始化休眠定时器
Set_ST_Period(5);   //设置睡眠时间,睡眠5秒后唤醒系统
SysPowerMode(2);    //重新进入睡眠模式PM2 当时间到达的时候进入中断,中断里面唤醒睡眠模式


电源管理寄存器如下:
PCON
[7:1] 未使用。总是写作 0000 000 。
[0 ]供电模式控制。写 1 到该位强制设备进入 SLEEP.MODE注意 (MODE=0x00 且 IDLE = 1
将停止 CPU 内核活动)设置的供电模式,这位读出来一直是 0 。当活动时,所有的使能
中断将清除这个位,设备将重新当活动时,所有进入主动模式。


SLEEPCMD
[7]  禁用32kHzRC振荡器校准 0:使能32kHzRC振荡器校准 1:禁用32kHzRC振荡器校准这个
设置可以在任何时间写入,但是在芯片运行在 16MHz 高频 RC 振荡器之前不起作用。
[6 :3] 保留
[2]总是写作 1 保留
[1:0] 供电 模式设置
0 0 : 主动 / 空闲模式
0 1 : 供电 模式 1
1 0 : 供电 模式 2
1 1 : 供电 模式 3//深度睡眠模式,只能复位或者中断唤醒


睡眠模式3(深度睡眠只能够复位或者外部中断来唤醒)
下面这两项是不用设置的,因为用到的外部中断,跟内部的睡眠定时器中断没有关系。
STIE = 0;   //睡眠定时器中断使能 0: 中断禁止     1: 中断使能
STIF = 0;   //睡眠定时器中断标志 0: 无中断未决   1: 中断未决


#pragma vector = P0INT_VECTOR 
__interrupt void P0_ISR(void) 

    if(P0IFG > 0) 
    { 
        P0IFG = 0;           //清标志位
    } 
    
    P0IF = 0; 
    SysPowerMode(4);         //正常工作模式