[nrf51][nrf52][SDK17] NRF系列怎么实现低功耗运行,带freertos能进入吗?

一、NRF51/NRF52系统低功耗表

(浅睡)

电流
nrf51822/nrf51422 2.2uA-3uA
nRF52832 1.9uA-2uA
nRF52840 1.5uA-1.6uA
其他 2uA左右

(深睡,唤醒就复位重启)

电流
nrf51822/nrf51422
nRF52832 300nA
nRF52840 400nA
其他

二、实测产品没有达到低功耗怎么办/h2>
  1. 测量有100uA,这个时候需要检查[调试器]是否断开,需要掉电一次,再测量。
  2. 测量有几百uA,这一定是外设没有关闭。如下列表:

外设 电流
UART/UARTE 55uA
高频时钟电路 250uA
easyDMA(52810强制打开) 2mA
Timer0/1/2/3/4 70uA(建议裸机用app_timer,os用软定时器)
FPU >7mA
GPIOTE 1.3mA(IN_EVENT) /
SPI/TWI mA级别
SAADC mA级别
J-Link模式 100uA

引用官方手册:

System ON模式,就是CPU可以不工作而外设可以继续工作的一种低功耗模式。
idle模式下,当CPU和所有外设都不工作时,系统电流也就有2uA左右。
(注:除了idle模式,nRF5芯片还支持一种更低功耗的低功耗模式:sleep模式(Nordic芯片手册称为System OFF模式),sleep模式下,CPU和所有外设都强制关闭,所以功耗非常低:只有零点几微安。由于sleep模式下,芯片无法发出广播包或者与手机保持蓝牙连接,所以sleep模式在BLE应用中运用得并不是很多)。
Idle模式可以被任何中断唤醒(sleep模式只能被IO口唤醒),所以idle模式在实际应用中使用得比较多。
在idle模式下,芯片仍然可以正常发出广播或者与手机保持蓝牙连接,所以大部分BLE应用都是工作在idle模式下,这样既保持了BLE功能又可以实现低功耗。

三、如何进入低功耗/h2>

1. 软件部分优化

1.1 广播优化

1.1.1 发射功率
设置发射功率具有 9 个发射等级。系统默认的发射功率是 0dbm,发射功率越大,发射距离就越远,相应的电流消耗就越大。
在0dBm时,打开DC/DC, nRF52832发射电流5.3mA。将TX功率增加到+4dBm只增加2.2mA。减少到- 40dbm只节省2.6mA。

1.1.2 广播间隔
就是广播包发出的频率,广播间隔越长,功耗越低。

1.1.3 广播负载
蓝牙的广播包普通包长度在 31 字节,扫描响应包也有 31 字节。如果蓝牙 5.0 下的第二广播包长度更长,越长的广播负载,会造成越大的电流消耗。

1.2 连接状态优化

1.2.1 连接间隔和从机潜伏周期
连接间隔是保证主从机维持连接,相互发空包的时间间隔。连接间隔可以在 GAP 初始化中进行设置。当设置的连接间隔越长,设备的功耗越低。因此,可以在维持连接状态下,保证数据正常通信的基础下,设置尽可能长的连接间隔。

从机潜伏周期和连接间隔是同时进行配置的,从机潜伏周期允许蓝牙设备一定次数的周期不对蓝牙主机数据进行回复。在这个周期次数范围内,蓝牙主机即使没有收到蓝牙从机设备的回复确认信息包,也会认为设备正常。这种方式也可以降低蓝牙设备的功耗。

连接间隔是保证主从机维持连接,相互发空包的时间间隔。连接间隔可以在 GAP 初始化中进行设置。当设置的连接间隔越长,设备的功耗越低。因此,可以在维持连接状态下,保证数据正常通信的基础下,设置尽可能长的连接间隔。

从机潜伏周期和连接间隔是同时进行配置的,从机潜伏周期允许蓝牙设备一定次数的周期不对蓝牙主机数据进行回复。在这个周期次数范围内,蓝牙主机即使没有收到蓝牙从机设备的回复确认信息包,也会认为设备正常。这种方式也可以降低蓝牙设备的功耗。

确认理论功耗值。BLE功耗跟广播间隔或者连接间隔是成正比关系的,所以20ms连接间隔下的功耗几乎是1s状态下的50倍!,单纯地问“1mA功耗高不高是没有意义的,必须结合特定的应用场景才有意义。

不管是广播还是连接,特定的使用场景会有一个理论功耗值,NRF功耗 址,以获得你的使用场景下理论功耗多少,比如连接模式下,每1秒钟发20个字节的数据包,这种模式下理论功耗为:7.6uA

1.2.2 发射和接收的数据量
蓝牙数据发送和接收的数据量大小,直观的影响到了功耗。数据吞吐量越大,功耗越高。

1.3 系统及外设功耗优化

1.3.1 协议栈时钟选择
协议栈时钟可以选择外部低速时钟和内部低速时钟。选取外部低速时钟具有更低的功耗,使能外部 32kHz 晶振,通常可以节省 1-2% 的电能。默认使用外部低速晶振。在 main.c 文件,ble_stack_init() 函数中 nrf_sdh_enable_request() 找到

sdk_config.h

[nrf51][nrf52][S130][SDK12.3] 修改协议栈时钟

1.3.2 关闭日志打印

官方SAADC低功耗例子

1.3.5 建议使用GPIOE低精度模式
GPIOE 事件模式下具有两钟模式:高精度模式(hi_accuracy 为 true)和低精度模式(hi_accuracy 为 false)。高精度模式 IN event 中断比低精度模式 Port event 中断消耗更多的电流 10~20uA。如果只是检测 IO 口电平,建议使用低精度模式,也就是所有的输入信 都使用一个中断申请,库函数调用配置:
GPIOTE_CONFIG_IN_SENSE_HITOLO(false);

1.3.5 Timer–>不建议使用硬件定时器

Timer0/1/2/3/4。Timer 的工作电流大概为 5~50uA 左右(nRF51功耗会更高),对低功耗应用来说,已经非常大了。如果你的定时精度要求不高,而且是毫秒的倍数,那么强烈建议你使用 RTC 来实现定时功能。协议栈下为 app_timer 软件定时器,app_timer 的功耗只有 0.2uA 左右。

1.3.6 FPU

由于 nRF52x 系列处理器不同于 nRF51 系列,其内核为 ARM Cortex M4 处理器。ARM Cortex M4 处理器 带 FPU 浮点运算单元。每当程序要执行浮点运算的时候,内核就会自动把 FPU 打开i。FPU 将消耗 7mA 以上的电流,此种情况下,进入 idle 模式之前必须手动关闭 FPU,手动关闭 FPU 代码如下所示:

在新版本 SDK17 中已经默认添加了

xnRF5_SDK_17.0.2_d674ddecomponentslibrariespwr_mgmtnrf_pwr_mgmt.c
函数:nrf_pwr_mgmt_run()

[nrf51][nrf52][SDK17] NRF系列怎么实现低功耗运行,带freertos能进入吗?
1.3.7 nrf_pwr_mgmt_run()函数解析
打开 nrf_pwr_mgmt_run() 函数,BLE 状态下,如果 CPU 处于空闲状态就会进入 sd_app_evt_wait() 函数,这个函数是进入低功耗的关键,是协议栈提供的一个等待事件函数。

                                                        

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年7月22日
下一篇 2022年7月22日

相关推荐