例程是simpleBLEPeripheral原例程,开始为了实现功能,没有查过如何降低功耗的资料。例程中也是宏定义了POWER_SAVING,这个我没有变过,所以我一直以为我开着低功耗模式。拿到板子的第一件事就是调通UART和LED灯,为了方便测试,UART也一直正常使用。然后昨天看别人讨论,说宏定义了POWER_SAVING就没法正常使用UART,不知道如何解决。我很奇怪,为什么我一直都宏定义着POWER_SAVING却也一直都能正常用UART?各位大神能不能帮忙解释一下?
功耗的话,在蓝牙不配对的情况下是0.3mA,在蓝牙配对成功并每10ms传一次数据的情况下是2mA,测的是VDD_EB。
还有就是在main函数里最开始是下面这样的,其中#ifndef POWER_SAVING是黑色的,也就是说根本就没有找到POWER_SAVING的宏定义。这是为什么?
我还查了Sensor_Tag这个例程,工程里面有两处POWER_SAVING,其中一处是白色的,就是成功找到了宏定义,另一处也是在main函数中,也是黑的。
int main()
{
PIN_init(BoardGpioInitTable);
#ifndef POWER_SAVING
/* Set constraints for Standby, powerdown and idle mode */
Power_setConstraint(Power_SB_DISALLOW);
Power_setConstraint(Power_IDLE_PD_DISALLOW);
#endif // POWER_SAVING
/* Initialize ICall module */
ICall_init();
xiao lang:
第二个问题是我弄错了,它是#ifndef POWER_SAVING,就应该是黑的。那问题就只有第一个了,我宏定义了POWER_SAVING,理论上可以在没有任务时进入休眠模式。但是我一直能正常使用UART,而且就算不开蓝牙不进行串口输出,测出来的功耗也远不是几uA那么小。难道是只要我定义了串口的相关配置就不能再进入休眠模式了吗?
Barbara Wu:
回复 xiao lang:
在程序定义里面使用POWER_SAVING表示协议栈会自动根据程序使用情况调整系统的功耗模式
比如没有什么事件在使用,同时没有在广播状态,在蓝牙连接间隔之间,芯片会进入低功耗模式。
如果一直开启uart_read, 则相当于UART口上的事件会处于hang住等待接收任何UART口的数据的状态,这个时候系统无法进入低功耗。
可以通过GPIO或者直接UART口的PIN脚操作来实现UART口使用的低功耗,可以参考:
http://processors.wiki.ti.com/index.php/NPI_Two_Wire_UART_with_PM
xiao lang:
回复 Barbara Wu:
你好,感谢您的回答。
我的代码里没有uart_read函数的。对于UART,我只加了头文件、定义句柄(应该是这么叫)、初始化、在初始化紧接着就是调用UART_open、最后在开启蓝牙后循环调用UART_write。
我又测试了一下,simpleBLEPeripheral例程,只加入了UART和I2C,测VDD_EB的电流时,有三点不懂:
1、在上电后,测到的电流一直为100uA左右,在小幅度变化,此时还没有进行蓝牙配对,想问问这100uA的电流是执行什么任务产生的?如果说没有任务为什么不自动进入低功耗模式呢?
2、在进行蓝牙配对并传输了一组数据后,电流立刻就会降低,而且竟然能降低到0uA,是我的表有问题么?随后会每2秒产生一个高电流,不断循环,我的蓝牙连接间隔设的是500毫秒,定时器循环任务是5秒循环一次,在这个循环中会I2C采集传感器数据并用蓝牙发送,请问这个2秒一个的高电流是哪里来的呢?
3、问题2中说的2秒一个的高电流在变,有时上电并配对后是5到7uA,有时上电并配对后是50到70uA。为什么会有这种变化呢?
xiao lang:
回复 xiao lang:
还有,在上面说的测试里,我没有循环调用UART_write。只是在初始化里用过一次UART_open。
Barbara Wu:
回复 xiao lang:
测试功耗的时候有请问周边的器件有没有都关闭,如果是在smartrf06板上,跳线帽都要拔掉。
上电之后,simpleblepripheral程序是进入广播状态,广播状态是不能进入低功耗状态的。
配对连接之后,ble在连接间隔之间进入低功耗状态,在连接间隔的时候起来和连接的设备进行通讯。
尖峰电流有可能是内部recharge的电流。
你需要测试一下平均的底电流是多少。不算应用部分的话,如果是1uA就对了。
ye yang5:
回复 xiao lang:
很少有人按你说的方式去测,很难回答你的问题。给你点解决的建议吧。
先按照最原始的代码测试功耗,先确保最原始的代码也就是你依据哪个代码修改的,先测试它的功耗是否满足你的需求,然后再慢慢的恢复你添加的代码,查找
到底哪里使功耗增加的。
这种问题,只能自己慢慢的摸索着来了,只要能找到个参照物,对比测试,总会解决问题的。
user1878904:
回复 Barbara Wu:
我发现很奇怪的问题:
1、SDK2.00的主机,发现UART read停止了,但是电流还是没降下来
2、SDK2.01从机 和 SDK2.1.1从机,都是UART_read()无效,功耗也没上升
这到底是啥回事?
xiao lang:
回复 Barbara Wu:
你好,WBJ
之前的问题我懂了,
1、首先说明全例程中没有任何地方使用UART_write和UART_read。然后UART_open这个函数只在初始化中调用了一次,测试发现:UART_open不调用的话配对后电流为2uA左右,一旦调用了UART_open配对后就会变成20uA。请问这个UART_open函数打开了什么,为什么会增加功耗呢?
2、看到您去年4、5月份的一个帖子,一位用户说调用UART_read就没法再关闭(哪怕是直接关闭串口功能),所以只要调用过UART_read,功耗就一直降不下来,请问有没有找到这个问题原因是什么呢?是因为不同版本协议栈的事?还是说不同的板子会导致这个问题?
user1878904:
回复 user1878904:
再次确认, UART 的read()的问题跟主从没关系, 只跟SDK有关,总结如下(都是定义了 POWER_SAVING 以后):
1、 SDK 2.0 UART_read()可以, 但是停止了以后,功耗也没下降(甚至close以后也不降)
2、 SDK 2.1.0 以上, UART_read()无效, 试多少次都不行
user1878904:
回复 user1878904:
用的IAR