是否有任何示例程序响应按钮单击而不转到外部唤醒模式?

⚠️
大家好. .谢谢你来参加论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,并包含在主对话网站中。所有的帖子和账号都已迁移。我们现在只接受新论坛的流量-请张贴任何新的线程在//www.wsdof.com/support.我们将在未来几天修复bug /优化搜索和标记。
5个帖子/ 0个新
最后发表
奥伦
离线
最后看到:1年7个月前
专家
加入:2014-06-28 22:03
是否有任何示例程序响应按钮单击而不转到外部唤醒模式?

你好,
到目前为止,我只找到了外围的例子arch_ble_ext_wakeup_on ()在配置按钮和进入睡眠之前。
也就是说,程序在等待按钮点击时不打算工作(发布或响应计时器)。

此外,当wkupct回调被调用时,它做的事情类似于:

app_button_press_cb(void)
> {
if (GetBits16(SYS_STAT_REG, PER_IS_DOWN))
> {
> periph_init ();
>}
>
>如果(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 ();
>}
>}

注意如何调用arch_ble_ext_wakeup_off ()关闭布尔标记(命名为sleep_ext_force),所以future call toarch_ble_ext_wakeup_get ()将返回.因此,如果短时间内有许多中断(app_button_press_cb ()在一行中被调用多次),封装在第二如果语句将只执行一次。

我们有一个项目,其中在很短的时间间隔内有许多中断,我们只想对其进行一次响应。但是,我们希望程序在等待“点击按钮”(广告和运行计时器)时保持“工作”——例如,计算点击按钮的次数,并用这个数字更新广告负载。
我们正在经历一个非常奇怪的行为-程序重置,程序停止工作和浪费电池,等等。我们不确定窃听器在哪里。
是否有类似的示例程序?
我是否应该遵循类似的模式,比如:

> bool waiting_for_button __attribute__((section("retention_mem_area0"), zero_init));
app_button_press_cb(void)
> {
if (GetBits16(SYS_STAT_REG, PER_IS_DOWN))
> {
> periph_init ();
>}
>
>如果(waiting_for_button)
> {
> arch_set_sleep_mode (app_default_sleep_mode);
> arch_ble_force_wakeup ();
> waiting_for_button = false;
> app_easy_wakeup ();
>}
>}

例如,我是否应该使用一个不同的布尔标志waiting_for_button哪一个不影响睡眠呢arch_ble_ext_wakeup_on ()?
在不进入外部唤醒模式的情况下监听按钮点击是否有风险?比如,如果按钮在执行的同时被点击,程序就会中断?

我知道wkupct_enable_irq接受两个参数number-of-events和debounging -time。我们将使用更高的事件数量来避免过多的唤醒。我想确保即使事件数量很低程序也不会重置或失控。

问候,
奥伦佐莫

关键词:
设备:
奥伦
离线
最后看到:1年7个月前
专家
加入:2014-06-28 22:03
啊-没有html标签

啊-没有html标签来维护缩进…很抱歉代码很难看。

MT_dialog
离线
最后看到:两个月前两个星期前
工作人员
加入:2015-06-08 34
嗨,奥伦,

嗨,奥伦,

我不确定我是否得到了问题的底线,请看看下面的评论,希望能提供一些帮助。

不,没有其他示例演示使用按钮或处理多个唤醒中断。arch_ble_ext_wakeup_on()用于抑制设备每10秒的周期性唤醒,如果你有arch_ble_ext_wakeup_on(),你将能够从内部计时器唤醒,即使你不调用arch_ble_ext_wakeup_on(),你将能够听到外部唤醒中断,你不需要调用arch_ble_ext_wakeup_on()来启用外部中断(你将能够通过删除arch_ble_ext_wakeup_on()来验证这一点,并在回调中取消if()条件,但如果你这样做,请注意设备将在10秒的时间内自动唤醒,持续很短的一段时间)。当然,如果中断发生在唤醒ISR正在执行的同时,那么中断将被注册为挂起,并且会在当前运行的ISR退出时发生,这就是为什么你需要保持ISR尽可能短的原因。

由于MT_dialog

奥伦
离线
最后看到:1年7个月前
专家
加入:2014-06-28 22:03
你好,

你好,
这时我注意到我的一篇旧文章:https://support.dialog-semiconductor.com/forums/post/dialog-smartbond-bl..。
我们将CFG_MAX_SLEEP_DURATION_EXTERNAL_WAKEUP_MS从10秒增加到60秒-并修复了rwip_slot_2_lpcycles_rcx中的错误(即使用uint64_t而不是uint32_t)。我们将把它增加到1小时,所以我们可以忽略它的功耗在我们的计算中。
您已经说过,调用arch_ble_ext_wakeup_on()不会抑制计时器。我很困惑,因为arch_ble_ext_wakeup_on上面的代码注释说:“将BLE核心永久休眠。只有外部事件才能唤醒它。BLE永远沉睡着,等待着被强行唤醒。请更改评论。

我们还将更改程序,使其看起来与您的代码示例尽可能相似(除了计时器和广告仍将在等待按钮单击时运行)。

使用arch_ble_ext_wakeup_on()有什么负面影响吗?唤醒时间明显变长了吗?深度睡眠/长时间睡眠期间的耗电量有明显变化吗?为什么不是所有外设都默认使用arch_ble_ext_wakeup_on并抑制此计时器?10秒的唤醒有什么用?如果我将时间改为60秒或1小时会发生什么?

谢谢,
奥伦

MT_dialog
离线
最后看到:两个月前两个星期前
工作人员
加入:2015-06-08 34
嗨,奥伦,

嗨,奥伦,

我已经提到了arch_ble_ext_wakeup_on()的作用,所以如果您增加了CFG_MAX_SLEEP_DURATION_EXTERNAL_WAKEUP_MS,并且您对周期唤醒值感到满意,那么不使用arch_ble_ext_wakeup_on()是可以的。并不是所有的外围示例都使用这个函数,因为只有ble_app_sleepmode会在没有任何BLE活动的情况下进入永久睡眠状态,所以如果不使用这个函数,您将会周期性地看到小的唤醒。正如你在之前的帖子()中提到的,超时是GTL接口遗留下来的,因为你在之前的帖子中提到的bug应用了补丁,那么应该可以增加这个值。

由于MT_dialog