嵌入式成长轨迹54 【Zigbee项目】【CC2430基础实验】【系统睡眠工作状态】

 


本实验在小灯闪烁10 次以后进入低功耗模式 PM3 。CC2430 一共有4 种功耗模式,分别是PM0,PM1,PM2,PM3,以 PM3 功耗最低。


SLEEP (0xBE) - Sleep mode control
0X03:0000 0011
bit7 -  Unused
bit6  XOSC_STB  XOSC stable status:
 0 – XOSC is not powered up or not yet stable
 1 – XOSC is powered up and stable
bit5  HFRC_STB  RCOSC stable status:
 0 – HF RCOSC is not powered up or not yet stable
 1 – HF RCOSC is powered up and stable
bit4:3  RST[1:0]   Status bit indicating the cause of the last reset. If there are multiple resets, the register will only contain the last event.
 00 – Power-on reset
 01 – External reset 
 10 – Watchdog timer reset
bit2  OSC_PD  XOSC and HF RCOSC power down setting. The bit shall be cleared if the OSC bit is toggled. Also, if there is a calibration in progress and the CPU attempts to set the bit the module shall update the bit only at the end of calibration:
 0 – Both oscillators powered up
 1 – Oscillator not selected by OSC bit powered down
bit1:0  MODE[1:0]   Sleep mode setting:
 00 – Power mode 0
 01 – Power mode 1
 10 – Power mode 2
 11 – Power mode 3


/************************************************************** 
* mode   0   1  2 3
*   PM0 PM1 PM2 PM3   
****************************************************************/


重要的宏定义
设置CC2430功耗模式,选定后立刻进入相应功耗模式。 

1 #define SET_POWER_MODE(mode)                   \ 
2    do {                                        \ 
3       if(mode == 0)        { SLEEP &= ~0x03; } \ 
4       else if (mode == 3)  { SLEEP |= 0x03;  } \ 
5       else { SLEEP &= ~0x03; SLEEP |= mode;  } \ 
6       PCON |= 0x01;                            \ 
7       asm("NOP");                              \ 
8    }while (0) 

 


 


PCON (电源模式控制寄存器)
7:2 -   未用
1 -  未用,读出为0
0 IDLE   电源模式控制,写1 将进入由SLEEP.MODE 指定的电源模式,读出一定为0

 

     NOP指令即“空指令”,在x86的CPU中机器码为0x90(144)。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令,所以NOP指令自然也会占用执行一个指令的CPU时间片。
   常用于程序延时或精确计时,不过在较快的CPU上不明显。
   主要作用:
   1、字节填充对齐
   2、精确延时和计时
   3、破解程序的call验证
   4、等待其他设备执行完毕
   5、清除由上一个算术逻辑指令设置的flag位
   6、辅助jmp、call等指令

 

功耗测定方法
将本次实验的程序写入CC2430 模块,将测量电流表串接入 CC2430 模块的供电电路,待小灯信步闪烁后测电流,然后根据P = U*I即可得到功率,提示:可以在程序中将小灯关闭,进一步降低功耗。

 

 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 /**************************************************************    
13 * mode   0      1     2    3
14 *      PM0    PM1    PM2    PM3            
15 ****************************************************************/
16 #define SET_POWER_MODE(mode)                   \
17    do {                                        \
18       if(mode == 0)        { SLEEP &= ~0x03; } \
19       else if (mode == 3)  { SLEEP |= 0x03;  } \
20       else { SLEEP &= ~0x03; SLEEP |= mode;  } \
21       PCON |= 0x01;                            \
22       asm("NOP");                              \
23    }while (0)
24 
25 #define CRYSTAL 0x00
26 #define RC      0x01
27 
28 
29 void Delay(void);
30 void Initial(void);
31 
32 /****************************************************************
33 *函数功能:延时                        
34 *入口参数:无                            
35 *返回值  :无                            
36 *说  明    :可在宏定义中改变延时长度            
37 ****************************************************************/
38 void Delay(void)
39 {
40     uint tt;
41     for(tt = 0;tt<DELAY;tt++);
42     for(tt = 0;tt<DELAY;tt++);
43     for(tt = 0;tt<DELAY;tt++);
44     for(tt = 0;tt<DELAY;tt++);
45     for(tt = 0;tt<DELAY;tt++);
46 }
47 
48 /****************************************************************
49 *    函数功能:初始化I/O,控制LED                            
50 *    入口参数:无                        
51 *    返回值    :无                        
52 *    说  明    :初始化完成后关灯                
53 ****************************************************************/
54 void Initial(void)
55 {
56     //P1 out
57     P1DIR = 0x03;     //定义P1_0,P1_1为输出
58     RLED = 1;
59     YLED = 1;         //close led
60 }
61 
62 /****************************************************************
63 *    函数功能:主函数                    
64 *    入口参数:                    
65 *    返回值    :无                        
66 *    说  明    :10次绿色LED闪烁后进入睡眠状态            
67 ****************************************************************/
68 void main()
69 {
70     uchar count = 0;
71     Initial();
72     RLED = 0;       //开红色LED,系统工作指示
73     Delay();        //延时
74     Delay();
75     Delay();
76     Delay();
77 
78     while(1)
79     {
80         YLED = !YLED;
81         count++;
82         if(count == 20)SET_POWER_MODE(3);
83         //10次闪烁后进入睡眠状态
84 
85         //Delay();
86         Delay();
87                 //延时函数无形参,只能通过改变系统时钟频率
88                 //来改变小灯的闪烁频率
89     };
90 }

 

posted @ 2012-09-01 18:30  MooreZHENG  阅读(287)  评论(0编辑  收藏  举报