前言¶
概述
本文档详细介绍了BS2XV100 低功耗sample的使用方法,旨在方便用户开发。用户在实际开发中可以完全重新写一套状态管理的代码,也可以利用该sample进行拓展开发。
BS2X系列包含BS21/BS22/BS26,本文档以BS21为例。
读者对象
本文档主要适用于以下工程师:
技术支持工程师
软件开发工程师
符号约定
在本文中可能出现下列标志,它们所代表的含义如下。
符号 |
说明 |
|---|---|
|
表示如不避免则将会导致死亡或严重伤害的具有高等级风险的危害。 |
|
表示如不避免则可能导致死亡或严重伤害的具有中等级风险的危害。 |
|
表示如不避免则可能导致轻微或中度伤害的具有低等级风险的危害。 |
|
用于传递设备或环境安全警示信息。如不避免则可能会导致设备损坏、数据丢失、设备性能降低或其它不可预知的结果。 “须知”不涉及人身伤害。 |
|
对正文中重点信息的补充说明。 “说明”不是安全警示信息,不涉及人身、设备及环境伤害信息。 |
修改记录
文档版本 |
发布日期 |
修改说明 |
|---|---|---|
04 |
2025-08-07 |
更新“详细介绍”章节内容。 |
03 |
2025-05-30 |
更新“用户指南”章节内容。 |
02 |
2025-01-14 |
更新“用户指南”章节内容。 |
01 |
2024-05-15 |
第一次正式版本发布。 |
00B01 |
2024-03-01 |
第一次临时版本发布。 |
编译&测试¶
编译说明¶
打开IDE工具目录,双击env_start.bat打开终端命令行。

命令行进到SDK对应路径。

执行“python build.py”。

输入bs21-pm序号回车即执行编译。
去SDK目录下tools\pkg\fwpkg\bs21取镜像包烧录即可。
测试说明¶
烧录bs21-pm对应镜像。
搜索并连接蓝牙“BS21-pm-demo”(pm_ble_server_adv.c中配置)。
系统会根据宏 DURATION_MS_OF_WORK_TO_STANDBY 设置的时间进入保连。
系统会根据宏 DURATION_MS_OF_STANDBY_TO_SLEEP 设置的时间进入睡眠。
系统会根据宏 PM_SAMPLE_GPIO_NUM 设置的管脚拉低时唤醒,之后重复步骤3和步骤4。
系统状态管理¶
系统状态¶
低功耗sample中将系统状态划分为工作(work)、待机(standby)和睡眠(sleep),状态切换如图1所示。
图 1 系统状态机

工作空闲一段时间进待机(保连)状态
待机(保连)空闲一段时间进深睡状态
待机(保连)状态唤醒后进入工作状态
深睡状态唤醒后进入工作状态
说明: 待机(standby)态时系统也会进睡眠,只是在此sample中“待机”时蓝牙未断连,“睡眠”时蓝牙断连了。 如果用户不需要“保连”或者“断连”,那么系统只需进入“待机”态即可,用户只需在状态转移回调函数中实现相应功能即可。
接口说明¶
注册低功耗状态管理接口:errcode_t uapi_pm_state_trans_handler_register(pm_state_trans_handler_t *handler);
typedef struct pm_state_trans_handler { pm_state_trans_func_t work_to_standby; /* 工作态转换到待机状态(如interval调大) */ pm_state_trans_func_t standby_to_sleep; /* 工作态转换到深睡状态(如断连、关广播) */ pm_state_trans_func_t standby_to_work; /* 待机态转换到工作状态(如interval调小) */ pm_state_trans_func_t sleep_to_work; /* 深睡态转换到工作状态(如开广播) */ } pm_state_trans_handler_t;
设置低功耗状态转移的时间:errcode_t uapi_pm_set_state_trans_duration(uint32_t work_to_standby, uint32_t standby_to_sleep);
work_to_standby:从工作到待机的时间,单位:ms。
standby_to_sleep:从待机到睡眠的时间,单位:ms。
重置工作状态接口(重置工作到待机的计时器):errcode_t uapi_pm_work_state_reset(void);
低功耗唤醒处理接口(在外设唤醒的时候调用以切换到工作状态):errcode_t uapi_pm_wkup_process(uintptr_t arg);
状态机原理¶
概述¶
由《BS2XV100 低功耗 开发指南》中的介绍可以知道,睡眠管理模块在LiteOs的IDLE线程中被调用到,满足睡眠条件系统则进睡眠。
图 1 睡眠条件

其中一个条件是“不存在睡眠否决票”,系统状态机入口中有投了一个睡眠否决票,如图2所示。
图 2 pm_sys初始化

睡眠管理接口判定存在否决票则不进睡眠,在“适当”的时候将该否决票移除掉,则系统就可以进睡眠。
对于BS2X的产品形态来说,一般要控制系统“何时”进入保连态、“何时”进入睡眠态,所以这里必然要有一个“定时器”。
低功耗sample中利用OsTick实现了这一计时功能(当然,用户也可以用软Timer或者周期性线程实现)。
详细介绍¶
pm_sys_entry初始化时,创建了一线程,即pm_sys_task,该线程由消息触发进入:

以下场景会写消息队列:
“工作->待机”或者“待机->睡眠”定时时间到,如下:

由“待机”态或“睡眠”态唤醒时,主动切换到“工作”态,如下:

状态切换时会调用用户由 uapi_pm_state_trans_handler_register 接口注册的状态切换回调函数,用户需在此回调函数中实现,BT保连、断连、唤醒回连等参数配置。
此外,系统在睡眠时(standby或sleep),用户需在相应回调函数中注册唤醒源,在唤醒时需对用户所使用的外设进行恢复。
示例见:application/samples/products/lowpower/lowpower.c
说明: BS2XV100睡眠时CPU和绝大多数外设会下电,唤醒后SDK中有对CPU和部分通用外设进行恢复,用户自己初始化的外设需要在状态机管理接口中自行恢复。 详情见《BS2XV100低功耗 开发指南》。
使用配置说明¶
图 1 KConfig配置

KConfig中打开宏①,即可开启pm_sys这块驱动,之后使用2.2章节中的接口说明即可。
KConfig中打开宏②,即可开启pm_sys的消息队列功能,建议打开。
KConfig中修改宏③,即可调整消息队列栈空间大小,默认2K。
说明: 消息队列可以起到缓冲、异步、解耦等作用,这里更适合消息队列的使用,但是消息队列使用了线程,增加了一部分空间。理论上,非内存紧缺的情况下,强烈建议使用消息队列。 非消息队列的方式虽然节省了一些空间,但是很多软件处理是直接放在中断中进行的,这里软件处理时间长可能会导致其他中断被阻塞。 此外,消息队列的方式可扩展性也更强,用户在后续拓展开发时也更方便添加新的实例或节点。
用户指南¶
低功耗sample提供了一种业务状态机管理的方法,这一层代码属于业务逻辑,本应由用户自行实现。SDK中通过该sample向用户演示了一套状态管理示例方法,旨在方便用户开发。用户在实际开发中可以完全重新写一套状态管理的代码,也可以利用该sample进行拓展开发。
低功耗sample功能比较简单,用户在实际使用时,如果要基于该sample进行开发,肯定要进行适当拓展的。
低功耗sample中使用的BT相关的接口仅提供参考,后续客户有扩展功能开发,请参考协议说明。
低功耗sample旨在演示低功耗管理/开发方法,仅借用BLE接口作了个演示,用户实际开发时也会涉及到SLE场景以及BLE和SLE共存场景,在此无法提供这一开发指导。
用户在开发拓展之前可以先基于此sample简单做个功耗测试,以对功耗情况有个大概了解。
pm_sys定时状态机任务优先级被设定为最低的30,如需使用请注意任务优先级关系,不建议将其他任务的优先级设置为30。
说明: uapi_pm_work_state_reset 用来重置计时器,不重置的话到了“work_to_standby”的设定时间,系统就会进入待机,该sample中在 PM_SAMPLE_GPIO_NUM 拉低时调用该接口进行定时器重置。用户实际使用场景可能会更加复杂,有时可能无法及时调用该接口重置定时器。 在用户实际使用时,除了 uapi_pm_work_state_reset 接口,也可以灵活使用 uapi_pm_set_state_trans_duration 接口,该接口会控制“work_to_standby”和“standby_to_sleep”的定时器时间,灵活设置该时间也可以达到控制“不进睡眠”和“何时进睡眠”的效果。




