nrf51822 SDK12.3.0 电源管理官方例程

一、实验平台:

测试板:PCA10028

协议栈版本:nRF5_SDK_12.3.0_d7731ad

例程所在位置:nRF5_SDK_12.3.0_d7731ad\examples\peripheral\pwr_mgmt

官方解释:http://infocenter.nordicsemi.com/index.jsp

二、流程解释

根据官方的测试流程:按下BUTTON1后,进入bsp_evt_handler()的BSP_EVENT_KEY_0分支,将m_is_ready设置为true。

case BSP_EVENT_KEY_0:
            if (m_is_ready)
            {
                m_is_ready = false;
                NRF_LOG_INFO("System is not ready for shutdown\r\n");
            }
            else
            {
                m_is_ready = true;
                NRF_LOG_INFO("System is ready for shutdown\r\n");
            }
            if (m_sysoff_started && m_is_ready)
            {
		NRF_LOG_INFO("m_sysoff_started && m_is_ready is true\r\n");
                nrf_pwr_mgmt_shutdown(NRF_PWR_MGMT_SHUTDOWN_CONTINUE);
							  
            }
            break;


在按BUTTON2,进入BSP_EVENT_SLEEP分支,因为m_stay_in_sysoff=false,执行nrf_pwr_mgmt_shutdown(NRF_PWR_MGMT_SHUTDOWN_GOTO_SYSOFF);函数。事件类型的定义是一个enmu。NRF_PWR_MGMT_SHUTDOWN_GOTO_SYSOFF=0。
 case BSP_EVENT_SLEEP:
					 
            if (m_stay_in_sysoff)
            {
	       NRF_LOG_INFO("m_stay_in_sysoff is true\r\n");
               nrf_pwr_mgmt_shutdown(NRF_PWR_MGMT_SHUTDOWN_STAY_IN_SYSOFF);
						   
            }
            else
            {
	       NRF_LOG_INFO("m_stay_in_sysoff is false\r\n");
               nrf_pwr_mgmt_shutdown(NRF_PWR_MGMT_SHUTDOWN_GOTO_SYSOFF);
							  
            }
            break;
nrf_pwr_mgmt_shutdown()函数内,将形参赋给m_pwr_mgmt_evt,之后执行shutdown_process();关机处理函数。

在shutdown_process();中执行if ((*PWR_MGMT_SECTION_VARS_GET(m_next_handler))(m_pwr_mgmt_evt))时会执行 执行关机回调函数,将事件类型做为参数传入。该回调函数是在main.c中注册的
bool app_shutdown_handler(nrf_pwr_mgmt_evt_t event);

//lint -esym(528, m_app_shutdown_handler)
NRF_PWR_MGMT_REGISTER_HANDLER(m_app_shutdown_handler) = app_shutdown_handler;
进入到bool app_shutdown_handler(nrf_pwr_mgmt_evt_t event)
    if (m_is_ready == false)
    {
        m_sysoff_started = true;
			  NRF_LOG_INFO(" m_sysoff_started = true\r\n");
        return false;
    }

    switch (event)
    {
        case NRF_PWR_MGMT_EVT_PREPARE_SYSOFF:
					  NRF_LOG_INFO("NRF_PWR_MGMT_EVT_PREPARE_SYSOFF..\r\n");
            err_code = bsp_buttons_disable(); //关闭按键中断 睡眠之后无法唤醒
            APP_ERROR_CHECK(err_code);
            break;

        case NRF_PWR_MGMT_EVT_PREPARE_WAKEUP:
            err_code = bsp_wakeup_button_enable(BTN_ID_WAKEUP);  //设置按键唤醒
            APP_ERROR_CHECK(err_code);

				    NRF_LOG_INFO("NRF_PWR_MGMT_EVT_PREPARE_WAKEUP\r\n");
				   
            err_code = bsp_nfc_sleep_mode_prepare();   //设置NFCT为唤醒源
            // Suppress NRF_ERROR_NOT_SUPPORTED return code.
            UNUSED_VARIABLE(err_code);
            break;

        case NRF_PWR_MGMT_EVT_PREPARE_DFU:
            NRF_LOG_ERROR("Entering DFU is not supported by this example.\r\n");
            APP_ERROR_HANDLER(NRF_ERROR_API_NOT_IMPLEMENTED);
            break;
    }
m_is_ready=true,进入NRF_PWR_MGMT_EVT_PREPARE_WAKEUP分支。


之后跳转到bool app_shutdown_handler(nrf_pwr_mgmt_evt_t event)回调函数中的NRF_PWR_MGMT_EVT_PREPARE_WAKEUP分支,首先执行bsp_wakeup_button_enable(BTN_ID_WAKEUP);设置按键唤醒
bsp_nfc_sleep_mode_prepare();设置NFCT为唤醒源

之后回到shutdown_process();
最后执行NRF_POWER->SYSTEMOFF = POWER_SYSTEMOFF_SYSTEMOFF_Enter;执行休眠

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值