LE5010-凌思微电子蓝牙芯片的开发记录(六)
LE5010睡眠模式的应用说明
1)3种睡眠模式的介绍
? 注意:所有睡眠模式下,当使用串口打印时,需要将RX上拉(避免RX漏电导致功耗偏高。原因:UART RX 口为浮空输入时,会有漏电,所以要加个上拉,配置内部上拉就可以)
2)BLE应用
要进入睡眠状态需要将外设以及映射到的IO进行反初始化、软件定时器关掉。
LP0模式
? LP0的睡眠和广播间隔,发送功率还有外设的工作状态有关。BLE的例程在ble_loop()里调用了睡眠函数,只需在app_config.h调用如下宏:
#define SDK_DEEP_SLEEP_ENABLE 1
#define DEBUG_MODE 0
LP2模式
进入睡眠状态需要将外设以及映射到的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 ;
wakeup.pb15_rising_edge = 1;
wakeup.rtc = 1 ;
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 = 0;
wakeup.rtc = 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模式
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);
}
3)MCU应用
外设在工作的时候是不能睡下去的,用完要 反初始化掉,注意外设的引脚也要反初始化处理,可通过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();
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);
|