嗨,我昨天发了,但是我没有看到我的帖子,所以我要再发一次
你好,
我正在做一个项目,BLE设备(DA14580)处于延长睡眠模式。它唤醒执行它的广告周期,然后再次回到延长睡眠模式。它处于可连接模式,因此提供到中心设备的连接。-相当普通的BLE操作。有时我需要引起设备的注意。我通过一个交换机生成连接到GPIO_PORT_0和GPIO_PIN_1的外部中断(高到低)来执行此操作。这类似于SDK_5.0.4中的BLE示例,比如prox_reporter。或者这个论坛上的其他例子
但我有问题。因此需要一些指导。
请参阅以下代码:
使用app_default_sleep_mode = ARCH_SLEEP_OFF禁用睡眠模式。我在Keil与调试器禁用,和一个终端程序查看我的printf语句。在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,一切工作,直到我按下外部开关,然后设备进入LALA土地。它的行为就像它丢失了所有的I/O配置,这是正常的,当你从长时间睡眠中醒来。但是在这种情况下,唤醒控制器应该接管并调用中断回调例程。但事实并非如此。因此我的问题。
如果你能帮我度过这个难关,我会很感激的,谢谢
// ==========================================================.
我的代码,
Static void app_wakeup_cb(void) {
suart_printStr(“\ r \ nwakeUpCb”);
//如果state不是idle,则忽略该消息
if (ke_state_get(TASK_APP) == APP_CONNECTABLE) {
default_advertise_operation ();
}
}
// *********************************************************************************
静态孔隙app_button_press_cb(空白){
suart_printstr(“\ r \ nbtnstress”);
if(getBits16(sys_stat_reg,per_is_down)){
periph_init ();
}
如果(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();
}
}
//----------------------------------
空白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);//调试时间= 0
}
suart_printStr(“\ r \ nenb——”);
}
// ---------------------------------------------------------
void app_advertise_complete(const uint8_t status){
if (status == GAP_ERR_CANCELED){/ /取消取消
arch_ble_ext_wakeup_on ();
}
app_button_enable ();
user_app_adv_start ();//如果isAdvertisingSetActive,重新启动广告
}
谢谢你!
嗨jsayed,
请查看SDK的BLE_APP_SLEEPMODE示例。DA14580开始广告,如果未连接,则广告在预定义的时间之后停止(App_adv_Data_update_to)。因此,当广告完成后,触发user_App_Adv_Undirect_Complete(),配置唤醒按钮(App_Button_Enable)。user_app_add_undirect_complete在user_callback_config.h中注册.app_on_adv_undirect_complete项目的user_app_callbacks结构。如果我能够正确理解,而不是user_app_adv_undirect_complete(),你已经注册了app_advertise_complete(),不是吗?你能说明吗?
此外,如果您在调试模式下运行ble_app_sleemode示例,并且在app_wakeup_cb()和app_button_press_cb()中运行一个断点,您将看到当按钮被按下时,它们中的bot被触发,但首先执行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,
如果您不停止广告,App_Advertise_Complete将永远不会击中。应用程序将向堆栈发送GAPM_CANCEL_CMD以停止广告。完成后,您将获得一个GAPM_ADV_UNDIRECT,这意味着已完成广告程序,并且将触发APP_ONC_ADC_UNDIRECT_COMPLETE。请检查app_task.c文件。在代码中启用了唤醒按钮的位置?仅在app_advertise_complete()中?
谢谢,PM_Dialog