您的位置:首页 > 其它

嵌入式成长轨迹55 【Zigbee项目】【CC2430基础实验】【系统唤醒】

2012-09-01 18:32 423 查看
本次实验使能外部I/O 中断唤醒CC2430,每次唤醒红色 LED 闪烁10 次,然后进入低功耗模式,在进入PM3 之前程序会将两个LED 灯关闭。在应用中也可以不关闭以指示CC2430处于低功耗模式,可以中断激活。

void PowerMode(uchar sel);
函数原型:

void PowerMode(uchar sel)
{
uchar i,j;
i = sel;
if(sel<4)
{
SLEEP &= 0xfc;
SLEEP |= i;
for(j=0;j<4;j++);
PCON = 0x01;
}
else
{
PCON = 0x00;
}
}


函数功能:使系统进入sel 指定的电源模式下,这里的 sel 只能是 0-3 之间的数,程序只能在CPU 全速运行时执行,也就是说函数中能使系统从全速运行进入 PM0-PM3 而不可以从PM0-PM3进入全速运行

//main.c
#include <ioCC2430.h>

#define uint unsigned int
#define uchar unsigned char
#define DELAY 10000

//小灯控端口定义
#define RLED P1_0
#define YLED P1_1

void Delay(void);
void Init_IO_AND_LED(void);
void PowerMode(uchar sel);

/****************************************************************
*函数功能:延时
*入口参数:无
*返回值  :无
*说  明    :可在宏定义中改变延时长度
****************************************************************/
void Delay(void)
{
uint tt;
for(tt = 0;tt<DELAY;tt++);
for(tt = 0;tt<DELAY;tt++);
for(tt = 0;tt<DELAY;tt++);
for(tt = 0;tt<DELAY;tt++);
for(tt = 0;tt<DELAY;tt++);
}

/****************************************************************
*函数功能:初始化电源
*入口参数:para1,para2,para3,para4
*返回值    :无
*说  明    :para1,模式选择
*                                                                *
* para1  0     1    2    3                                            *
* mode     PM0    PM1    PM2    PM3                                            *
*                                                                *
****************************************************************/
void PowerMode(uchar sel)
{
uchar i,j;
i = sel;
if(sel<4)
{
SLEEP &= 0xfc;
SLEEP |= i;
for(j=0;j<4;j++);
PCON = 0x01;
}
else
{
PCON = 0x00;
}
}

/****************************************************************
*    函数功能:初始化I/O,控制LED
*    入口参数:无
*    返回值    :无
*    说  明    :初始化完成后关灯
****************************************************************/
void Init_IO_AND_LED(void)
{
/*
P1DIR = 0X03;
RLED = 1;
YLED = 1;

P1SEL &= ~0X0C;
P1DIR &= ~0X0C;
P1INP  &= ~0X0c;//有上拉、下拉
P2INP &= ~0X40; //选择上拉

P1IEN |= 0X0c;   //P12 P13
PICTL |= 0X02;   //下降沿

EA = 1;
IEN2 |= 0X10;  //P1IE = 1;

P1IFG |= 0x00;   //P12 P13
*/
P1DIR = 0X03; //0为输入(默认),1为输出
RLED = 0;
GLED = 1;

P0SEL&=~0X60;
P0DIR&=~0X60;

P0INP|=0X60;//有上拉、下拉

/*
P1IEN |= 0X0c;   //P12 P13
PICTL |= 0X02;   //下降沿
*/
PICTL |= 0X11;   //P0口中断允许,下降沿触发

EA = 1;
//IEN2 |= 0X10;   // P1IE = 1;
IEN1 |= 0X20;   // P0IE = 1

//P1IFG &= ~0x0C;   //P12 P13中断标志清0
P0IFG &= ~0x60;   //P05 P06中断标志清0
};
/****************************************************************
*    函数功能:主函数
*    入口参数:
*    返回值    :无
*    说  明    :10次绿色LED闪烁后进入睡眠状态
****************************************************************/
void main()
{
uchar count = 0;
Init_IO_AND_LED();

RLED = 0 ;       //开红色LED,系统工作指示
Delay();        //延时
Delay();
Delay();
Delay();

while(1)
{
YLED = !YLED;
RLED = 0;
count++;
if(count >= 20)
{
count = 0;
RLED = 1;
PowerMode(3);
//10次闪烁后进入睡眠状态
}

//Delay();
Delay();
//延时函数无形参,只能通过改变系统时钟频率
//来改变小灯的闪烁频率
};
}

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