文章目录
HS6621CG低功耗调试
低功耗蓝牙产品HS6621 ,本人项目中实际调试结果在5-7个uA左右
- 低功耗外设控制标志位
一、低功耗的模式选择、区别、运行顺序
1.低功耗模式选择
static void ble_stack_config(void)
{
// Disable WDT
wdt_enable(0);
// Enable DCDC
pmu_dcdc_enable(true);
// Power down xtal32k in deep sleep mode
pmu_32k_enable_in_deep_sleep(true);
// Select 32k clock for stack
//pmu_xtal32k_change_param(15, 1);
pmu_select_32k(PMU_32K_SEL_RC);
// xtal32m param
pmu_xtal32m_change_param(15);
// ultra sleep mode enable //低功耗模式选择
co_power_fast_sleep_mode_enable(true); //快速休眠
//co_power_ultra_sleep_mode_enable(true); //深度休眠
// Enable sleep, SWD will be closed.
co_power_sleep_enable(true);
}
2.区别与运行流程(这里主要介绍快速休眠的运行流程)
1.进入低功耗唤醒后的启动方式不同
|-->快速休眠唤醒后执行 power_sleep_event_handler();
再去执行唤醒对应的函数,能够快速进行唤醒后的工作,执行对应的中断响应
|-->深度睡眠唤醒后,相当于重启芯片,会去重新从 mian() 主函数开始重新配置全片
2.运行顺序
|-->进入低功耗后会进入 power_sleep_event_handler();进入 POWER_SLEEP_ENTRY
|-->唤醒过程
1. 进入 power_sleep_event_handler() 中的 POWER_SLEEP_LEAVE_TOP_HALF,这里可以进行一些需要的功能恢复,如UART串口
2. 进入 power_sleep_event_handler() 中的 POWER_SLEEP_LEAVE_BOTTOM_HALF
3. 如果是按键唤醒,又是双沿中断按键的话,程序先进入 wakeup_gpio_handler(); 再进入 gpio_handler();
static void power_sleep_event_handler(co_power_sleep_state_t sleep_state, co_power_status_t power_status)
{
switch(sleep_state) {
case POWER_SLEEP_ENTRY:
log_debug("s\n");
break;
case POWER_SLEEP_LEAVE_TOP_HALF:
peripheral_restore(); //用于唤醒后的一些基础服务恢复,但是不建议在里面进行过多的操作
//log_debug("m\n");
break;
case POWER_SLEEP_LEAVE_BOTTOM_HALF:
log_debug("l\n");
break;
}
}
二、进入低功耗
- 芯片进入低功耗需要 IO 与配置状态保持一致,IO2、3、9在低功耗项目中最好不要使用,避免出现漏电
1.需要进入低功耗
调用以下函数进入低功耗
//按键进入低功耗
static void gpio_handler(uint32_t pin_mask)
{
if(pin_mask & BIT_MASK(PIN_LOWPOWER)){
pmu_lowpower_allow(PMU_LP_USER); //允许低功耗
sysdump(); //打印系统状态,IO状态
/*
* 这里进行一些IO状态的改变,需要符合配置的 IO 状态
*/
}
}
2.通过sysdump()函数的串口打印信息进行调试
观察芯片状态,当输出信息中的当前状态与要求状态显示一致时,表示成功进入低功耗模式
///例程进入低功耗模式
[PMU] prevent_status=00000000
[PMU] wakeup_pin=01000400(cur_level=01000400 sleep_level=01000400)
[PMU] pull_up=01000C50(cur_level=01000C50) pull_down=0000000C(cur_level=00000000) all_cur_level=0140FCF2
[PMU] clocking: CPU(32MHz) SRAM(FF) RTC(WDT) SF0 SF1 UART0 GPIO ANA
///HS6621CG工程未进入低功耗模式
//V1.1
[PMU] prevent_status=00000001 //PMU_LP_TIM0阻止,对应的位置就在第一部分介绍的标志位
[PMU] wakeup_pin=00081C00(cur_level=00081C00 sleep_level=00081C00)
[PMU] pull_up=363FFE17(cur_level=363FFE13) pull_down=00800140(cur_level=00000000) all_cur_level=377FFEB3
[PMU] clocking: CPU(32MHz) SRAM(FF) RTC(WDT) SF0 SF1 TIMER0 UART0 UART1 GPIO
[LL] ADV interval=25ms txpwr=0dBm phy1=1Mbps phy2=1Mbps //[LL]属于广播开启
//V1.2(上拉引脚有问题 )
[PMU] prevent_status=00000000
[PMU] wakeup_pin=00081C00(cur_level=00081C00 sleep_level=00081C00)
[PMU] pull_up=363FFE17(cur_level=363FFE13) pull_down=00800140(cur_level=00000000) all_cur_level=377FFEB3
[PMU] clocking: CPU(32MHz) SRAM(FF) RTC(WDT) SF0 SF1 TIMER0 UART0 UART1 GPIO
[LL] ADV interval=25ms txpwr=0dBm phy1=1Mbps phy2=1Mbps //[LL]属于广播开启
//V1.3(未进入低功耗,低功耗回调函数未调用)
[PMU] prevent_status=00000000
[PMU] wakeup_pin=00081C00(cur_level=00081C00 sleep_level=00081C00)
[PMU] pull_up=363FFE13(cur_level=363FFE13) pull_down=00800144(cur_level=00000000) all_cur_level=377FFEB3
[PMU] clocking: CPU(32MHz) SRAM(FF) RTC(WDT) SF0 SF1 TIMER0 UART0 UART1 GPIO
[LL] ADV interval=25ms txpwr=0dBm phy1=1Mbps phy2=1Mbps //[LL]属于广播开启
//V1.4
[PMU] prevent_status=00000000
[PMU] wakeup_pin=00081C40(cur_level=00081C00 sleep_level=00081C40) //Wake_Up_Pin 一直处于唤醒电平
[PMU] pull_up=363FFE13(cur_level=363FFE13) pull_down=00800144(cur_level=00000000) all_cur_level=377FFE93
[PMU] clocking: CPU(32MHz) SRAM(FF) RTC(WDT) SF0 SF1 TIMER0 UART0 UART1 GPIO ANA
/* 解决分析 */
1.关闭广播
2.项目中用到的定时器Timer0要关闭
3.唤醒引脚配置为高电平唤醒时,IO引脚要配置为内部下拉,可以通过系统信息打印获取当前IO口状态