CC2530 OSAL进入省电模式注意事项总结

在淘宝搞了几个CC2530模块回来玩,其中比较感兴趣的是低功耗这块功能,目前测试的结果是PM2模式下,纽扣电池2.8V电压,工作电流1.1uA(FLUKE F18B),符合规格书中描述的典型值1uA,总结如下:

前言:

1. OSAL是一个不错的操作系统,不要老是想着自己进入低功耗模式,应用任务没事干了,OSAL自己会进入低功耗模式。
2. 进入PM2不困难,真正困难的是真正低功耗并且通信正常。
3. 低功耗和代码有关,和硬件也有关,必要的时候,把板子除了最小系统所需之外的器件都焊掉,以便排查是代码问题还是硬件设计问题。例如IO有内部、外部上下拉。


实际操作方法:(我基于淘宝卖家的例程进行操作,每个人的例程或协议栈版本不一样可能存在一定的差异)

1. 在编译器预编译那里定义:POWER_SAVING
2. f8wConfig.cfg文件中,DPOLL_RATE\DQUEUED_POLL_RATE\DRESPONSE_POLL_RATE\DREJOIN_POLL_RATE这几个全部赋值0。

   注意:DRFD_RCVC_ALWAYS_ON=FALSE
3. 在你的任务初始化中增加这么一句osal_pwrmgr_device(PWRMGR_BATTERY);否则,OS不会进入省电模式。注意所有的用户任务都必须执行这么一句,否则无法进入省电模式。

做完以上3点,恭喜你,已经可以进入省电模式了。
但是,到底是PM1或PM2或PM3,要继续往下走
4. 找到void halSetSleepMode(void)函数,PCON = halSleepPconValue;这句决定你进入哪种省电模式,找到它定义的地方,我这边赋值是PCON_IDLE,将其改成HAL_SLEEP_TIMER或CC2530_PM2,即可进入PM2模式。想进入PM3同理。

作为第4点,即可进入PM2模式,但是并不以为则真的省电,可能几百个uA也可能若干个mA甚至几十个mA和没进入PM2一样。原因是,有其他任务在不停的唤醒CPU,导致电流下不来,需要注意哪几点?
1. 键盘,如果采用扫描模式则,则不停唤醒CPU,需设置成中断模式,或加大扫描周期。
2. LED,LED也有个任务,看看你的LED是不是频繁闪烁,如果是停掉。
3. ADC,我听别人说的,有个电池检测的任务不停进行电压采样,我这里没有。
4. 协议栈、协议栈、协议栈,重要的事情说三遍。
4.1 终端上电后或者断网后,会主动查找网络,导致无法进入省电模式。解决办法:http://blog.csdn.net/shjhuang/article/details/51171369,TI论坛也有,我忘记链接了。
4.2 VV大侠的http://www.deyisupport.com/question_answer/wireless_connectivity/zigbee/f/104/t/75525.aspx 当中的第4点。
以上做完了,我就实现了1.1uA的目标。
以上如有疑问,欢迎补充。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
下面是基于CC2530的火焰传感器代码,供您参考: ```c #include "ZComDef.h" #include "AF.h" #include "OSAL.h" #include "OSAL_Tasks.h" #include "ZDApp.h" #include "ZDObject.h" #include "ZDProfile.h" #include "DebugTrace.h" #include "hal_led.h" #include "hal_key.h" #include "hal_uart.h" #include "hal_adc.h" #define APP_ENDPOINT 10 #define APP_PROFID 0x0F08 #define APP_DEVICEID 0x0001 #define APP_DEVICETYPE 0x01 #define APP_MAX_CLUSTERS 1 #define APP_CLUSTERID 0x0006 #define SAMPLE_PERIOD 2000 //采样周期2秒 byte appTaskID; byte appEndpoint; void appInit(void); void appTask(byte taskID); void appSendData(void); void halKeyCback(byte key, byte keyStatus); void main(void) { osal_sys_init(); HalLedSet(HAL_LED_1, HAL_LED_MODE_FLASH); appInit(); osal_start_system(); } void appInit(void) { ZDO_Init(); appEndpoint = AF_RegisterEndpoint(APP_ENDPOINT, &appTaskID); ZDO_RegisterForZDOMsg(appTaskID, Match_Desc_rsp); RegisterForKeys(appTaskID); HalUARTInit(); HalUARTWrite(HAL_UART_PORT_0, "CC2530 Flame Sensor Demo\n", 25); HalAdcInit(); osal_set_event(appTaskID, SAMPLE_PERIOD); } void appTask(byte taskID) { uint16 events; afIncomingMSGPacket_t *MSGpkt; (void)taskID; events = osal_clear_event(appTaskID, 0); if (events & SAMPLE_PERIOD) { appSendData(); osal_start_timerEx(appTaskID, SAMPLE_PERIOD, SAMPLE_PERIOD); } MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive(appTaskID); while (MSGpkt) { switch (MSGpkt->hdr.event) { case ZDO_STATE_CHANGE: ZDO_STATE_CHANGE_CB(MSGpkt->hdr.status); break; case KEY_CHANGE: halKeyCback(*(byte*)MSGpkt->hdr.data, ((keyChange_t*)MSGpkt->hdr.data)->state); break; case AF_DATA_CONFIRM_CMD: break; default: break; } osal_msg_deallocate((uint8 *)MSGpkt); MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive(appTaskID); } } void appSendData(void) { uint16 adcValue; int mV; uint8 data[2]; HalLedSet(HAL_LED_1, HAL_LED_MODE_ON); HalAdcRead(HAL_ADC_CHANNEL_0, HAL_ADC_RESOLUTION_8, &adcValue); mV = HalAdcToMillivolt(adcValue); if (mV > 2000) { HalUARTWrite(HAL_UART_PORT_0, "Flame detected!\n", 16); data[0] = 0x01; data[1] = 0x00; AF_DataRequest(appEndpoint, &zAddrCoord, APP_CLUSTERID, 2, data, &appTaskID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS); } else { HalUARTWrite(HAL_UART_PORT_0, "No flame detected.\n", 19); } HalLedSet(HAL_LED_1, HAL_LED_MODE_OFF); } void halKeyCback(byte key, byte keyStatus) { if (key == HAL_KEY_SW_2 && keyStatus == HAL_KEY_EVENT) { HalUARTWrite(HAL_UART_PORT_0, "Button pressed.\n", 16); appSendData(); } } ``` 该代码使用了CC2530芯片内置的ADC模块来采集火焰传感器输出的模拟信号,并通过串口输出检测结果。如果检测到火焰,将会向协调器发送一个数据包。注意,该代码只注册了一个端点(Endpoint),并且只支持一个簇(Cluster),如需扩展,请自行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄大刀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值