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

article/2025/8/17 1:01:26

一、功耗模式

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

1.1 SYSTEM_ON低功耗模式

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

1.1.1 进入SYSTEM_ON模式

当 CPU 和外围设备处于空闲状态时,芯片进入默认的低功耗子模式。

在主函数最后面都会出现一个 for 循环,这个循环不停的重复运行其中的 idle_state_handle() 函数。

int main(void)
{······for(;;){idle_state_handle();}
}

打开 idle_state_handle() 函数,该函数是处理空闲状态的函数。通过 if 语句,判断调试缓冲区没有更多日志的时候,就进入 nrf_pwr_mgmt_run() 函数,这个函数就会进入到低功耗模式,直到下一个事件发生。

static void idle_state_handle(void)
{if(NRF_LOG_PROCESS() == false)  // 如果调试缓冲区没有更多日志{nrf_pwr_mgmt_run();}
}

打开 nrf_pwr_mgmt_run() 函数,BLE 状态下,如果 CPU 处于空闲状态就会进入 sd_app_evt_wait() 函数,这个函数是进入低功耗的关键,是协议栈提供的一个等待事件函数。

void nrf_pwr_mgmt_run(void)
{PWR_MGMT_FPU_SLEEP_PREPARE();  // 清除FDU异常,避免FDU中断被挂起PWR_MGMT_SLEEP_LOCK_ACQUIRE();  // 锁定临界区PWR_MGMT_CPU_USAGE_MONITOR_SECTION_ENTER();  // 用户监视段进入,监听进入低功耗的时间PWR_MGMT_DEBUG_PIN_SET();  // 置位仿真引脚// Wait for an event.
#ifdef SOFTDEVICE_PRESENT  // 带协议栈状态下if (nrf_sdh_is_enabled())  // 如果协议栈被使能{ret_code_t ret_code = sd_app_evt_wait();  //调用协议栈等待函数ASSERT((ret_code == NRF_SUCCESS) || (ret_code == NRF_ERROR_SOFTDEVICE_NOT_ENABLED));UNUSED_VARIABLE(ret_code);}else
#endif // SOFTDEVICE_PRESENT  // 否则,不带协议栈状态{// Wait for an event.__WFE();// Clear the internal event register.__SEV();__WFE();}PWR_MGMT_DEBUG_PIN_CLEAR();  // 清除仿真引脚PWR_MGMT_CPU_USAGE_MONITOR_SECTION_EXIT();  // 用户监视段退出PWR_MGMT_SLEEP_LOCK_RELEASE();  // 锁定临界区释放
}

1.1.2 退出SYSTEM_ON模式

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

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 文档

1.2.1 进入SYSTEM_OFF模式

在进入 System Off 模式之前,用户必须确保所有正在进行的 EasyDMA 通信已完成。进入深度睡眠之前一定要将使用 EasyDMA 的外设停掉。

BLE 程序代码里通过两种方式进入,一个是广播超时后会进入无效广播,再进入睡眠;另外就是通过按键按下调用睡眠模式进入函数进行进入。

  • 无效广播后进入到睡眠模式
static void on_adv_evt(ble_adv_evt_t ble_adv_evt)
{uint32_t err_code;switch(ble_adv_evt){case BLE_ADV_EVT_FAST:err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);APP_ERROR_CHECK(err_code);break;case BLE_ADV_EVT_IDLE:sleep_mode_enter();  // 进入睡眠模式break;default:break;}
}
  • 按键按下触发 BSP_EVENT_SLEEP 事件进入睡眠模式
static void bsp_event_handler(bsp_event_t event)
{ret_code_t err_code;switch(event){case BSP_EVENT_SLEEP:sleep_mode_enter();  // 进入睡眠模式break;······}
}

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

static void sleep_mode_enter(void)
{// 设置指示灯uint32_t err_code = bsp_indication_set(BSP_INDICATE_IDLE);APP_ERROR_CHECK(err_code);// 配置唤醒按键err_code = bsp_btn_ble_sleep_mode_prepare();APP_ERROR_CHECK(err_code);// 进入系统关闭模式(此功能不会返回,唤醒将导致系统重置)err_code = sd_power_system_off();APP_ERROR_CHECK(err_code);
}

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() 中进行配置。

uint32_t bsp_btn_ble_sleep_mode_prepare(void)
{uint32_t err_code;// 配置唤醒按键err_code = bsp_wakeup_button_enable(BTN_ID_WAKEUP);RETURN_ON_ERROR_NOT_NOT_SUPPORTED(err_code);// 配置唤醒和剔除绑定信息按键err_code = bsp_wakeup_button_enable(BTN_ID_WAKEUP_BOND_DELETE);RETURN_ON_ERROR_NOT_NOT_SUPPORTED(err_code);return NRF_SUCCESS;
}

二、硬件上降低功耗

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

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

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

其中关于 DC/DC 稳压器所连接的 外部 LC 滤波器电路上的电感和电容参数,请参看芯片手册 53 节 Reference circuitry 所提供的参考电路。

由于默认选择的是内部 LDO 稳压器,因此如果需要切换到使用内部 DC/DC 稳压器,还需要在软件上进行配置。

  • 首先需要在主函数 main.c 中,初始化 softDevice 协议栈前,执行 NRF_POWER->DCDCEN=1。或者在初始化softDevice 协议栈后,执行 sd_power_dcdc_mode_set(1)
  • sdk_config.h 配置文件中勾选 NRFX_POWER_ENABLED 使能选项,同时把选项下的 DC/DC 使能选项 NRFX_POWER_CONFIG_DEFAULT_DCDCEN 进行勾选。

    在选取电源电压为 3.0 V ,广播间隔为 500ms,发射功率为 0dbm 的情况下,选择 DC/DC 稳压方式的总平均功耗电流为 20uA,而选择 LDO 稳压方式的总平均电流在 32uA 左右。因此,选择 DC/DC 稳压方式可以大幅度的降低功耗。

三、软件上降低功耗

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_clock_lf_cfg_t const clock_lf_cfg ={.source       = NRF_SDH_CLOCK_LF_SRC,.rc_ctiv      = NRF_SDH_CLOCK_LF_RC_CTIV,.rc_temp_ctiv = NRF_SDH_CLOCK_LF_RC_TEMP_CTIV,.accuracy     = NRF_SDH_CLOCK_LF_ACCURACY};

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

// <0=> NRF_CLOCK_LF_SRC_RC     // 内部时钟源
// <1=> NRF_CLOCK_LF_SRC_XTAL  // 外部晶振源
// <2=> NRF_CLOCK_LF_SRC_SYNTH  // 合成时钟源#ifndef NRF_SDH_CLOCK_LF_SRC
#define NRF_SDH_CLOCK_LF_SRC 1
#endif

3.3.2 关闭日志打印

  • main.c 文件,main() 函数中注释掉 log_init()
  • 在 sdk_config.h 文件中关闭 UART 日志记录,选择支持 RTT。除非jlink调试器已连接,否则 RTT 不会使用电流。

3.3.3 UART/UARTE

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

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

3.3.4 SPI/TWI

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

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

3.3.5 SAADC

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

  • ADC 开启和关闭:nrfx_saadc_initnrfx_saadc_uninit
  • 如果你发现 uninit ADC 后,功耗还是很高,建议打开这个宏 NRFX_SAADC_CONFIG_LP_MODE,再试一下,功耗有可能就降下来了。
  • 官方SAADC低功耗例子 https://github.com/NordicPlayground/nRF52-ADC-examples/tree/master/saadc_low_power

3.3.6 GPIOE

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

3.3.7 Timer

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

3.3.8 FPU

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

/* Clear FPSCR register and clear pending FPU interrupts. This code is base on* nRF5x_release_notes.txt in documentation folder. It is necessary part of code when* application using power saving mode and after handling FPU errors in polling mode.*/__set_FPSCR(__get_FPSCR() & ~(FPU_EXCEPTION_MASK));(void) __get_FPSCR();NVIC_ClearPendingIRQ(FPU_IRQn);

在新版本 SDK 中 idle_state_handle() 已经加了处理

四、电量消耗预估

https://devzone.nordicsemi.com/power/


• 由 Leung 写于 2020 年 10 月 14 日

• 参考:青风电子社区
    板子功耗高的原因有哪些
    nRF52 Power优化降低70%以上耗电量


http://chatgpt.dhexx.cn/article/TSh7FTLQ.shtml

相关文章

NRF52832 ESB通信

esb通信&#xff0c;也就是纯2.4g的一个通信&#xff0c;据说是兼容24L01芯片&#xff0c;没有试过&#xff0c;这里是用两个nrf52832芯片做的通信实验。 相关历程参考 如下&#xff1a; 历程里面注释确实不多。 里面函数api介绍可以参考官方SDK文档&#xff1a;https://infoc…

NRF52840/NRF52832/NRF52810/NRF52811/NRF52805蓝牙5.0芯片对比

目录 一、蓝牙5.0传输速度翻倍&#xff0c;距离4倍、8倍数据传输量领跑物联网连接标准二、通信速度提高一倍意味着功耗减半三、四倍通信距离意味着蓝牙将抢夺Wi-Fi在智能家居市场的份额四、增加数据广播容量五、组网技术扩大应用范围六、NRF52系列BLE5.0芯片对比NRF52840-QIAA-…

nRF52833支持BLE 5.1,浅析与nRF52840参数对比

nRF52833 SoC作为Nordic nRF52系列的第五个新成员&#xff0c;该芯片能提供多协议解决方案&#xff0c;支持高温性能、测向功能&#xff0c;迅速成为专业照明和其他工业应用的理想选择之一。 Nordic现在提供nRF52833工程样品&#xff0c;这款SoC器件将提供三种不同的封装&…

【手把手带你学nRF52832/nRF52840 · (1)开发环境搭建】

1、首先去Nordic官网下载SDK SDK下载链接 ▼点击选定下图中的17.0.2版本&#xff0c;可以看到目前最新的版本是17.1.0 ▼下拉网页到最后&#xff0c;确认要下载的文件&#xff0c;前面的一些例程可以去掉&#xff0c;保留最后一个SDK文件即可&#xff0c;点击Download file…

NORDIC蓝牙52系列芯片选型与参数对比-NRF52805,NRF52810,NRF52811,NRF52820,NRF52832,NRF52833,NRF52840

NRF52805&#xff0c;NRF52810&#xff0c;NRF52811&#xff0c;NRF52820&#xff0c;NRF52832&#xff0c;NRF52833&#xff0c;NRF52840参数对比

nRF52832的硬件资源小结

nRF52832是NRODIC公司推出的一款带有低功耗蓝牙功能的ARM Cortex-M4 32-bit 浮点单元处理器&#xff0c;64MHz时钟&#xff0c; 存储器有两种配置&#xff1a;512kB flash/64kB RAM和256kB flash/32kB RAM. 最小的封装为WLCSP(wafer level chip scale package), 长宽高分别为&a…

从零开始的nrf52832蓝牙开发(1)--蓝牙协议基础

想要进行蓝牙开发&#xff0c;第一步肯定要对蓝牙协议有所了解。除了要对蓝牙的一些专业术语有所熟悉&#xff0c;还应该对蓝牙协议每层功能有一定认知。 概略图&#xff1a; 物理层&#xff08;PHY&#xff09;&#xff1a; 物理层规定了蓝牙频段&#xff1a;2400MHz~2483.…

01、NRF52832介绍功耗、射频参数、芯片处理能力、内存和支持协议详解

众所周知&#xff0c;低功耗代蓝牙以其低功耗的优势&#xff0c;凸显出强大的市场竞争力&#xff0c;而其中 nRF52832 这一款低功耗蓝牙芯片更是受到大家的欢迎。 下面云想智慧带你从功耗、射频参数、芯片处理能力、内存和支持协议这 5 个方面来解说 nRF52832 为什么受到欢迎。…

NRF52832蓝牙芯片详细介绍及应用方案

NRF52XX系列蓝牙Soc芯片选型表 NRF52810-QFAA 处理器&#xff1a;ARM Cortex M4RAM&#xff1a;24kBFLASH&#xff1a;192kB支持协议&#xff1a;BLE、ANT、私有2.4G封装&#xff1a;QFN48尺寸&#xff08;mm&#xff09;&#xff1a;6 x 6 NRF52810-QCAA 处理器&#xff1…

SpringBoot前端模板

Springboot支持thymeleaf、freemarker、JSP&#xff0c;但是官方不建议使用JSP,因为有些功能会受限制&#xff0c;这里介绍thymeleaf和freemarker。 一、thymeleaf模板 thymeleaf模板的前端界面为.html格式的文件&#xff0c;可以直接使用浏览器进行查看&#xff0c;方便进…

后台管理系统前端模板(html + CSS + JavaScript)

这是为大家准备的资源链接&#x1f910;&#x1f910;&#x1f910;&#xff1a; 提取码&#xff1a;0000 bootstrap_htmb.zip_免费高速下载|百度网盘-分享无限制百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#…

39个精美前端模板

为了方便广大程序员开发&#xff0c;整理了网上常见的免费的后台模板给大家。 1.Ace_admin Ace_admin 下载地址&#xff1a;http://pan.baidu.com/s/1dFaRCCL 2.AdminEx AdminEx 下载地址&#xff1a;http://pan.baidu.com/s/1gfxOkpl 3.AdminLTE AdminLTE 下载地址&a…

django 使用网上下载的前端模板

记录一下django使用前端模板的过 新手&#xff0c;没写过前端&#xff0c;不对的地方欢迎大神指教&#xff01;&#xff01;&#xff01;谢谢。 环境 windows7 django3.X pycharm 1使用pycharm 创建django项目 2创建app&#xff0c;python manage.py startapp app名称 3把下载好…

基于html+css+js线上订餐系统前端模板

h180效果图 部分源码 html <!doctype html> <html> <head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge,chrome1"><title>Cooker</title><meta name"descriptio…

使用Vue+Element-UI从0搭建一个常见的前端模板

首先&#xff0c;创建一个vue项目&#xff0c;这里不做过多阐述&#xff0c;直接写模板 简单的介绍一下一般的页面布局包括顶部导航栏&#xff0c;左侧菜单栏&#xff0c;和主要的信息展示页面 我们直接勾勒出一个这样的架子,这里使用了element-UI&#xff0c;记得用npm下载一…

免费html模板bootstrap,20 款超棒免费的 Bootstrap 管理和前端模板

1. SB Admin 2 2. Admin Lite 3. Director Responsive Admin Template Free 4. Free Bootstrap Admin Template Dream 5. Dashgum – Free Dashboard 6. Free Responsive Admin Template – Zontal Admin 7. Free Download Bootstrap Admin Template 8. Janux – Free Responsi…

【精美前端模板】你还不心动吗?

文章目录 &#x1f449;引言&#x1f48e;&#x1f31f;久等了&#xff01;&#x1f449;一、UniDark&#x1f449;二、My hat&#x1f449;三、ELYSIUM 魔兽世界&#x1f449;四、Sea Food美食&#x1f449;五、 Raduate&#x1f449;六、Goaway&#x1f449;七、CLEAN FRESH …

小区管理系统之后台管理前端模板

&#x1f525;作者主页&#xff1a;疯狂行者&#x1f525; &#x1f496;简介&#xff1a;Java领域新星创作者&#x1f3c6;、【计算机源码之家】公号作者✌ 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】&#x1f496; &#x1f496;文末获取源码联系&#x1f…

前端模板引擎 -- Freemarker

一、Freemarker介绍 FreeMarker是一个模板引擎&#xff0c;一个基于模板生成文本输出的通用工具&#xff0c;使用纯Java编写。 FreeMarker被设计用来生成HTML Web页面&#xff0c;特别是基于MVC模式的应用程序。 虽然FreeMarker具有一些编程的能力&#xff0c;但通常由Java程序…

前端模板

总述 “模板”这个词&#xff0c;可能很多人第一印象是后端的技术&#xff08;Smarty&#xff0c;Velocity等&#xff09;&#xff0c;但本文要讲的却不是后端的概念&#xff0c;而是前端开发中所使用到的一种技术&#xff0c;也就是“前端模板”技术。 模板的工作原理可以简单…