单片机学习小组
直播中

感谢相遇

9年用户 929经验值
擅长:嵌入式技术 制造/封装 控制/MCU
私信 关注

求分享cc2530睡眠定时器唤醒功耗模式PM2的代码

求分享cc2530睡眠定时器唤醒功耗模式PM2的代码

回帖(1)

叶冬琳

2022-1-25 10:43:34
//(睡眠定时器方式唤醒)
#include
typedef unsigned char uchar;
typedef unsigned int  uint;
typedef unsigned long ulong;
#define LED1 P1_0            //P1.0口控制LED1
#define LED2 P1_1            //P1.1口控制LED2


//延时函数msec 延时参数,值越大,延时越久
void DelayMS(uint msec)
{   uint i,j;
  for (i=0; i     for (j=0; j<535; j++);
}


//设置LED灯相应的IO口
void InitLed(void)
{   P1DIR |= 0x03;           //P1.0定义为输出口
  LED1 = 1;                //LED1灯上电默认为熄灭
}


//设置系统工作模式mode等于0为PM0 1为PM1 2为PM2 3为PM3
void SysPowerMode(uchar mode)
{
    if(mode < 4)
    {  
        SLEEPCMD  =00;
        SLEEPCMD |= mode;    //设置系统睡眠模式
        PCON = 0x01;         //进入睡眠模式 ,通过中断唤醒
    }


}


//中断处理函数
#pragma vector = ST_VECTOR
__interrupt void ST_ISR(void)
{
    STIF = 0;          //清标志位
    //SysPowerMode(0);   //进入正常工作模式
}


//初始化休眠定时器,设定后经过指定时间自行唤醒
void InitSleepTimer(void)
{
    ST2 = 0X00; //设置睡眠定时器初始值 ST2:ST1:ST0   必须按照这个顺序来写入
    ST1 = 0X0; //定时时钟为32K(rc或者xosc)
    ST0 = 0X0; //设置时间为3855个时钟
    EA = 1;     //开中断
    STIE = 1;   //睡眠定时器中断使能 0: 中断禁止     1: 中断使能
    STIF = 0;   //睡眠定时器中断标志 0: 无中断未决   1: 中断未决
}


//设置睡眠时间sec 睡眠时间
void Set_ST_Period(uint sec)
{
    ulong sleepTimer = 0;
    sleepTimer |= ST0; //设置睡眠定时器初始值
    sleepTimer |= (ulong)ST1 <<  8; //设置睡眠定时器初始值
    sleepTimer |= (ulong)ST2 << 16; //设置睡眠定时器初始值


    sleepTimer += ((ulong)sec * (ulong)32768); //加上一个睡眠时长值


    ST2 = (uchar)(sleepTimer >> 16); //设置对比终值,睡眠计数器运行时,会和ST2:ST1:ST0比较,若相等就唤醒
    ST1 = (uchar)(sleepTimer >> 8);
    ST0 = (uchar) sleepTimer;
}


void main(void)
{  
  uchar i=0;  
  InitLed();                 //设置LED灯相应的IO口     
  InitSleepTimer();        //初始化休眠定时器


  while(1)
  {
    for (i=0; i<6; i++)  //LED1闪烁3次提醒用户将进入睡眠模式
    {
      LED1 = ~LED1;
      DelayMS(500);
    }
    Set_ST_Period(5);   //设置睡眠时间,睡眠5秒后唤醒系统
    SysPowerMode(2);    //进入睡眠模式PM2
    LED2 = ~LED2;//醒过来后,接着这一句话执行
  }
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分