嵌入式成长轨迹57 【Zigbee项目】【CC2430基础实验】【定时唤醒】
2012-09-01 18:39
453 查看
这个实验利用睡眠定时器工作在多个电源模式下这一特性来实现定时唤醒,最长的唤醒时隔为8 分32 秒,而最短的时隔可达 30余微秒。实验中在设定好唤醒时间后让 CC2430进入PM2 模式,在达到指定时间后小灯闪烁,之后再次是设定唤醒时间,进入PM2 ,唤醒的循环。
void Init_SLEEP_TIMER(void) ;
函数原型:
函数功能: 打开睡眠定时器(ST)的中断,并且将ST的中断标志位清零。在使用ST时必须于addToSleepTimer() 前调用本函数。
void addToSleepTimer(UINT16 sec) ;
函数原型:
函数功能:设置睡眠时间,在sec 秒以后由 ST唤醒CC2430,在调用这个函数之前必须先调用Init_SLEEP_TIMER (),否则不能唤醒CC2430。通常在这个函数以后会出现SET_POWER_MODE(2)语句。
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; }
相关文章推荐
- 嵌入式成长轨迹55 【Zigbee项目】【CC2430基础实验】【系统唤醒】
- 嵌入式成长轨迹45【Zigbee项目】【CC2430基础实验】【外部中断】
- 嵌入式成长轨迹46 【Zigbee项目】【CC2430基础实验】【片内温度】
- 嵌入式成长轨迹47 【Zigbee项目】【CC2430基础实验】【1/3AVDD】
- 嵌入式成长轨迹48 【Zigbee项目】【CC2430基础实验】【AVDD】
- 嵌入式成长轨迹49 【Zigbee项目】【CC2430基础实验】【DMA】
- 嵌入式成长轨迹37 【Zigbee项目】【CC2430基础实验】【自动闪烁】
- 嵌入式成长轨迹50 【Zigbee项目】【CC2430基础实验】【单片机串口发数】
- 嵌入式成长轨迹51 【Zigbee项目】【CC2430基础实验】【在PC用串口控制LED】
- 嵌入式成长轨迹38 【Zigbee项目】【CC2430基础实验】【按键控制开关】
- 嵌入式成长轨迹52 【Zigbee项目】【CC2430基础实验】【在PC用串口收数并发数】
- 嵌入式成长轨迹39 【Zigbee项目】【CC2430基础实验】【按键控制闪烁】
- 嵌入式成长轨迹53 【Zigbee项目】【CC2430基础实验】【串口时钟PC显示】
- 嵌入式成长轨迹40 【Zigbee项目】【CC2430基础实验】【T1的使用】
- 嵌入式成长轨迹54 【Zigbee项目】【CC2430基础实验】【系统睡眠工作状态】
- 嵌入式成长轨迹41 【Zigbee项目】【CC2430基础实验】【T2的使用】
- 嵌入式成长轨迹42 【Zigbee项目】【CC2430基础实验】【T3的使用】
- 嵌入式成长轨迹56 【Zigbee项目】【CC2430基础实验】【睡眠定时器的使用】
- 嵌入式成长轨迹43 【Zigbee项目】【CC2430基础实验】【T4的使用】
- 嵌入式成长轨迹58 【Zigbee项目】【CC2430基础实验】【看门狗模式】