嗨,我昨天发布了,但我没有看到我的帖子,所以我再次发布它
你好,
我正在研究一个项目,其中BLE设备(DA14580)处于扩展睡眠模式。它唤醒了它的广告周期,并再次返回扩展睡眠模式。其在可连接模式下,因此提供与中央设备的连接。- 非常漂亮的香草池。现在,我需要获取设备注意。我通过开关执行此操作,该开关生成连接到GPIO_PORT_0和GPIO_PIN_1的外部中断(高到低电平)。这与SDK_5.0.4示例中类似于BLE示例,例如Prox_Reporter。或本论坛的其他例子
但我对此有意见。因此需要一些指导。
请参阅下面的代码:
A.使用app_default_sleep_mode = ach_sleep_off禁用睡眠模式。我在禁用调试器和终端程序中在keil中,查看我的printf staments。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时,everthing工作,直到我按外部开关,然后设备进入拉拉土地。它的行为就像它丢失了它的所有I / O配置,当您从睡眠中唤醒时是正常的。但在这种情况下,唤醒控制器应接管并称为中断回调例程。但它没有。因此我的问题。
我将夸大其一谈,让我感到厌烦 - 谢谢
//==========================================================
我的代码 -
静态void app_wakeup_cb(void){
suart_printstr(“\ r \ nwakeupcb”);
//如果状态不空闲,请忽略该消息
if(ke_state_get(task_app)== app_connectable){
default_advertise_operation();
}
}
// *********************************************************************************
静态void app_button_press_cb(void){
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_SET_SLEEP_MODE(app_default_sleep_mode);
arch_ble_force_wakeup ();
ARCH_BLE_EXT_WAKEUP_OFF();
app_easy_wakeup ();
}
}
// -------------------------------
void app_button_enable(void){
app_easy_wakeup_set(app_wakeup_cb);
wkupct_register_callback(app_button_press_cb);
if(gpio_getpinstatus(gpio_port_0,gpio_pin_1)){
wkupct_enable_irq(wkupct_pin_select(gpio_port_0,gpio_pin_1),
wkupct_pin_polarity(gpio_port_0,gpio_pin_1,wkupct_pin_polarity_low),
1,// 1事件
0);// debouncing time = 0
}
suart_printstr(“\ r \ nenb-”);
}
//---------------------------------------------------
无效app_advertise_complete(const uint8_t status){
if(status == gap_err_canceled){
ARCH_BLE_EXT_WAKEUP_ON();
}
app_button_enable();
user_app_adv_start();//如果ISAdvertisingSetactiveStactiveStiveRative Realart Advertision
}
谢谢
嗨jsayed,
请看看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()中的一个断点,您将看到按下按钮时触发它们的机器人,但首先执行app_button_press_cb()。
谢谢,PM_DIALOG.
感谢您的快速回复 - 执行您建议的内容,但不幸的情况不会发生变化。
0.是的——> .app_on_adv_undirect_complete = app_advertise_complete,在user_app_callbacks结构中设置
1.不,我不停止广告,当设备配置没有睡眠模式 - 代码是相同的 - 除了我翻转睡眠模式以扩展睡眠模式。在user_config.h中,我选择一个或其他,编译和重新运行。
// const static sleep_state_t app_default_sleep_mode = arch_sleep_off;
const static sleep_state_t app_default_sleep_mode = arch_ext_sleep_on;
2.删除GPIO_GETPINSTATUS()--->完成。
情况并没有改变。欣赏来自你的更新穿透 - 谢谢... jsayed
嗨jsayed,
如果你不停止发布,app_advertise_complete将永远不会成功。应用程序将向堆栈发送一个GAPM_CANCEL_CMD以停止发布。一旦它完成,您将获得一个GAPM_ADV_UNDIRECT,这意味着发布过程已经完成,并且将触发app_on_adv_undirect_complete。请检查app_task.c文件。在代码中,唤醒按钮是在哪里启用的?仅在app_advertise_complete()中?
谢谢,PM_DIALOG.