你好,
我们正在使用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_polarity(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_add_undirect_complete.
is called with a status ofGAP_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.
,经营着一个相似的代码在奥德第一例er to starts listening for button interrupts.
发生中断时,app_button_press_cb.
被调用并执行:
if(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();
}
i.e. it checks that the external-wakeup-flag is on, initializes the sleep-mode (app_default_sleep_mode is deep-sleep), wakes up the BLE, turn off the external-wakeup flag (i.e. timers and BLE events can now wake up too) and callsapp_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.
你好oren,
我为延迟回答你的问题而道歉......
嗨LC,
感谢您的信息响应。
We now noticed the CFG_MAX_SLEEP_DURATION_EXTERNAL_WAKEUP_MS parameter - the
Rwip_sleep()
功能非常复杂,但我们理解你的解释。我们希望模块尽可能长时间保持深度睡眠,而不是每10秒醒来。我们不关心轮询UART - 在我们的用例中,一旦模块刻录,它就永远不会连接到UART。
是否可以增加cfg_max_sleep_duration_external_wakeup_ms参数?如果是这样,最大值是什么?
我想我们应该使用
ARCH_BLE_EXT_WAKEUP_ON.
当我们想要深睡眠,直到外部唤醒。然而,在某些情况下,我们只想长时间(小时,天)深度睡眠 - 我们通过创建定期计时器来完成ke_timer_delay_max-1
和一个柜台。我们每300秒醒来时都可以醒来,但不想每10秒醒来......Regards,
oren zomer.
P.S.
我们不关心不精确的时间 - 如果我们设置了1小时的计时器,我们不关心它在50分或70分钟后会醒来。对于我们的用例,20%的精度足够好。
你好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时,这种算法将检查它是否有效地返回睡眠或保持下一个正常事件(例如广告)并根据决定,这可能会消耗更多的能量预计。在安排唤醒时请考虑一下
Regards,
LC.
你好LC,
例如,当我们有传感器(按钮)并且我们想要深度睡眠,直到外部事件发生或直到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(delay,即不允许延迟大延迟)。
你知道是否默认的10秒唤醒(由于
cfg_max_sleep_duration_external_wakeup_ms.
)也发生在以前的SDK版本中?具体而言,我想了解3.0.4和3.0.8版本。我们将增加值到23.3小时,但我们已经有很多模块已经与以前的SDK燃烧。Regards,
oren zomer.
嗨LC,
23 hours is 82800000 milliseconds.
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))
。只是想让你知道...
Regards,
oren zomer.
你好oren,
截至目前,我们建议的是使用计时器并重新启动时间,直到您达到所需的时间。因为这是最好的方法,也有助于您的调试。
Note: We do not suggest to change the values of themax_sleep_duration_external_wakeup.因为它有效地改变了SDK实现。它在以前的3.0.4和3.0.8中也是如此。
我们会考虑您对默认选项的建议app_easy_timer。但是,截至目前它不可用作默认功能。
此外,感谢您建议更改宏。我会检查出来并升级以进行更正。
Regards,
leepeng.