NRF52832学习笔记(33)——低功耗实现

一、功耗模式

nRF52 上只有两种电源模式:SYSTEM_ONSYSTEM_OFF

1.1 SYSTEM_ON低功耗模式

SYSTEM_ON:此状态有持续延迟和低功率子模式。当系统空闲进入 System On 模式时,默认情况下将处于低功耗子模式,通常最低功耗为 1.9uA (nRF52832) 或 1.5uA(nRF52840),包括 LFCLK 和 RTC。这是连接事件之间的正常状态。CPU 在计时器、外围设备或pin中断时重新启动。

通过蓝牙的事件触发芯片脱离低功耗模式,进入运行状态。

1.2 SYSTEM_OFF睡眠模式

SYSTEM_OFF:是深省电模式,工作电流为 300nA (nRF52832) 或 400nA (nRF52840),在该模式下,系统的内核和所有在运行的任务都会停止,也就是说时钟也停止,相当于关机状态。可以直接控制 POWER 相关寄存器使系统进入 System OFF 模式(NRF_POWER->SYSTEMOFF = 1; ),也可以通过API函数(sleep_mode_enter() 或 nrf_pwr_mgmt_run() 此函数执行 __WFE() 指令进入睡眠前清除所有事件),可以参考 SDK 中的 nrf_pwr_mgt 例子,系统进入 System OFF 模式会保留 GPIO 之前的状态,包括 GPIO 的输入/输出、I2C 总线、SPI 总线等,所以在进入 System OFF 模式前应该将 GPIO 都释放掉,使用 nrf_gpio_cfg_default(pin)释放 GPIO,同时,如果有 I2C 或 SPI 等总线外设也需要释放掉;可以通过复位、GPIO 中断或 NFC 信 (增加100nA)进行唤醒 。从 System OFF 模式中唤醒程序会发生复位,参考 832 product spec 文档

打开 sleep_mode_enter() 函数,观察到函数内部主要实现配置休眠指示灯、配置唤醒按键,进入 System Off 睡眠模式三个功能。进入 System Off 模式的关键在于调用协议栈 API 函数 sd_power_system_off(),这个函数可以在协议栈下起到寄存器操作 一样的效果。调用了这个函数后,系统将进入到睡眠模式。

1.2.2 退出SYSTEM_OFF模式

在 System Off 模式下,可以通过以下信 之一唤醒设备:

  1. DETECT 信 ,可由 GPIO 外设产生。
  2. ANADETECT 信 ,可由 LPCOMP 外设模块产生。
  3. SENSE 信 ,可由 NFC 模块产生 “wake-on-field”方式产生。
  4. 复位重启

在 BLE 程序中,提供了其中一种按键唤醒方式,唤醒按键在 sleep_mode_enter() 函数的 bsp_btn_ble_sleep_mode_prepare() 中进行配置。

二、硬件上降低功耗

不同的内部稳压器选择,会造成不同的电路消耗。可以通过选择不同的硬件电路配置,来选取下面两种内部稳压器:

  • 内部 LDO 稳压器
  • 内部 DC/DC 稳压器

LDO 是系统默认的稳压器,而 DC/DC 稳压器可用作 LDO 稳压器的替代产品。与使用 LDO 稳压器相比,使用 DC/DC 稳压器具有更低的电流消耗,但 DC/DC 稳压器需要连接外部 LC 滤波器:

  • 首先需要在主函数 main.c 中,初始化 softDevice 协议栈前,执行 。或者在初始化softDevice 协议栈后,执行 。

三、软件上降低功耗

3.1 广播状态下功耗优化

3.1.1 发射功率

设置发射功率具有 9 个发射等级。系统默认的发射功率是 0dbm,发射功率越大,发射距离就越远,相应的电流消耗就越大。

3.1.2 广播间隔时间

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

3.1.3 广播负载

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

3.2 连接状态下功耗优化

3.2.1 连接间隔和从机潜伏周期

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

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

3.2.2 发射和接收的数据量

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

3.3 系统及外设功耗优化

3.3.1 协议栈时钟选择

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

配置脉冲时钟源 NRF_SDH_CLOCK_LF_SRC,默认值为 1,即外部晶振。

3.3.2 关闭日志打印

  • main.c 文件,main() 函数中注释掉 log_init()

3.3.3 UART/UARTE

首先 UART 模块本身只需要 55uA 的工作电流,同时会自动打开高频时钟电路,也需要消耗 250uA 左右电流。如果使能了 UARTE 的 EasyDMA,那么 DMA 还需要消耗额外的 2mA 电流。这样 UARTE 工作消耗的电流会很高。因此在 UART 没有数据传输的时候建议将 UART 关掉,以节省功耗。

  • 注:为了达到低功耗和实时性双重目的,在设计 UART 通信的时候,我们经常会额外再加 2 个 GPIO 口用来通知对方 UART 要传送数据了。
  • 关闭 UART 的 API 为: 或者 。

3.3.4 SPI/TWI

在不使用的时候建议采用 uninit 函数进行关闭,这部分的外设也消耗电流。需要使用的时候进行 init 初始化开启。

  • SPI 开启和关闭: 和
  • TWI 开启和关闭: 和

3.3.5 SAADC

在不使用的时候建议采用 uninit 函数进行关闭,需要使用的时候进行 init 初始化开启。

  • ADC 开启和关闭: 和
  • 如果你发现 uninit ADC 后,功耗还是很高,建议打开这个宏 ,再试一下,功耗有可能就降下来了。

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

上一篇 2021年6月28日
下一篇 2021年6月28日

相关推荐