蓝牙mesh组网实践(手机配网例程改低功耗)
在22年7月版本的CH583EVT更新之后,582芯片的adv_vendor_self_provision_with_peripheral例程,适配了wch mesh手机app,支持了OTA,成为功能最全的一个例程。但是默认例程适合常供电的节点,改为wch mesh配网的低功耗节点,需要做一些修改。
〇CH582本身是带有DCDC功能的,对于降低收发包时的功耗很有帮助。不过该功能需要VSW脚上有一个22uH左右的电感,多一个物料成本。部分代码缺省了启用DCDC的代码块,可以在主函数最开始加上。
#if(defined(DCDC_ENABLE)) && (DCDC_ENABLE == TRUE) PWR_DCDCCfg(ENABLE); #endif
①配置宏定义,使能低功耗节点功能和HAL_SLEEP,关闭转发功能。节点功能可以在app_mesh_config.h 中配置。HAL_SLEEP可以在右键点击工程名->Properties中配置,不建议直接修改公共文件config.h中的宏。改朋友节点好改,朋友节点是常供电节点,直接将朋友节点功能的宏置1即可,但是开启朋友节点功能会增加ram的开销。
②IO口全配置成上拉,固定一下电平,不要留不确定的引脚状态。可以在一开始就配置,后面要用比如说串口,再用串口的引脚的GPIO配置覆盖一下就行。
#if CONFIG_BLE_MESH_LOW_POWER //或者判断HAL_SLEEP是否启用,都行。使能低功耗节点功能时,需要一并启用HAL_SLEEP GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU); GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU); #endif
③BLE广播在配网完成后关闭。如果后面还需要BLE通信,可以自定义指令,需要的时候走mesh消息开启BLE广播。在代码中有两处需要关闭BLE广播,一处是第一次配网过程完成后,另一处是flash中保存有配网信息,恢复配网信息之后。下面是笔者加的处理。注意:如果还需要用到BLE的话,还需要添加接口或是指令再开广播。
④关掉按键循环,留一个TMOS任务。默认例程中按键循环100ms一次,不关的话会将功耗拉到500uA的水平。睡眠的话至少要留一个TMOS任务由RTC唤醒,最长定时为23.5h。默认例程中有一个2min一次的RF校准任务,帮助校准RTC的值。可以延长比如说5分钟校准一次,通信不出问题就行。
⑤配好网并与朋友节点建立朋友关系。配网和朋友关系的建立都是由低功耗节点发起的,如果这两件事情不做,低功耗节点“寝食难安”,即使休眠了也会不断唤醒去做这两件事。
⑥关掉BLE_MESH_BEACON_ENABLED。使能后,每10s一次安全广播用于IV值更新。低功耗节点可以由朋友节点支持IV值更新,可以关掉。上面的relay enabled默认就好,节点功能宏定义中关掉转发功能就行。
#if(CONFIG_BLE_MESH_LOW_POWER) .beacon = BLE_MESH_BEACON_DISABLED, #else .beacon = BLE_MESH_BEACON_ENABLED, #endif
接下来是实测情况,测试条件为最小电路板,启用DCDC,不经过LDO降压直接供电3.3v。保留了默认例程中2min一次的RTC校准任务,这个时间可以延长,只要RTC正常能跑就行。低功耗节点每隔一段时间向朋友节点POLL请求消息,实际没有POLL到消息包。
一段时间内什么都没做,平均功耗在3uA以下
低功耗节点每隔1s向朋友节点POLL请求一次消息,平均功耗在100uA左右
低功耗节点每隔2s向朋友节点POLL请求一次消息,平均功耗在60uA左右
低功耗节点每隔3s向朋友节点POLL请求一次消息,平均功耗在40uA左右
低功耗节点每隔5s向朋友节点POLL请求一次消息,平均功耗在22uA左右
低功耗节点每隔10s向朋友节点POLL请求一次消息,平均功耗15uA
低功耗节点每隔30s向朋友节点POLL请求一次消息,平均功耗在6+uA
低功耗节点每隔1min向朋友节点POLL请求一次消息,平均功耗在5uA以下