您的位置:首页 > 其它

嵌入式成长轨迹57 【Zigbee项目】【CC2430基础实验】【定时唤醒】

2012-09-01 18:39 453 查看
这个实验利用睡眠定时器工作在多个电源模式下这一特性来实现定时唤醒,最长的唤醒时隔为8 分32 秒,而最短的时隔可达 30余微秒。实验中在设定好唤醒时间后让 CC2430进入PM2 模式,在达到指定时间后小灯闪烁,之后再次是设定唤醒时间,进入PM2 ,唤醒的循环。

void Init_SLEEP_TIMER(void) ;
函数原型:

void Init_SLEEP_TIMER(void)
{
EA = 1;  // 开中断
STIE = 1;
STIF = 0;
}


函数功能: 打开睡眠定时器(ST)的中断,并且将ST的中断标志位清零。在使用ST时必须于addToSleepTimer() 前调用本函数。

void addToSleepTimer(UINT16 sec) ;
函数原型:

void addToSleepTimer(UINT16 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;
}


函数功能:设置睡眠时间,在sec 秒以后由 ST唤醒CC2430,在调用这个函数之前必须先调用Init_SLEEP_TIMER (),否则不能唤醒CC2430。通常在这个函数以后会出现SET_POWER_MODE(2)语句。

/*****************************************
//        For:
//        emot.h
*****************************************/
#ifndef EMOT_H
#define EMOT_H

#include <ioCC2430.h>

/*****************************************
//定义类型
*****************************************/
#define uchar unsigned char
#define uint unsigned int
#define UINT8 uchar
#define UINT16 unsigned int
#define UINT32 unsigned long

/*****************************************
//定义常量
*****************************************/
#ifndef FALSE
#define FALSE 0
#endif

#ifndef TRUE
#define TRUE 1
#endif

#ifndef NULL
#define NULL 0
#endif

#ifndef HIGH
#define HIGH 1
#endif

#ifndef LOW
#define LOW 0
#endif

/*****************************************
//LED 使能控制
*****************************************/
#define LED_ENABLE(val)                 \
do{                                   \
if(val==1)                          \
{                                 \
P1SEL &= ~0X03;                 \
P1DIR |= 0X03;                  \
RLED = 1;                       \
GLED = 1;                       \
}                                \
else                              \
{                                 \
P1DIR &= ~0X03;                 \
}                                 \
}while(0)

#define RLED P1_0
#define GLED P1_1

/*****************************************
//选择主时钟,关闭不用的时钟
*****************************************/
#define SET_MAIN_CLOCK_SOURCE(source) \
do {                                   \
if(source) {                            \
CLKCON |= 0x40;  /*RC*/               \
while(!(SLEEP&0X20));  /*待稳*/       \
SLEEP |= 0x04;         /*关掉不用的*/ \
}                                       \
else {                                  \
SLEEP &= ~0x04;  /*全开*/             \
while(!(SLEEP&0X40));/*待稳*/         \
asm("NOP");                           \
CLKCON &= ~0x47; /*晶振*/             \
SLEEP |= 0x04;   /*关掉不用的*/       \
}                                       \
}while (0)

#define CRYSTAL 0
#define RC 1

/*****************************************
//选择低速时钟
*****************************************/
#define SET_LOW_CLOCK(source)                                \
do{                                                   \
(source==RC)?(CLKCON |= 0X80):(CLKCON &= ~0X80); \
}while(0)

//Macro for setting the clock tick for timer3 or 4
#define TIMER3_START(val)                         \
(T##timer##CTL = (val) ? T##timer##CTL | 0X10 : T##timer##CTL&~0X10)

#define TIMER3_SET_CLOCK_DIVIDE(timer,val)        \
do{                                             \
T##timer##CTL &= ~0XE0;                               \
(val==2) ? (T##timer##CTL|=0X20):                   \
(val==4) ? (T##timer##CTL|=0x40):                   \
(val==8) ? (T##timer##CTL|=0X60):                   \
(val==16)? (T##timer##CTL|=0x80):                   \
(val==32)? (T##timer##CTL|=0xa0):                   \
(val==64) ? (T##timer##CTL|=0xc0):                  \
(val==128) ? (T##timer##CTL|=0XE0):                 \
(T##timer##CTL|=0X00);             /* 1 */          \
}while(0)

//Macro for setting the mode of timer3 or 4
#define TIMER3_SET_MODE(timer,val)                \
do{                                             \
T##timer##CTL &= ~0X03;                               \
(val==1)?(T##timer##CTL|=0X01):  /*DOWN            */ \
(val==2)?(T##timer##CTL|=0X02):  /*Modulo          */ \
(val==3)?(T##timer##CTL|=0X03):  /*UP / DOWN       */ \
(T##timer##CTL|=0X00);           /*free runing */     \
}while(0)

#define SET_POWER_MODE(mode)                   \
do {                                        \
if(mode == 0)        { SLEEP &= ~0x03; } \
else if (mode == 3)  { SLEEP |= 0x03;  } \
else { SLEEP &= ~0x03; SLEEP |= mode;  } \
PCON |= 0x01;                            \
asm("NOP");                              \
}while (0)

/*****************************************
//开启电池板上的按键
*****************************************/
#define USE_Key_ON_BT()             \
#define USE_Key_ON_BT()             \
do{                 \
//P1DIR &= ~0X0C; /*按键在P12 P13*/
//P1INP &= ~0x0c; //上、下拉

P0DIR&=~0X60; /*按键在P05 P06*/  \
P0INP|=0X60;                     \
P2INP |= 0x40;                   \

}while(0)

#endif //EMOT_H


//main.c

#include <emot.h>

/*****************************************
//初始化Sleep Timer
*****************************************/
void Init_SLEEP_TIMER(void)
{
EA = 1;  //开中断
STIE = 1;
STIF = 0;
}

/*****************************************
//设置Sleep Timer唤醒时间
//sec :间隔时间,单位为秒
//无返回
*****************************************/
void addToSleepTimer(UINT16 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 Delay(uint n)
{
uint jj;
for(jj=0;jj<n;jj++);
for(jj=0;jj<n;jj++);
for(jj=0;jj<n;jj++);
for(jj=0;jj<n;jj++);
for(jj=0;jj<n;jj++);
}

/*****************************************
//LED闪烁函数
*****************************************/
void LedGlint(void)
{
uchar jj=10;
while(jj--)
{
RLED = !RLED;
Delay(10000);
}
}

/*********************************************************************
//主函数
*********************************************************************/
void main(void)
{
SET_MAIN_CLOCK_SOURCE(CRYSTAL);
SET_LOW_CLOCK(CRYSTAL);
LED_ENABLE(1);
RLED = 1;
GLED = 0;

Init_SLEEP_TIMER();
while(1)
{
addToSleepTimer(10);
SET_POWER_MODE(2);
LedGlint();
GLED = ~GLED;
}
}

#pragma vector = ST_VECTOR
__interrupt void ST_ISR(void)
{
STIF = 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐