Arch_ble_ext_WakeUp_on的目的是什么?

7个帖子/ 0新
最后一篇
oren.
离线
最后一次露面:1年8个月前
专家
加入:2014-06-28 22:03
Arch_ble_ext_WakeUp_on的目的是什么?

你好,
我们正在使用SDK 5.0.4,我正在查看user_sleepmode示例。
看起来程序在两种情况下监听按钮单击中断。

第一种情况是在连接期间。开始倾听,user_app_set_button_event被调用并执行:

wkupct_register_callback (user_app_button_press_cb);
wkupct_enable_irq(wkupct_pin_select(gpio_button_port,gpio_button_pin),
wkupct_pin_极性(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, next_event), //极性
1,// 1事件
10);

听的时候停下来user_app_disable_button.这是一个电话wkupct_disable_irq();
监听回调(user_app_button_press_cb)也呼叫user_app_set_button_event继续收听按钮点击(实际上它在按钮模式下收听开关,通过选择正确的“next_event”)。

第二种情况是程序停止广告(10秒后)。什么时候user_app_adv_undirect_complete被称为状态GAP_ERR_CANCELED(即它是一个刻意的adv-stop)它呼叫:

ARCH_BLE_EXT_WAKEUP_ON();
//配置唤醒按钮
app_button_enable();

的目的ARCH_BLE_EXT_WAKEUP_ON.是:“将BLE核心放在永久性睡眠中。只有一个外部事件可以唤醒它。”.它只是将一个内部标志设置为true。
然后,app_button_enable.电话:

app_easy_wakeup_set(app_wakeup_cb);
wkupct_register_callback(app_button_press_cb);
wkupct_enable_irq(WKUPCT_PIN_SELECT(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN), //选择pin (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN)
wkupct_pin_polarity(gpio_button_port,gpio_button_pin,wkupct_pin_polarity_low),//极性低
1,// 1事件
40);

即它可以节省app_wakeup_cb.将来会被app_easy_wakeup,并对第一种情况运行类似的代码,以便开始侦听按钮中断。
发生中断时,app_button_press_cb被调用并执行:

如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN))
{
periph_init();
}
......

如果我理解正确的话,这个代码必须在深度睡眠的外部唤醒中调用(使用延长睡眠时调用它有害吗?)
然后,app_button_press_cb继续调用:

if(arch_ble_ext_wakeup_get()))
{
ARCH_SET_SLEEP_MODE(app_default_sleep_mode);
ARCH_BLE_FORCE_WAKEUP();
arch_ble_ext_wakeup_off ();
app_easy_wakeup();
}

例如,它检查外部唤醒标志是打开的,初始化睡眠模式(app_default_sleep_mode是deep-sleep),唤醒BLE,关闭外部唤醒标志(即计时器和BLE事件现在也可以唤醒)和调用app_easy_wakeup ()(电话app_wakeup_cb.正如我之前解释的那样)。

这种机制在第二种情况下有什么优点?我们可以避免打电话ARCH_BLE_EXT_WAKEUP_ON()然后我们不必重新配置睡眠模式并重新唤醒BLE。什么是呼唤的点ARCH_BLE_EXT_WAKEUP_ON()如果程序没有任何计时器并且没有发布(即计时器和BLE事件不能唤醒程序无论如何- 只有一个外部唤醒罐)。

如果我们使用,程序会在深度睡眠期间消耗更少的能量吗ARCH_BLE_EXT_WAKEUP_ON.

第二个案例如何从未拨打电话wkupct_disable_irq ()?后会睡觉ARCH_BLE_EXT_WAKEUP_ON.意味着您不必打电话wkupct_disable_irq ()醒来后?

谢谢,
oren zomer.

设备:
lc_dialog.
离线
最后一次露面:3周4天前
职员
加入:2016-09-19 23:20
你好oren,

你好oren,

我为延迟回答你的问题而道歉......

为了你的第一个问题,
不。你也可以用这个来延长睡眠时间。只有默认唤醒选项由用户设置。SDK负责如何唤醒所有模块的其余过程。
对于第二组问题,
即使系统处于深度睡眠状态,系统堆栈也会定期唤醒(在CFG_MAX_SLEEP_DURATION_EXTERNAL_WAKEUP_MS中定义)。这是轮询UART(这是在SDK的GTL接口上操作的副作用),以检查任何现有数据。user_app_undirect_complete()中的arch_ble_ext_wakeup_on()将在这些时间间隔内抑制这个唤醒过程,以节省电源。
注意:你可以在Smart Snippets中通过禁用此功能来注意到这一点
第三个问题,
对于中断,在第一种情况下,用户设置按钮来监听按钮按下,然后禁用它。然而,第二种情况是由sdk处理睡眠,需要中断处于活动状态,以便在每次系统处于睡眠状态时唤醒系统。
注意:有关睡眠和唤醒模式的更多信息,请参阅以下文档。
谢谢你联系我们。如果你有任何其他问题,请告诉我们。我们很乐意帮助您!
lc_dialog.
oren.
离线
最后一次露面:1年8个月前
专家
加入:2014-06-28 22:03
嗨LC,

嗨LC,
感谢您的信息响应。
我们现在注意到CFG_MAX_SLEEP_DOURATION_EXTERNAL_WAKEUP_MS参数 - 该Rwip_sleep()功能很复杂,但是我们理解你的解释。
我们希望模块尽可能长时间保持深度睡眠,而不是每10秒醒来。我们不关心轮询UART - 在我们的用例中,一旦模块刻录,它就永远不会连接到UART。
是否可以增加cfg_max_sleep_duration_external_wakeup_ms参数?如果是这样,最大值是什么?
我想我们应该使用ARCH_BLE_EXT_WAKEUP_ON.当我们想要深睡眠,直到外部唤醒。然而,在某些情况下,我们只想长时间(小时,天)深度睡眠 - 我们通过创建定期计时器来完成ke_timer_delay_max-1和一个柜台。我们每300秒醒来时都可以醒来,但不想每10秒醒来......

问候,
oren zomer.

P.S.
我们不关心不精确的时间 - 如果我们设置了1小时的计时器,我们不关心它在50分或70分钟后会醒来。对于我们的用例,20%的精度足够好。

lc_dialog.
离线
最后一次露面:3周4天前
职员
加入:2016-09-19 23:20
你好oren,

你好oren,

是,可以修改cfg_max_sleep_duration_external_wakeup_ms.从1SEC到最多23.3小时(以秒为单位批判的值)。当。。。的时候ARCH_BLE_EXT_WAKEUP_ON.被调用时,它将抑制这个值,使BLE进入永久睡眠,这与睡眠持续时间上的任何值是相同的。然而,如果ARCH_BLE_EXT_WAKEUP_OFF.调用时,sleep_duration上的值将生效。

对于您的第二个需求,我还没有完全理解用例。你能详细描述一下这个场景吗?

但是,您可以通过更改上述定义来扩展睡眠持续时间。这将控制BLE的唤醒时间。但是,这可以通过调用来施加困惑arch_ble_ext_wake_on ()要在外部事件(或)上唤醒,您还可以使用计时器作为唤醒机制而不是外部事件。

注意:BLE事件(假设10S)的睡眠过程由智能算法管理,该算法将决定将BLE放入睡眠状态。当我们在随机时间唤醒ble时,这种算法将检查它是否有效地返回睡眠或保持下一个正常事件(例如广告)并根据决定,这可能会消耗更多的能量预计。在安排唤醒时请考虑一下

问候,

信用证

oren.
离线
最后一次露面:1年8个月前
专家
加入:2014-06-28 22:03
你好,信用证,

你好,信用证,
第二个需求是,例如,当我们有一个传感器(按钮),我们想要深度睡眠直到外部事件发生或直到1个小时过去(自从我们开始睡觉以来)。

我们不能打电话ARCH_BLE_EXT_WAKEUP_ON.在这种情况下,如果我们需要在1小时后醒来,如果没有外部事件发生的......

app_easy_timer.不应调用上面的值ke_timer_delay_max-1(5分钟)所以我们使用一个计时器ke_timer_delay_max-1还有一个初始化为12的倒计时计数器。
当调用计时器 - 回调时,我们将计数器减少1,然后:
- 如果计数器高于0,我们重新创建定时器(延迟ke_timer_delay_max-1,即5分钟)。
- 如果计数器为0,我们知道12 * 5min = 1hour已通过。
如果介于两者之间发生了外部事件,则取消计时器。

我实际上认为这个诀窍应该是一个内置的功能app_easy_timer.在使用大延迟的情况下(在v5.0.4中app_easy_timer.呼叫ASSERT_ERROR(延迟< KE_TIMER_DELAY_MAX)也就是说,大的延迟是不允许的)。

你知道是否默认的10秒唤醒(由于cfg_max_sleep_duration_external_wakeup_ms.)在以前的SDK版本中也发生过吗?具体来说,我想知道版本3.0.4和3.0.8。我们将增加到23.3小时,但我们已经有很多模块已经烧毁了以前的sdk。

问候,
oren zomer.

oren.
离线
最后一次露面:1年8个月前
专家
加入:2014-06-28 22:03
嗨LC,

嗨LC,
23小时为82800000毫秒。
max_sleep_duration_external_wakeup.被定义为ms_to_slots_convert(cfg_max_sleep_duration_external_wakeup_ms)MS_TO_SLOTS_CONVERT (x)宏给((int)((1000 * x)/ 625))))
乘法到1000创建编译警告:“整数操作结果超出范围”警告(虽然除以625后的最终值,则在范围内)。
快速修复可能是将宏改变为:((int)((1000 *(长长)x)/ 625))

只是想让你知道...

问候,
oren zomer.

lc_dialog.
离线
最后一次露面:3周4天前
职员
加入:2016-09-19 23:20
你好oren,

你好oren,

截至目前,我们建议的是使用计时器并重新启动时间,直到您达到所需的时间。因为这是最好的方法,也有助于您的调试。

注意:我们不建议更改值max_sleep_duration_external_wakeup.因为它有效地改变了SDK实现。在之前的3.0.4和3.0.8版本中也是一样的。

我们会考虑您对默认选项的建议app_easy_timer。但是,到目前为止,它还不是一个默认特性。

另外,感谢您更改宏的建议。我将检查它,并升级作出纠正。

问候,

leepeng.