Thread 低功耗终端设备已预先配置为 MCU 处于低功耗状态,并且无线电大部分时间处于关闭状态,以延长电池寿命。该设备定期唤醒并轮询其父路由器以获取发送给它的数据,或者可选地通过父路由器启动向网络发送数据。
连接框架中的低功耗模块 (LPM) 简化了将基于 Kinetis 的无线网络节点置于低功耗或睡眠模式的过程。对于MKW41Z ,有六种低功耗模式可用。
默认情况下,Thread 低功耗终端设备使用深度睡眠模式 3,其中:
唤醒源包括:
LPTMR 定时器还用于测量 MCU 处于深度睡眠的时间,以便在唤醒时同步低功耗定时器。有关深度睡眠模式的更多信息,请参阅连接框架参考手册和PWR_Configuration.h 。
要更改深度睡眠模式 3 上的轮询时间,我们需要了解两个宏:
1.\framework\LowPower\Interface\MKW41Z \ PWR_Configuration.h 中的 cPWR_DeepSleepDurationMs 宏。
#ifndef cPWR_DeepSleepDurationMs
#define cPWR_DeepSleepDurationMs 3000
#endif
该宏决定 MCU 进入低功耗模式(深度睡眠)的时间长度。最大值为65535000毫秒(18.2小时)。
2. \source\config.h 中的 THR_SED_POLLING_INTERVAL_MS 宏。
/*! The default value for sleepy end device (SED) polling interval */
#ifndef THR_SED_POLLING_INTERVAL_MS
#define THR_SED_POLLING_INTERVAL_MS 3000 /* Milliseconds */
#endif
该宏确定低功耗终端设备向其父设备发送轮询消息的频率。
注意:此值并不决定 MCU 唤醒的频率。
轮询间隔应该是深度睡眠持续时间值的倍数,否则将在下一次深度睡眠超时时发送轮询。
例如,假设我们将轮询间隔配置为 4000 毫秒,将深度睡眠持续时间配置为 3000 毫秒。MCU 每 3000 毫秒唤醒一次,但每 2 次深度睡眠超时 = 6000 毫秒发送一次轮询消息,因为 MCU 唤醒时计时器是同步的。下图显示了此示例的行为。
建议轮询间隔与深度睡眠持续时间相同,这样 MCU 就不会不必要地唤醒。下图显示了这种行为。
要记住的另一个宏是 app_thread_config.h 中的THR_SED_TIMEOUT_PERIOD_SEC 。
#ifndef THR_SED_TIMEOUT_PERIOD_SEC
#define THR_SED_TIMEOUT_PERIOD_SEC ((4*THR_SED_POLLING_INTERVAL_MS)/1000 + 3)
#endif
此值是父级用来认为休眠终端设备 (SED) 已断开连接的超时时间。默认情况下,该值配置为轮询间隔的4倍+3秒。建议保留该宏的原样。该值在调试期间发送给父节点。
谢谢,说明是正确的,这是我的错误。我修改了 THR_SED_POLLING_INTERVAL_MS 的定义,即 app_thread_config.h。
你好,马修,
这两个宏是您对项目所做的唯一更改吗?我刚刚通过将两个宏都更改为 5000 毫秒来测试您的用例,并且每 5 秒正确发送一次轮询。
在最新的MCUXpresso SDK上, THR_SED_POLLING_INTERVAL_MS宏位于\source\config.h中。
此致,
Gerardo
使用示例项目 frdmkw41z_wireless_examples_thread_low_power_end_device_freertos,我能够成功构建运行并将设备连接到混合 ble 线程路由器。然后我测量了电流消耗以验证传输频率,并且正如预期的那样默认设置为 3000ms。然后我按照描述修改了两个定义并将它们更改为 5000 毫秒。然而,当我重新测试功率消耗时,我仍然看到每 3000 毫秒出现一次电流峰值,而不是我预期的 5000 毫秒。我还遗漏了什么吗?