唤醒-在延长睡眠模式下从外部引脚唤醒

⚠️
您好,谢谢您来到论坛。令人兴奋的消息!我们正在迁移到新的论坛平台,该平台将提供更好的功能,并包含在主对话网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量-请在//www.wsdof.com/support.我们将在未来几天内修复bug/优化搜索和标记。
4个员额/0个新员额
最后一篇文章
杰萨耶德
离线
最后一次见到:1年4个月前
加入:2014-12-11 23:46
唤醒-在延长睡眠模式下从外部引脚唤醒

嗨,我昨天发了帖子,但是我没有看到我的帖子,所以我又发了一次

你好

我在一个项目中工作,其中BLE设备(DA14580)处于扩展睡眠模式。它唤醒执行它的广告周期,然后再次返回到扩展睡眠模式。它处于可连接模式,因此提供到中央设备的连接。-非常不可连接的操作。我不时需要引起设备注意。我通过开关生成外部中断(从高到低)来执行此操作连接到GPIO_端口_0和GPIO_引脚_1。这类似于SDK_5.0.4示例中的BLE示例,如prox_reporter。或本论坛上的其他示例

但我对此有意见。因此需要一些指导。

请参阅下面的代码:

A.使用app_default_sleep_mode=ARCH_sleep_OFF禁用睡眠模式。我在Keil中禁用调试器,并使用一个终端程序查看我的打印文件。在app_button_enable()之后,意味着它已经配置了按钮。我按下外部开关,就能够到达中断回调(void app_button_press_cb()),我已经验证了arch_ble_ext_wakeup_get()返回true。除了从未调用app_wakeup_cb()之外,所有操作看起来都很好。发生这种情况是因为我没有处于深度睡眠模式吗?

B.当我设置app_default_sleep_mode=ARCH_EXT_sleep_ON时,一切都会工作,直到我按下外部开关,然后设备进入拉拉区。它的行为就像它丢失了所有的I/O配置,这在您从延长睡眠中醒来时是正常的。但是在这种情况下,唤醒控制器应该接管并调用中断回调例程。但事实并非如此。这就是我的问题。

我会感谢任何帮助我度过这一关的——谢谢

//==========================================================

我的代码-

静态无效应用程序\唤醒\ cb(无效){
suart_printStr(“\r\nwakeUpCb”);
//如果状态不是空闲,则忽略该消息
if(ke_state_get(TASK_APP)=APP_CONNECTABLE){
默认_播发_操作();
}
}

// *********************************************************************************

静态无效应用按钮按下cb(无效){

suart_printStr(“\ r \ nbtnPressed”);

if (GetBits16(SYS_STAT_REG, PER_IS_DOWN)) {
periph_init();
}

if(arch_ble_ext_wakeup_get()){
suart_printStr(“\r\ngotExtWup”);
拱设置睡眠模式(应用默认睡眠模式);
arch_ble_force_wakeup ();
拱门可外接唤醒关闭();
app_easy_wakeup ();
}

}

//----------------------------------
作废应用程序\按钮\启用(作废){

app_轻松_唤醒_设置(app_唤醒_cb);
wkupct注册回调(应用按钮按下cb);

if(GPIO_GetPinStatus(GPIO_端口_0,GPIO_引脚_1)){
wkupct_启用_irq(wkupct_引脚_选择(GPIO_端口_0,GPIO_引脚_1),
WKUPCT_引脚_极性(GPIO_端口_0、GPIO_引脚_1、WKUPCT_引脚_极性_低),
1,//1事件
0);//去抖动时间=0
}

suart_printStr(“\r\nenb-”);
}

//---------------------------------------------------
Void app_advertise_complete(const uint8_t status){

如果(状态==间隙错误已取消){
拱门可外接唤醒开启();
}

应用程序按钮启用();
user_app_adv_start();//如果isAdvertisingSetActive激活,则重新启动广告
}

非常感谢。

设备:
PM_对话框
离线
最后一次见到:1天5小时前
工作人员
加入:2018-02-08 11:03
嗨,贾耶德,

嗨,贾耶德,

请查看SDK的ble_app_sleepmode示例。DA14580开始发布,如果它没有连接,则在预定义的时间(APP_ADV_DATA_UPDATE_TO)后停止发布。因此,当发布完成时,会触发user_app_adv_undirect_complete(),并配置唤醒按钮(app_button_enable)。user_app_adv_undirect_complete在user_app_callbacks结构的.app_on_adv_undirect_complete项中注册,该项在user_callback_config.h中。如果我能够正确地理解,你已经注册了app_advertise_complete(),而不是user_app_adv_undirect_complete(),不是吗?您能指出吗?

此外,如果在调试模式下运行ble_app_sleemode示例,在app_wakeup_cb()中有一个断点,在app_button_press_cb()中有一个断点,则按下按钮时会触发其中的bot,但首先执行app_button_press_cb()。

  1. 当设备配置为无睡眠模式时,您会停止广告吗?
  2. 能否在if条件下删除GPIO_GetPinStatus()?wkupct_enable_irq()用于检测唤醒中断,因此无需获取GPIO的状态。

谢谢,下午好

杰萨耶德
离线
最后一次见到:1年4个月前
加入:2014-12-11 23:46
谢谢你的快速回复

感谢您的快速响应-执行了您的建议,但不幸的是情况没有改变。

0.是的——> .app_on_adv_undirect_complete = app_advertise_complete,在user_app_callbacks结构中设置

1.不,当设备配置为无睡眠模式时,我不会停止播发——代码是相同的——只是我将无睡眠模式切换为扩展睡眠模式。在user_config.h中,我选择其中一种,编译并重新运行。

//const static sleep\u state\u t app\u default\u sleep\u mode=ARCH\u sleep\u OFF;
const static sleep\u state\u t app\u default\u sleep\u mode=ARCH\u EXT\u sleep\u ON;

2.删除GPIO_GetPinStatus()-->done。

情况并没有改变。进一步感谢你们的帮助——谢谢……同意

PM_对话框
离线
最后一次见到:1天5小时前
工作人员
加入:2018-02-08 11:03
嗨,贾耶德,

嗨,贾耶德,

如果你不停止广告,app_advertise_complete将永远不会击中。应用程序将向堆栈发送GAPM_CANCEL_CMD以停止发布。一旦它完成,您将得到一个GAPM_ADV_UNDIRECT,这意味着发布过程已经完成,app_on_adv_undirect_complete将被触发。请检查app_task.c文件。在代码中唤醒按钮是在哪里启用的?仅在app_advertise_complete() ?

谢谢,下午好