嵌入式成长轨迹55 【Zigbee项目】【CC2430基础实验】【系统唤醒】
本次实验使能外部I/O 中断唤醒CC2430,每次唤醒红色 LED 闪烁10 次,然后进入低功耗模式,在进入PM3 之前程序会将两个LED 灯关闭。在应用中也可以不关闭以指示CC2430处于低功耗模式,可以中断激活。
void PowerMode(uchar sel);
函数原型:
1 void PowerMode(uchar sel) 2 { 3 uchar i,j; 4 i = sel; 5 if(sel<4) 6 { 7 SLEEP &= 0xfc; 8 SLEEP |= i; 9 for(j=0;j<4;j++); 10 PCON = 0x01; 11 } 12 else 13 { 14 PCON = 0x00; 15 } 16 }
函数功能:使系统进入sel 指定的电源模式下,这里的 sel 只能是 0-3 之间的数,程序只能在CPU 全速运行时执行,也就是说函数中能使系统从全速运行进入 PM0-PM3 而不可以从PM0-PM3进入全速运行
1 //main.c 2 #include <ioCC2430.h> 3 4 #define uint unsigned int 5 #define uchar unsigned char 6 #define DELAY 10000 7 8 //小灯控端口定义 9 #define RLED P1_0 10 #define YLED P1_1 11 12 void Delay(void); 13 void Init_IO_AND_LED(void); 14 void PowerMode(uchar sel); 15 16 /**************************************************************** 17 *函数功能:延时 18 *入口参数:无 19 *返回值 :无 20 *说 明 :可在宏定义中改变延时长度 21 ****************************************************************/ 22 void Delay(void) 23 { 24 uint tt; 25 for(tt = 0;tt<DELAY;tt++); 26 for(tt = 0;tt<DELAY;tt++); 27 for(tt = 0;tt<DELAY;tt++); 28 for(tt = 0;tt<DELAY;tt++); 29 for(tt = 0;tt<DELAY;tt++); 30 } 31 32 /**************************************************************** 33 *函数功能:初始化电源 34 *入口参数:para1,para2,para3,para4 35 *返回值 :无 36 *说 明 :para1,模式选择 37 * * 38 * para1 0 1 2 3 * 39 * mode PM0 PM1 PM2 PM3 * 40 * * 41 ****************************************************************/ 42 void PowerMode(uchar sel) 43 { 44 uchar i,j; 45 i = sel; 46 if(sel<4) 47 { 48 SLEEP &= 0xfc; 49 SLEEP |= i; 50 for(j=0;j<4;j++); 51 PCON = 0x01; 52 } 53 else 54 { 55 PCON = 0x00; 56 } 57 } 58 59 /**************************************************************** 60 * 函数功能:初始化I/O,控制LED 61 * 入口参数:无 62 * 返回值 :无 63 * 说 明 :初始化完成后关灯 64 ****************************************************************/ 65 void Init_IO_AND_LED(void) 66 { 67 /* 68 P1DIR = 0X03; 69 RLED = 1; 70 YLED = 1; 71 72 P1SEL &= ~0X0C; 73 P1DIR &= ~0X0C; 74 P1INP &= ~0X0c;//有上拉、下拉 75 P2INP &= ~0X40; //选择上拉 76 77 P1IEN |= 0X0c; //P12 P13 78 PICTL |= 0X02; //下降沿 79 80 EA = 1; 81 IEN2 |= 0X10; //P1IE = 1; 82 83 P1IFG |= 0x00; //P12 P13 84 */ 85 P1DIR = 0X03; //0为输入(默认),1为输出 86 RLED = 0; 87 GLED = 1; 88 89 P0SEL&=~0X60; 90 P0DIR&=~0X60; 91 92 P0INP|=0X60;//有上拉、下拉 93 94 /* 95 P1IEN |= 0X0c; //P12 P13 96 PICTL |= 0X02; //下降沿 97 */ 98 PICTL |= 0X11; //P0口中断允许,下降沿触发 99 100 EA = 1; 101 //IEN2 |= 0X10; // P1IE = 1; 102 IEN1 |= 0X20; // P0IE = 1 103 104 //P1IFG &= ~0x0C; //P12 P13中断标志清0 105 P0IFG &= ~0x60; //P05 P06中断标志清0 106 }; 107 /**************************************************************** 108 * 函数功能:主函数 109 * 入口参数: 110 * 返回值 :无 111 * 说 明 :10次绿色LED闪烁后进入睡眠状态 112 ****************************************************************/ 113 void main() 114 { 115 uchar count = 0; 116 Init_IO_AND_LED(); 117 118 RLED = 0 ; //开红色LED,系统工作指示 119 Delay(); //延时 120 Delay(); 121 Delay(); 122 Delay(); 123 124 while(1) 125 { 126 YLED = !YLED; 127 RLED = 0; 128 count++; 129 if(count >= 20) 130 { 131 count = 0; 132 RLED = 1; 133 PowerMode(3); 134 //10次闪烁后进入睡眠状态 135 } 136 137 //Delay(); 138 Delay(); 139 //延时函数无形参,只能通过改变系统时钟频率 140 //来改变小灯的闪烁频率 141 }; 142 } 143 144 /***************************************** 145 //唤醒系统 146 *****************************************/ 147 #pragma vector = P0INT_VECTOR 148 __interrupt void P0_ISR(void) 149 { 150 if(P0IFG>0) 151 { 152 P0IFG = 0; 153 } 154 P1IF = 0; 155 }