CC2530(zigbee)入门开发: 低功耗模式
【摘要】 低功耗是现在便携式、消费类设备都要考虑的功能,特别是使用电池供电的设备,对功耗的把握非常重要,功耗直接影响待机时长。 比如:我们现在的手机、平板、商务笔记本电脑、无线耳机等消费类设备,还有智能井盖。
一、低功耗模式介绍
低功耗是现在便携式、消费类设备都要考虑的功能,特别是使用电池供电的设备,对功耗的把握非常重要,功耗直接影响待机时长。 比如:我们现在的手机、平板、商务笔记本电脑、无线耳机等消费类设备,还有智能井盖、智慧路灯、这些不插市电的物联网设备等。
CC2530支持配置低功耗模式,可以通过电源寄存器章节的介绍进行配置,下面就介绍CC2530的低功耗几个模式的配置,截图来至CC2530中文数据手册。
二、配置低功耗模式
低功耗运行是通过不同的运行模式(供电模式)使能的。各种运行模式指的是主动模式、空闲模式和供电。
模式1、 2和 3(PM1-PM3)。超低功耗运行的实现通过关闭电源模块以避免静态(泄露)功耗,还通过使用门控时钟和关闭振荡器来降低动态功耗。
三、示例代码
3.1 示例代码1
/******************************************************************************
利用睡眠定时器,实现低功耗
******************************************************************************/
#include <ioCC2530.h>
#define uint unsigned int
#define uchar unsigned char
#define CC2530_Delay 15000
#define RLED P1_0
#define YLED P1_1 //LED灯控制IO口定义
void CC2530_Delay(void);
void CC2530_Init_IO_AND_LED(void);
void CC2530_SysPowerMode(uchar sel);
/****************************************************************
延时函数
****************************************************************/
void CC2530_Delay(void)
{
uint i;
for(i = 0;i<CC2530_Delay;i++);
for(i = 0;i<CC2530_Delay;i++);
for(i = 0;i<CC2530_Delay;i++);
for(i = 0;i<CC2530_Delay;i++);
for(i = 0;i<CC2530_Delay;i++);
}
/****************************************************************
系统工作模式选择函数
* para1 0 1 2 3
* mode PM0 PM1 PM2 PM3
****************************************************************/
void CC2530_SysPowerMode(uchar mode)
{
uchar i,j;
i = mode;
if(mode<4)
{
SLEEPCMD &= 0xFC;
SLEEPCMD |= i; //设置系统睡眠模式
for(j=0;j<4;j++);
PCON = 0x01; //进入睡眠模式
}
else
{
PCON = 0x00; //系统唤醒
}
}
/****************************************************************
LED控制IO口初始化函数
****************************************************************/
void CC2530_Init_IO_AND_LED(void)
{
P1DIR = 0X03;
RLED = 0;
YLED = 0;
//P0SEL &= ~0X32;
//P0DIR &= ~0X32;
P0INP &= ~0X32; //设置P0口输入电路模式为上拉/下拉
P2INP &= ~0X20; //选择上拉
P0IEN |= 0X32; //P01设置为中断方式
PICTL |= 0X01; //下降沿触发
EA = 1;
IEN1 |= 0X20; // 开P0口总中断
P0IFG |= 0x00; //清中断标志
};
/****************************************************************
主函数
****************************************************************/
void main()
{
uchar count = 0;
CC2530_Init_IO_AND_LED();
RLED = 1 ; //开红色LED,系统工作指示
CC2530_Delay(); //延时
while(1)
{
YLED = !YLED;
RLED = 1;
count++;
if(count >= 20)
{
count = 0;
RLED = 0;
CC2530_SysPowerMode(3);
//10次闪烁后进入睡眠状态PM3
}
//CC2530_Delay();
CC2530_Delay();
//延时函数无形参,只能通过改变系统时钟频率或DEALY的宏定义
//来改变小灯的闪烁频率
};
}
/*****************************************
中断处理函数-系统唤醒
*****************************************/
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
{
if(P0IFG>0)
{
P0IFG = 0;
}
P0IF = 0;
CC2530_SysPowerMode(4);
}
3.2 示例代码2
/******************************************************************************
利用睡眠定时器实现低功耗
******************************************************************************/
#include <ioCC2530.h>
/*****************************************
//定义类型
*****************************************/
#define uchar unsigned char
#define uint unsigned int
#define RLED P1_0
#define GLED P1_1
#define CRYSTAL 0
#define RC 1
typedef unsigned char UINT8;
typedef unsigned char INT8U;
typedef unsigned short UINT16;
typedef unsigned short INT16U;
typedef unsigned long UINT32;
typedef unsigned long INT32U;
void CC2530_Set_ST_Period(uint sec);
void CC2530_Init_SLEEP_TIMER(void);
void CC2530_Delay(uint n);
void CC2530_LedGlint(void);
char LEDBLINK;
void CC2530_InitLEDIO(void)
{
P1DIR |= 0x03; //P10、P11定义为输出
RLED = 0;
GLED = 0;//LED灯初始化为关
}
/*****************************************
设定系统主时钟函数
*****************************************/
void SET_MAIN_CLOCK(source)
{
if(source)
{
CLKCONCMD |= 0x40; /*RC*/
while(!(CLKCONSTA &0X40)); /*待稳*/
}
else
{
CLKCONCMD &= ~0x47; /*晶振*/
while((CLKCONSTA &0X40)); /*待稳*/
}
}
/*****************************************
设定系统低速时钟函数
*****************************************/
void SET_LOW_CLOCK(source)
{
(source==RC)?(CLKCONCMD |= 0X80):(CLKCONCMD &= ~0X80);
}
/*********************************************************************
//主函数
*********************************************************************/
void main(void)
{
SET_MAIN_CLOCK(CRYSTAL);
SET_LOW_CLOCK(CRYSTAL);
CC2530_InitLEDIO();
LEDBLINK = 0;
RLED = 1;
GLED = 0;
CC2530_Init_SLEEP_TIMER();
CC2530_LedGlint();
CC2530_Set_ST_Period(8);
while(1)
{
if(LEDBLINK)
{
CC2530_LedGlint();
CC2530_Set_ST_Period(8);
GLED = !GLED;
LEDBLINK = 0;
}
CC2530_Delay(100);
}
}
/*****************************************
//初始化Sleep Timer
*****************************************/
void CC2530_Init_SLEEP_TIMER(void)
{
ST2 = 0X00;
ST1 = 0X0F;
ST0 = 0X0F;
EA = 1; //开中断
STIE = 1;
STIF = 0;
}
/*****************************************
//延时函数
*****************************************/
void CC2530_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 CC2530_LedGlint(void)
{
uchar jj=10;
while(jj--)
{
RLED = !RLED;
CC2530_Delay(10000);
}
}
/*********************************************************************
//设置睡眠时间
*********************************************************************/
void CC2530_Set_ST_Period(uint 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;
}
#pragma vector = ST_VECTOR
__interrupt void ST_ISR(void)
{
STIF = 0;
LEDBLINK = 1;
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)