ZigBee网络低功耗运行一直是苦逼攻城狮们要解决的问题,TI的CC2530可以说已经把终端的休眠功耗降低到了极致,现在我们就来体验这颗芯片的魅力!文章末尾分享完整源码和PCB工程文件。
一、CC2530供电模式
CC2530芯片有五种运行模式,分别为主动模式、空闲模式、PM1、PM2和PM3。从参考手册上可以看到不同模式下的供电方式。
1. 主动模式是完全功能的运行模式,CPU、外设和RF 收发器都是活动的。数字稳压器是开启的
2. 空闲模式除了CPU内核停止运行外,其他和主动模式一样
3.PM1模式稳压器的数字部分开启。32MHz XOSC和 16MHz RCOSC都不运行。32kHz RCOSC或 32kHz XOSC运行。复位、外部中断或睡眠定时器过期时系统将转到主动模式
4.PM2模式稳压器的数字内核关闭。32MHz XOSC和 16MHz RCOSC都不运行。32kHz RCOSC或 32kHz XOSC运行。复位、外部中断或睡眠定时器过期时系统将转到主动模式
5.PM3模式稳压器的数字内核关闭。所有的振荡器都不运行。复位或外部中断时系统将转到主动模式
二、CC2530模式选择
PM1、PM2、PM3是低功耗运行模式,CC2530通过关闭不必要的部分和调整系统时钟来达到低功耗的效果。
在PM1模式下,高频振荡器(32MHz XOSC和16MHz RCOSC)是掉电的。稳压器和使能的32kHz振荡器是开启的。当进入PM1模式,就运行一个掉电序列。由于PM1使用的上电/掉电序列较快,等待唤醒事件的预期时间相对较短(小于3ms),就使用PM1。
PM2具有较低的功耗。在PM2下的上电复位时刻,外部中断、所选的32 kHz 振荡器和睡眠定时器外设是活动的。I/O引脚保留在进入PM2之前设置的I/O模式和输出值。所有其它内部电路是掉电的。稳压器也是关闭的。当进入PM2模式,就运行一个掉电序列。当使用睡眠定时器作为唤醒事件,并结合外部中断时,一般就会进入PM2模式。相比较PM1,当睡眠时间超过3ms 时,一般选择PM2。比起使用PM1,使用较少的睡眠时间不会降低系统功耗。
PM3用于获得最低功耗的运行模式。在PM3模式下,稳压器供电的所有内部电路都关闭(基本上是所有的数字模块,除了中断探测和POR电平传感)。内部稳压器和所有振荡器也都关闭。PM3模式可被外部中断和复位唤醒。
PM2模式其功耗是毫安级别的,多用于需要定时唤醒的场合,比如周期性地唤醒传感器来进行数据的采集,PM2模式可被睡眠定时器,外部中断和复位唤醒。PM3模式功耗最低,是微安级别的,多用于数据收发不频繁的场合。Z-STACK提供了两种低功耗运行模式,PM2和PM3。
三、CC2530低功耗代码设置
1.准备一份CC2530官方示例代码(也可使用本文已经修改好的代码),并打开
2.添加预编译项POWER_SAVING
ZigBee功耗主要是针对终端设备的,因此只需要修改终端设备代码即可,将IAR编译器的Workspace处选项改为EndDeviceEB,在项目名称上右键选择Options,如图添加预编译项POWER_SAVING来使能睡眠模式
3.修改f8wConfig.cfg文件
将以下参数修改(在文件的最后)
参数的作用代码中有注释,不过多解释了
-DRFD_RCVC_ALWAYS_ON=FALSE //default True -DPOLL_RATE=0 //default 1000 -DQUEUED_POLL_RATE=0 //default 100 -DRESPONSE_POLL_RATE=0 //default 100 -DREJOIN_POLL_RATE=0 //default 440
4.修改OnBoard.c文件
将函数InitBoard()改为如图所示
5.修改OSAL_PwrMgr.c文件
将函数osal_pwrmgr_init()改为如图所示
PWRMGR_BATTERY将允许HAL管理CPU进入SLEEP LITE或者SLEEP DEEP状态
6.周期性发送数据
每间隔3秒发送一次数据
void SampleApp_Send_P2P_Message( void ) {uint16 i = 0;uint8 data[10] = {0};uint16 father_short_addr = 0;uint16 myself_short_addr = 0;static uint8 count = 0;father_short_addr = NLME_GetCoordShortAddr();myself_short_addr = NLME_GetShortAddr();data[0] = ( father_short_addr >> 8 ) & 0xff;data[1] = father_short_addr & 0xff;data[2] = ( myself_short_addr >> 8 ) & 0xff;data[3] = myself_short_addr & 0xff;data[4] = count; count++;if( AF_DataRequest( &SampleApp_P2P_DstAddr, &SampleApp_epDesc,SAMPLEAPP_P2P_CLUSTERID,5,data,&SampleApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ){HAL_TURN_ON_LED1();for (i=0; i<50400; i++) asm("NOP");HAL_TURN_OFF_LED1();}else{// Error occurred in request to send. } }
四、实验现象
代码编译完成,通过CCDebugger将程序烧写到芯片里,打开协调器,然后给终端上电,协调器打印数据如下:
使用万用表测量,其休眠功耗为1.1uA
使用电化学工作站测量其发送数据功耗,可以看出基本在12-18mA左右。
好了,至此CC2530低功耗实现