嵌入式成长轨迹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  }
原文地址:https://www.cnblogs.com/zeedmood/p/2666942.html