目前我们的低功耗应用是以下两个步骤,这种方式功耗偏大
1.使用了一个单独的定时器,进行电量等数据更新,定时间隔1秒 (Util_startClock(&periodicClock);
2.广播间隔定时,定时间隔1秒!
所以相当于在我们针对 CC2640R2F 的应用中,在1S 内,CC2640会醒来工作两次,这样会造成功耗增大!
我们的问题是,能否有方法在广播间隔发送过程中,利用类似回调的方式知道当前广播完成状态,更新我们需要的数据(目前使用的定时广播方式,我们应用层是不知道什么时候发送广播数据的,所以做不了数据更新)?这样达到1秒内 CC2640只醒来一次、降低功耗的目的!
Viki Shi:
更新要求不得少于1秒一次吗?最简便的办法是增大广播间隔
Jace Chen:
回复 Viki Shi:
您的意思是如果增大广播间隔就可以在由广播唤醒的那段时间内实现数据更新吗?现在的问题是当设定好广播间隔后,我们应用层对于广播只有开始和暂停这两种操作,开始后广播就会按间隔定时自动广播,广播时CC2640R2F就会被唤醒,但是唤醒的这段时间内我们无法进行任何操作(或者说我们还没找到),也无法知道广播是否完成?我们期望的是在广播唤醒的那段时间内能够查询广播状态,并且能够实现其他的一些应用层操作,比如电量等数据更新,而不是专门再增加一个定时去唤醒CC2640R2F,因为这会导致功耗增加。麻烦提供一些解决方法或建议,谢谢!
Viki Shi:
回复 Jace Chen:
我的意思是,如果数据更新要求不高,不必要唤醒那么频繁,定时更长一点,在广播的时候把数据发送出去, 这样便于降低功耗。
user1894077:
回复 Viki Shi:
cc2640里面广播结束的时候是有事件的,你可以在那里去执行你需要的操作。入口是在:
if ((src == ICALL_SERVICE_CLASS_BLE) && (dest == selfEntity)){ICall_Stack_Event *pEvt = (ICall_Stack_Event *)pMsg;
// Check for BLE stack events firstif (pEvt->signature == 0xffff){/////////////////here}你可以试试,希望有帮到你。
Jace Chen:
回复 user1894077:
这个我们试过,但是发现只有上电开机才会进,正常广播期间是不会有事件发生。是不是哪里设置不对?
Jace Chen:
回复 Viki Shi:
嗯但是现在的主要问题是,广播时我们应用层找不到入口,可否帮忙提供广播唤醒后应用层的函数入口示例给我们这边参考下,谢谢
user4488341:
回复 Jace Chen:
在应用层是可以接收到广播事件的,在设备启动前注册事件:
HCI_EXT_AdvEventNoticeCmd(s_iCallId, END_ADVERTISING_EVENT);END_ADVERTISING_EVENT 是自己定义的,系统用了一个,不要和系统冲突,貌似是 0x4000,记不清了。
然后在前面 dongdongtang 的回帖的那个地方就能捕捉到广播事件了,这个事件在mci层广播结束后触发。