嗨,我昨天发了帖子,但是我没有看到我的帖子,所以我又发了一次
你好
我在一个项目中工作,其中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激活,则重新启动广告
}
非常感谢。
嗨,贾耶德,
请查看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()。
谢谢,下午好
感谢您的快速响应-执行了您的建议,但不幸的是情况没有改变。
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。
情况并没有改变。进一步感谢你们的帮助——谢谢……同意
嗨,贾耶德,
如果你不停止广告,app_advertise_complete将永远不会击中。应用程序将向堆栈发送GAPM_CANCEL_CMD以停止发布。一旦它完成,您将得到一个GAPM_ADV_UNDIRECT,这意味着发布过程已经完成,app_on_adv_undirect_complete将被触发。请检查app_task.c文件。在代码中唤醒按钮是在哪里启用的?仅在app_advertise_complete() ?
谢谢,下午好