社区导航

 
查看: 1246|回复: 5

[蓝牙BLE] BlueNRG-1 的低功耗模式 SLEEPMODE_NOTIMER参数

[复制链接]

571

TA的帖子

103

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2018-3-5 01:42:20 | 显示全部楼层 |阅读模式
本帖最后由 gs001588 于 2018-3-5 09:25 编辑

BlueNRG-1 的低功耗模式 SLEEPMODE_NOTIMER参数

  在测试“BLE_Beacon”工程时,有个参数一直有疑问,那就是关于SLEEPMODE_NOTIMER。
  出现在“BLE_Beacon_main.c”函数的第218行。
傲游截图20180305000353.jpg
  BlueNRG_Sleep(SLEEPMODE_NOTIMER, 0, 0);
  SLEEPMODE_NOTIMER之后的两个参数都是0,也就是说没有任何唤醒源。对注释内容不太理解,只说了广播的间隔期间允许节能,但没有说如何唤醒。

  这里先借坛友“cruelfox”的帖子,这说明一下几种低功耗模式。见以下链接:
BlueNRG-1 的低功耗模式浅析
http://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=611873&fromuid=449420
(出处: 电子工程世界-论坛)

BlueNRG-1 的低功耗模式
API级别硬件状态开启的时钟唤醒事件
SLEEPMODE_RUNNINGRunning16MHz & 32kHz--
SLEEPMODE_CPU_HALTCPU Idle16MHz & 32kHzIRQ *
SLEEPMODE_WAKETIMERSleep32kHzGPIO, BLE Timer (RESET)
SLEEPMODE_NOTIMERStandbyN/AGPIO  (RESET)

  的确对照各方面资料,SLEEPMODE_NOTIMER 时就是Standy状态。
傲游截图20180305000102.jpg

傲游截图20180305000456.jpg


傲游截图20180305005721.jpg




  在AN4820的第10页找到如下说明。
傲游截图20180305010623.jpg
  还是不明白为什么能够从Standby状态唤醒。猜想,会不会就没有进入Standby,而是进入了Sleep。

  在PM0275手册()的第47页找到了详细的注释。广播和连接间隔可以为SLEEPMODE_WAKETIMER的唤醒源。但是可不可以同时也为SLEEPMODE_NOTIMER的唤醒源,却不得而知
傲游截图20180305011710.jpg

  在我提交的挑战赛程序中,其实也是用了SLEEPMODE_NOTIMER的,但是同时虚拟定时器也是使用了的,并且计时准确,说明32K的时钟是一直在工作的。那么应该是SLEEPMODE_WAKETIMER模式,而不是SLEEPMODE_NOTIMER模式,或者是由于某种原因自动由SLEEPMODE_NOTIMER转变到了SLEEPMODE_WAKETIMER模式
傲游截图20180305010521.jpg

  也就说在这里执行的“BlueNRG_Sleep(SLEEPMODE_NOTIMER, 0, 0);”,实际等效于“BlueNRG_Sleep(SLEEPMODE_WAKETIMER, 0, 0);”。
  不知道,有没有对
SLEEPMODE_NOTIMER有个权威的解释。






回复

使用道具 举报

1833

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-3-5 08:33:30 | 显示全部楼层
学习


回复

使用道具 举报

969

TA的帖子

1

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2018-3-5 09:38:08 | 显示全部楼层
BlueNRG_Sleep() 会先检查允许休眠的级别,比如无线部分需要工作,就会修改请求的休眠模式。

点评

嗯,这么理解的话,就可以解释现象了。 谢谢  详情 回复 发表于 2018-3-5 20:21


回复

使用道具 举报

5398

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-3-5 10:22:32 | 显示全部楼层
应该像你说的那样,执行BlueNRG_Sleep(SLEEPMODE_NOTIMER, 0, 0);实际执行的是BlueNRG_Sleep(SLEEPMODE_WAKETIMER, 0, 0);
AN4820的3.4提到“如果无线模块处于连接状态,在与无线栈协商后,低功耗软件将低功耗模式更改为WAKETIMER
QQ图片20180305095055.png

因为没找到官方说明,这是凭空猜测一下这句话的意思
这里说“连接”而没有说“连接和广播”应该是指在可连接模式下,如果已经连接则修改NOTIMER为WAKETIMER,如果处于广播模式则进入低功耗模式;
而在非连接模式下(Beacon)如果已经开启广播,则和连接模式下的已连接状态一样修改NOTIMER为WAKETIMER;

点评

没找到官方说明,只好先这么理解。 cruelfox说的也有道理,就是无线的优级级超级高。要进入休眠模式,先检查无线是否需要工作,如果需要工作,那么就进入能够保证无线能够正常唤醒工作的模式。 在BlueNRG-1的手册  详情 回复 发表于 2018-3-5 20:40
虾扯蛋


回复

使用道具 举报

571

TA的帖子

103

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

 楼主| 发表于 2018-3-5 20:21:19 | 显示全部楼层
cruelfox 发表于 2018-3-5 09:38
BlueNRG_Sleep() 会先检查允许休眠的级别,比如无线部分需要工作,就会修改请求的休眠模式。

嗯,这么理解的话,就可以解释现象了。
谢谢


回复

使用道具 举报

571

TA的帖子

103

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

 楼主| 发表于 2018-3-5 20:40:38 | 显示全部楼层
littleshrimp 发表于 2018-3-5 10:22
应该像你说的那样,执行BlueNRG_Sleep(SLEEPMODE_NOTIMER, 0, 0);实际执行的是BlueNRG_Sleep(SLEEPMODE_WAK ...

没找到官方说明,只好先这么理解。
cruelfox说的也有道理,就是无线的优级级超级高。要进入休眠模式,先检查无线是否需要工作,如果需要工作,那么就进入能够保证无线能够正常唤醒工作的模式。
在BlueNRG-1的手册中也没有说,广播和连接间隙可以作为唤醒源,而在“PM0275”蓝牙栈应用指导中即有可以是唤醒源相关描述。BlueNRG-1还有什么隐藏功能不好说。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-12-15 09:44 , Processed in 0.207440 second(s), 17 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表