CC2530(zigbee)入门开发: 低功耗模式

举报
DS小龙哥 发表于 2022/02/28 09:28:32 2022/02/28
【摘要】 低功耗是现在便携式、消费类设备都要考虑的功能,特别是使用电池供电的设备,对功耗的把握非常重要,功耗直接影响待机时长。 比如:我们现在的手机、平板、商务笔记本电脑、无线耳机等消费类设备,还有智能井盖。

一、低功耗模式介绍

低功耗是现在便携式、消费类设备都要考虑的功能,特别是使用电池供电的设备,对功耗的把握非常重要,功耗直接影响待机时长。 比如:我们现在的手机、平板、商务笔记本电脑、无线耳机等消费类设备,还有智能井盖、智慧路灯、这些不插市电的物联网设备等。

CC2530支持配置低功耗模式,可以通过电源寄存器章节的介绍进行配置,下面就介绍CC2530的低功耗几个模式的配置,截图来至CC2530中文数据手册。

二、配置低功耗模式

低功耗运行是通过不同的运行模式(供电模式)使能的。各种运行模式指的是主动模式、空闲模式和供电。

模式1、 2和 3(PM1-PM3)。超低功耗运行的实现通过关闭电源模块以避免静态(泄露)功耗,还通过使用门控时钟和关闭振荡器来降低动态功耗。

image.png

image.png

image.png

image.png

三、示例代码

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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。