4.5. 蓝牙低功耗
概述
使用demo_edr工程配置蓝牙低功耗。
4.5.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)
设置蓝牙功率接口( 详情查询[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);
蓝牙低功耗设置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