玩转蓝牙4.0系列教程(第一季)-第九课 CC2540的睡眠唤醒应用二
下面为大家介绍通过睡眠计数器唤醒;时间到触发唤醒系统投入正常运行状态;
实验现象: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); //进入正常工作模式
}