微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > 玩转蓝牙4.0系列教程(第一季)-第九课 CC2540的睡眠唤醒应用二

玩转蓝牙4.0系列教程(第一季)-第九课 CC2540的睡眠唤醒应用二

时间:10-02 整理:3721RD 点击:

下面为大家介绍通过睡眠计数器唤醒;时间到触发唤醒系统投入正常运行状态;

实验现象:LED1闪烁8次进入睡眠模式,然后又进入正常模式,周而复始。

寄存器配置:







ST2 = 0X00;

  ST1 = 0X0F;

  ST0 = 0X0F;

  EA = 1;     //开中断

  STIE = 1;   //SleepTimerinterrupt enable

  STIF = 0;   //SleepTimerinterrupt flag


源代码如下:


/**************************************************

** 本程序只供学习使用,未经作者许可,不得用于其它任何用途

** 蓝牙4.0底板开发板

** 作者: shizhe

** 创始时间:2014-05-08

** 修改人:shizhe

** 修改时间:2014-05-08

** 修改人:shizhe

** 修改时间:2014-05-08

** 描述:  

**  睡眠状态下睡眠计数器唤醒…

** 版权所有,盗版必究。

** All rights reserved

*************************************************/



#include<ioCC2540.h>

#define uint unsigned int

#define uchar unsigned char

#define UINT8 unsigned char

#define UINT16 unsigned int

#define UINT32 unsigned long

#define LED1    P0_5

#define LED2    P1_0

#define LED3    P1_1

#define SWITCH1 P1_2


/****************************

         延时函数

*****************************/

void Delayms(uint xms)   //i=xms 即延时i毫秒

{

uint i,j;

for(i=xms;i>0;i--)

   for(j=600;j>0;j--);

}


/****************************

//初始化程序

*****************************/

void InitLed(void)

{

  P1SEL &= ~0x03;  //P1_0,P1_1定为普通IO口

  P1DIR |= 0x03;  //P1_0,P1_1定义为输出

  P0SEL &= ~0x20;  //P0_5定为普通IO口

  P0DIR |= 0x20;  //P0_5定义为输出

  LED1 = 0;       //LED1灯熄灭   

  LED2 = 0;       //LED2灯熄灭   

  LED3 = 0;       //LED3灯熄灭     

}

/****************************************************************

系统工作模式选择函数            

* para1  0  1 2 3         

* mode  PM0 PM1 PM2 PM3              

****************************************************************/

void SysPowerMode(uchar mode)

{

  uchar i,j;

  i = mode;

  if(mode<4)

  {   

    SLEEPCMD |= i;         // 设置系统睡眠模式

    for(j=0;j<4;j++);

    PCON = 0x01;           // 进入睡眠模式 ,通过中断打断

  }

  else

  {

    PCON = 0x00;         // 系统唤醒 ,通过中断打断

  }

}


/*****************************************

//初始化 Sleep Timer (设定后经过指定时间自行唤醒)

*****************************************/

void Init_SLEEP_TIMER(void)

{

  ST2 = 0X00;

  ST1 = 0X0F;

  ST0 = 0X0F;

  EA = 1;     //开中断

  STIE = 1;   //SleepTimerinterrupt enable

  STIF = 0;   //SleepTimerinterrupt flag

}


/*********************************************************************

//设置睡眠时间

*********************************************************************/

void Set_ST_Period(uint sec)

{

   UINT32 sleepTimer = 0;

   sleepTimer |= ST0;

   sleepTimer |= (UINT32)ST1 <<  8;

   sleepTimer |= (UINT32)ST2 << 16;

   sleepTimer += ((UINT32)sec * (UINT32)32768);

   ST2 = (UINT8)(sleepTimer >> 16);

   ST1 = (UINT8)(sleepTimer >> 8);

   ST0 = (UINT8) sleepTimer;

}


/***************************

//主函数

***************************/

void main(void)

{   

  uchar i;        

  InitLed();                 //调用初始化函数        

  Init_SLEEP_TIMER();    //初始化SLEEPTIMER

  while(1)

  {

    for(i=0;i<16;i++)    //闪烁8下

    {

      LED1=~LED1;

      Delayms(500);

    }

    Set_ST_Period(3);   //重新进入睡眠模式

    SysPowerMode(2);    //进入PM2低频晶振模式

  }

}

//中断唤醒

#pragma vector = ST_VECTOR

__interrupt void ST_ISR(void)

{

   STIF = 0;          //清标志位

   SysPowerMode(4);   //进入正常工作模式

}


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top