注意:所有睡眠模式下,当使用串口打印时,需要将RX上拉(避免RX漏电导致功耗偏高。原因:UART RX 口为浮空输入时,会有漏电,所以要加个上拉,配置内部上拉就可以)
要进入睡眠状态需要将外设以及映射到的IO进行反初始化、软件定时器关掉。
LP0的睡眠和广播间隔,发送功率还有外设的工作状态有关。BLE的例程在ble_loop()里调用了睡眠函数,只需在app_config.h调用如下宏:
#define SDK_DEEP_SLEEP_ENABLE 1
#define DEBUG_MODE 0
进入睡眠状态需要将外设以及映射到的IO进行反初始化、软件定时器关掉LP2模式有RTC和GPIO唤醒,可同时使用;有四个外部中断唤醒io口:PA00,PA07,PB11,PB15;添加头文件:#include “lsrtc.h” #include “field_manipulate.h”,#include “sleep.h”,同样要配置两个宏:
#define SDK_DEEP_SLEEP_ENABLE 1
#define DEBUG_MODE 0
配置参数:PB15上升沿和RTC唤醒
static void ls_sleep_enter_lp2(void)
{struct deep_sleep_wakeup wakeup;memset(&wakeup,0,sizeof(wakeup));wakeup.pb15 = 1 ; //选择PB15作为唤醒iowakeup.pb15_rising_edge = 1; //选择上升沿唤醒 = 1 ; //选择LP2模式enter_deep_sleep_mode_lvl2_lvl3(&wakeup); //调用睡眠函数
}
io上升沿唤醒和RTC唤醒函数的配置:
void exit_iowkup_init(void)
{ io_cfg_input(PB15); io_pull_write(PB15, IO_PULL_DOWN); io_exti_config(PB15,INT_EDGE_RISING); io_exti_enable(PB15,true);
}void RTC_WKUP_INIT(void )
{HAL_RTC_Init(2); RTC_wkuptime_set(5);
}
配置唤醒参数:PB15下降沿唤醒
static void ls_sleep_enter_lp2(void)
{struct deep_sleep_wakeup wakeup;memset(&wakeup,0,sizeof(wakeup));wakeup.pb15 = 1 ;wakeup.pb15_rising_edge = = 1 ;enter_deep_sleep_mode_lvl2_lvl3(&wakeup);//调用唤醒函数
}
io下降沿唤醒函数
void exitpb15_iowkup_init(void)
{ io_cfg_input(PB15); io_pull_write(PB15, IO_PULL_UP); io_exti_config(PB15,INT_EDGE_FALLING); io_exti_enable(PB15,true);
}
LP3睡眠模式可以用外部中断唤醒,在app_config.h配置两个宏:
#define SDK_DEEP_SLEEP_ENABLE 1
#define DEBUG_MODE 0
配置参数:外部中断上升沿唤醒
static void ls_sleep_enter_LP3(void)
{struct deep_sleep_wakeup wakeup;memset (&wakeup,0,sizeof(wakeup));wakeup.pa07 = 1;wakeup.pa07_rising_edge = 1;enter_deep_sleep_mode_lvl2_lvl3(&wakeup);//调用睡眠函数
}
唤醒函数配置如下:
void exitpa07_iowkup_init(void)
{ io_cfg_input(PA07); io_pull_write(PA07, IO_PULL_DOWN); io_exti_config(PA07,INT_EDGE_RISING); io_exti_enable(PA07,true);
}
配置参数:外部中断下降沿唤醒
static void ls_sleep_enter_LP3(void)
{struct deep_sleep_wakeup wakeup;memset (&wakeup,0,sizeof(wakeup));wakeup.pa07 = 1;wakeup.pa07_rising_edge = 0;enter_deep_sleep_mode_lvl2_lvl3(&wakeup);//调用睡眠函数
}
唤醒函数配置如下:
void exitpa07_iowkup_init(void)
{ io_cfg_input(PA07); io_pull_write(PA07, IO_PULL_UP); io_exti_config(PA07,INT_EDGE_FALLING); io_exti_enable(PA07,true);
}
外设在工作的时候是不能睡下去的,用完要 反初始化掉,注意外设的引脚也要反初始化处理,可通过RTC,外部IO唤醒;添加头文件#include “sleep.h”,在app_config.h配置如下两个宏:
#define SDK_DEEP_SLEEP_ENABLE 1
#define DEBUG_MODE 0
MCU应用LP0模式需调用睡眠函数:deep_sleep_no_ble(),LP2模式和LP3模式参照BLE应用下的配置,还要进行如下图设置:将sleep.c下的:
XIP_BANNED void before_wfi()
{sleep_mode_set();
// while(REG_FIELD_RD(SYSCFG->PMU_PWR, SYSCFG_BLE_PWR3_ST)); //MCU应用注释这行代码ble_hclk_clr();switch_to_xo16m();SYSCFG->ANACFG0 &= ~(SYSCFG_EN_DPLL_MASK | SYSCFG_EN_DPLL_16M_RF_MASK | SYSCFG_EN_DPLL_128M_RF_MASK | SYSCFG_EN_DPLL_128M_EXT_MASK | SYSCFG_EN_QCLK_MASK);MODIFY_REG(SYSCFG->ANACFG1,SYSCFG_XO16M_ADJ_MASK | SYSCFG_XO16M_LP_MASK,(uint32_t)3<<SYSCFG_XO16M_ADJ_POS | (uint32_t)0<<SYSCFG_XO16M_LP_POS);
}
注:获取唤醒源接口:uint8_t get_wakeup_source(void);
本文发布于:2024-01-29 17:28:38,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170652052217067.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |