4.5. 蓝牙低功耗

概述

使用demo_edr工程配置蓝牙低功耗。

4.5.1. 操作说明

    1. 在app_config.h文件中修改以下宏:

#define CONFIG_LOW_POWER_ENABLE              //软关机/睡眠开关
#define TCFG_LOWPOWER_LOWPOWER_SEL                  (RF_SLEEP_EN | SYS_SLEEP_EN | RF_FORCE_SYS_SLEEP_EN | SYS_SLEEP_BY_IDLE)
    1. 设置蓝牙功率接口( 详情查询[btcontroller_modules.h](include_libbtctrlerbtcontroller_modules.h) )

/* --------------------------------------------------------------------------*/
/**
* @brief 初始化配置蓝牙发射功率最大值范围
*
* @param pwr    edr 连接后发射功率(range:0~9)
* @param pg_pwr edr page 可连接状态发射功率
* @param iq_pwr edr inquiry 可发现状态发射功率
* @param ble_pwr ble 发射功率
*/
/* ----------------------------------------------------------------------------*/
/*
蓝牙TX发射功率档位, 参考功率值(dbm) ,超过等级范围默认设置为最高档
BD29: rang(0~8)  {-18.3,  -14.6,  -12.1, -8.5,  -6.0,  -4.1,  -1.1,  +1.1,  +4.0,  +6.1}
BD19: rang(0~10) {-17.6,  -14.0,  -11.5, -9.6,  -6.6,  -4.4,  -0.79, +1.12, +3.8,  +5.65, +8.04}
BR23: rang(0~9)  {-15.7,  -12.5,  -10.0, -6.6,  -4.4,  -2.5,  -0.1,  +2.1,  +4.6,  +6.4}
BR25: rang(0~9)  {-15.7,  -12.5,  -10.0, -6.6,  -4.4,  -2.5,  -0.1,  +2.1,  +4.6,  +6.4}
BR30: rang(0~8)  {-17.48, -11.46, -7.96, -3.59, -0.79, +1.12, +3.8,  +6.5,  +8.44}
BR34: rang(0~10) {-17.6,  -14.0,  -11.5, -9.6,  -6.6,  -4.4,  -1.8,  0,     +2.1,  +4,    +6.3}
*/

void bt_max_pwr_set(u8 pwr, u8 pg_pwr, u8 iq_pwr, u8 ble_pwr);

/* --------------------------------------------------------------------------*/
/**
* @brief ble_set_fix_pwr
*
* @param fix (0~max)
* 动态调整BLE的发射功率
*/
/* ----------------------------------------------------------------------------*/
void ble_set_fix_pwr(u8 fix);


/* --------------------------------------------------------------------------*/
/**
* @brief bredr_set_fix_pwr
*
* @param fix (0~max)
* 动态调整EDR的发射功率
*/
/* ----------------------------------------------------------------------------*/
void bredr_set_fix_pwr(u8 fix);
    1. 蓝牙低功耗设置IO唤醒

    在第一点的基础上, 在班级文件中, 定义如下:

/************************** PWR config ****************************/
#define PORT_WAKEUP_IO                      IO_PORTB_01                                     //软关机和休眠唤醒引脚
#define PORT_WAKEUP_NUM                     (PORT_WAKEUP_IO/IO_GROUP_NUM)//默认:0-7:GPIOA-GPIOH, 可以指定0-7组

static const struct port_wakeup port0 = {
    .edge       = FALLING_EDGE,                            //唤醒方式选择,可选:上升沿\下降沿
    .attribute  = BLUETOOTH_RESUME,                        //蓝牙低功耗唤醒 BLUETOOTH_RESUME 参数必须保留
    .iomap      = PORT_WAKEUP_IO,                          //唤醒口选择
    .low_power      = POWER_SLEEP_WAKEUP|POWER_OFF_WAKEUP,    //低功耗IO唤醒,不需要写0
};

static const struct wakeup_param wk_param = {
.port[PORT_WAKEUP_NUM] = &port0,
.sub = &sub_wkup,
.charge = &charge_wkup,
.lpres = &lpres_port,
};

//-------------------------分割线--------------------

static void board_power_init(void)
{
    power_init(&power_param);

    power_keep_state(POWER_KEEP_RESET);

    power_wakeup_init(&wk_param);
}

板级设置完成后, 还需要设置在IO唤醒后的回调, 在程序进入低功耗前注册即可

void callback()
{
    //自行实现
}

//可以在app_main.c中调用
set_port_wakeup_cb(callback);     //该回调为在低功耗sleep模式下的时候IO唤醒调用
    port_wakeup_reg(EVENT_IO_0, IO_PORTA_00, 0,     callback);    //该回调为程序正常运行模式idle下IO唤醒调用, IO口自行配置

应用: 可以在IO唤醒后锁住不继续进入低功耗, 则callback可以设置为 low_power_sys_unsleep_lock ,该函数可以锁住系统不再进入低功耗; 可以调用 low_power_sys_unsleep_unlock 退出锁, 函数参考 include_lib/driver/cpu/wl82/asm/power_interface.h