打开nrf_pwr_mgmt_run()函数,BLE 状态下,如果 CPU 处于空闲状态就会进入sd_app_evt_wait()函数,这个函数是进入低功耗的关键,是协议栈提供的一个等待事件函数。 voidnrf_pwr_mgmt_run(void){PWR_MGMT_FPU_SLEEP_PREPARE();// 清除FDU异常,避免FDU中断被挂起PWR_MGMT_SLEEP_LOCK_ACQUIRE();// 锁定临界区PWR...
深省电模式,工作电流为300nA (nRF52832)或400nA (nRF52840),在该模式下,系统的内核和所有在运行的任务都会停止,也就是说时钟也停止,相当于关机状态。可以直接控制POWER相关寄存器使系统进入System OFF模式(NRF_POWER->SYSTEMOFF = 1; ),也可以通过API函数(sleep_mode_enter()或nrf_pwr_mgmt_run()此函数执行_...
此时功耗最低点可以下降到<30uA。 /**@brief Function for handling the idle state (main loop).** @details If there is no pending log operation, then sleep until next the next event occurs.*/voididle_state_handle(void){nrf_pwr_mgmt_run();} 硬件上IO口的拉高低问题,所有MCU都差不多,不赘...
其实,官方的新版本的SDK已经对其进行了修复,最新版本的SDK引进了nrf_pwr_mgmt对功耗进行更加细致的管理,减少用户不必要的参与,参考如下: void nrf_pwr_mgmt_run(void) { PWR_MGMT_FPU_SLEEP_PREPARE(); PWR_MGMT_SLEEP_LOCK_ACQUIRE(); PWR_MGMT_CPU_USAGE_MONITOR_SECTION_ENTER(); PWR_MGMT_DEBUG_PIN_SET...
{ 3. ret_code_t err_code; 4. //初始化电源管理 5. err_code = nrf_pwr_mgmt_init(); 6. //检查函数返回的错误代码 7. APP_ERROR_CHECK(err_code); 8. } 2. 运行电源管理 运行电源管理是通过调用nrf_pwr_mgmt_run()函数执行的,该函数必须放到主循环里面 执行,以确保CPU 空闲时即可运行电源...
*/NRF_PWR_MGMT_HANDLER_REGISTER(app_shutdown_handler,0);staticvoidbuttonless_dfu_sdh_state_observer(nrf_sdh_state_evt_t state,void*p_context){if(state==NRF_SDH_EVT_STATE_DISABLED){// Softdevice was disabled before going into reset. Inform bootloader to skip CRC on next boot.nrf_power_gp...
*/staticvoidpower_management_init(void){ret_code_terr_code;err_code=nrf_pwr_mgmt_init();APP_ERROR_CHECK(err_code);} ble_stack_init() 协议栈初始化,主要做下面几点工作: 1、协议栈回复使能应答(时钟初始化等); 2、相关参数设置,初始化协议栈,完成使能; ...
打开idle_state_handle()函数,该函数是处理空闲状态的函数。通过 if 语句,判断调试缓冲区没有更多日志的时候,就进入nrf_pwr_mgmt_run()函数,这个函数就会进入到低功耗模式,直到下一个事件发生。 static void idle_state_handle(void){ if(NRF_LOG_PROCESS() == false) // 如果调试缓冲区没有更多日志 ...
idle_state_handle()函数中调用了 nrf_pwr_mgmt_run 函数中,这个函数中使用了 SDK 提供了一个协议栈函数名为 sd_app_evt_wait 的模块用于管理电源,可以直接调用,当中断事件发生后,设备被唤醒工作。 /**@brief Function for handling the idle state (main loop)....
打开idle_state_handle()函数,该函数是处理空闲状态的函数。通过 if 语句,判断调试缓冲区没有更多日志的时候,就进入nrf_pwr_mgmt_run()函数,这个函数就会进入到低功耗模式,直到下一个事件发生。 static void idle_state_handle(void){ if(NRF_LOG_PROCESS() == false) // 如果调试缓冲区没有更多日志 ...