大家好,
我在用CC2540的时候遇到问题,我想让CC2540在PM1或者PM2下实现输出脉冲信号,但是定时器1、3、4在这两个模式下并不能工作,在CC2540手册上看到睡眠定时器可以切换工作模式和睡眠模式,但是不知道如何配置才可以在BLE 1.3协议栈的源码上实现每1秒唤醒设备将一个端口置1几个毫秒后又进入PM2。
疑问:睡眠定时器和定时器1、3、4的配置的区别?
如何设置睡眠定时器让其唤醒后执行我想要的操作?
非常感谢!!
Yan:
hi haunt,
你说的情况是在BLE连接已经建立的情况吗?
PM2 是在建立BLE连接之后的低功耗模式.
PM2 是由系统自动调度进入的, 由OSAL调用HAL层的接口实现.
Sleep timer是在PM2 模式下面, 高速晶振关闭的情况下用32k 时钟驱动的. 如果你之前有定时的任务需要驱动, 这个时候定时器就会切换到sleep timer, 也能保证你的定时任务在时间到的时候运行起来. 至于怎么运行, 比如说你要的置一个端口几个毫秒, 这个你可以在你的运行代码里面照正常方式实现, 完了之后如果没有BLE数据传输, 系统还是会自动调度进入PM2 模式.
如果你想了解sleep timer 寄存器怎么配置, 请参考手册. 如果我的理解正确, 你应该不需要去配置sleep timer.
haunt:
回复 Yan:
hi Yan,
感谢你及时耐心的解答,你的意思是说在BLE协议栈里面就已经存在这样一个机制:在蓝牙连接之后有定时任务的话就会在一定时间没有数据传输后自动进入PM2模式,那这个时间是多久呢?没有定时任务也会进入PM2模式吗?还有就是在没有连接的情况下,比如我只是运行simpleBLEPeripheral从机程序,而没有用主机连接此设备,同时又添加了一个周期性事件:每隔1秒输出一个脉冲电平信号,这样还会在一定时间自动进入PM2模式吗?因为我现在需要实现的一个功能是:在多数时间为了节省功耗,不需要蓝牙工作,只要在某个端口输出一个周期性的脉冲信号,而当检测到一个外部中断的时候就需要蓝牙开始工作,同时这个周期性事件停止。请问这样的功能可以通过sleep timer来实现吗?还有我用的是CC2540EM。
非常感谢!
Yan:
回复 haunt:
hi haunt,
时间比较难讲, 主要看connection event处理时间. 以每个connection event只处理一次收发的情况来看, 算上唤醒, 接收, 接收与发送间隔, 发送, 后期处理, 然后进入PM2过程, 这些加起来 2ms 多一点, 进入PM2 这个过程要花的时间大概160us多一点, 至于维持PM2 模式多久, 这个就取决于connection interval了. 这个回答包含你需要的时间是多久的答案吗?
没有你设定的定时任务的话, 只要是connection event处理完, 也会自动进入PM2 模式.
在没有连接的情况下, 如果没有事件要处理, 系统会自动进入PM3 模式, 而不是PM2. 这个模式下所有的timer都关闭, 包括sleep timer, 只有外部中断能唤醒系统. 如果你有一个周期性事件, 系统应该是无法进入任何休眠模式的, 因为系统的轮询的机制会发现始终有timer事件未处理完成, 而无法关闭timer, 无法退出轮询机制.
haunt:
回复 Yan:
hi Yan,
我才接触CC2540不久,很多东西都不太清楚,你的回答对我很有帮助,多谢了!
你是说如果有定时器中断或者有由函数osal_start_timerEx设置的周期性任务就无法进入休眠模式,就算我配置寄存器“SLEEPCMD = 0x06;PCON = 0x01;”强制进入PM2也是不能行的对吗?(因为我设置了sleep timer中断函数,并在函数中调用osal_set_event函数来设置一个事件,在这个事件中我配置寄存器“SLEEPCMD = 0x06;PCON = 0x01;”强制进入PM2,但不知道到底有没有进入PM2。)
如果这样的话,我想问几个问题:
1.可以手动的暂时性关闭蓝牙广播功能吗?可以的话如何做呢?(进一步说能不能尽可能的关闭一些功能,来节省功耗,能的话,还有哪些功能可以关闭呢?因为多数时候我只需要CC2540EM可以输出一个脉冲信号,而不需要广播之类的功能)
2.如果可以关闭蓝牙广播功能,然后把大部分IO端口都关闭,这样子工作功耗大概有多少呢?也就是说如果不进入PM2的话功耗有多少呢?据我所知,PM2的功耗只有1μA左右。 如果不能关闭蓝牙的任何功能,那么这个时候自身功耗大约有多大呢?
太感谢你了!
Yan:
回复 haunt:
Hi haunt,
我之前给出的关于无连接情况下不会进入PM2 模式的信息有误, 我已经编辑了前面的帖子, 请忽略前面横线划掉的内容.
如果你看代码, 你会发现如果在无连接的情况下, osal timer 有定时事件要处理的话, 系统也是会进入PM2模式的, 同时用32K的时钟进行计时. 如果没有任何事件, 系统会进入PM3.
所以这个时候你也不需要做额外的事情让系统进入PM2 模式.
你提到的那些命令能手动让系统计入睡眠模式, 但是不推荐这样使用, 这样可能会造成不必要的状态混乱, 默认模式下的osal调节系统状态能工作的很好, 你只要确认上层应用的event能被及时处理, 并把标志位正确清除, 就可以了.
之前造成误解, 不好意思.
haunt:
回复 Yan:
Hi Yan,
多谢你的回答!
从你之前说的,无论有没有定时任务,只要没有connection event就会进入PM2。
那我可以这样理解了,只要没有主机端去连接从机设备,那它应该是一直工作在PM2模式的,只有当有连接事件发生时,才会跳出PM2来处理,对吗?
那在PM2的时候它是不广播的吧,也就是主机设备是无法找到它的吧,可是我用SimpleBLEPeripheral这个示例程序下载到CC2540的开发板上过了好几分钟再用手机端去连接它,还是能都连接上的,说明它并没有进入PM2模式吧!这又是怎么回事呢?
非常感谢
haunt:
回复 Yan:
Hi Yan,
那我只要在设置了定时任务之后关闭广播就会自动进入休眠模式了吧?是这样吗?
谢谢!
Echoy Yang:
回复 Yan:
也就是说,打开了广播,广播间隔假如设为2秒,那么在未发送广播数据的这2秒间也不能进入PM2/3,是这样理解的吗?