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

⚠️
大家好. .谢谢你来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,包含在主对话网站中。所有岗位和账户都已迁移。我们现在只接受新论坛的流量-请在上面发布任何新帖子//www.xmece.com/support.我们将在未来几天修复bug /优化搜索和标记。
4个职位/ 0个新
最后发表
jsayed
离线
最后看到:一年6个月前
加入:2014-12-11 23:46
唤醒-从外部引脚在延长睡眠模式

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

你好,

我正在做一个项目,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,重新启动广告

谢谢你!

设备:
PM_Dialog
离线
最后看到:1天16小时前
工作人员
加入:2018-02-08 11:03
嗨jsayed,

嗨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()。

  1. 设备配置无睡眠模式时,您是否停止广告?
  2. 能否删除if-condition中的GPIO_GetPinStatus() ?wkupct_enable_irq()用于检测唤醒中断,所以不需要获取GPIO的状态。

谢谢,PM_Dialog

jsayed
离线
最后看到:一年6个月前
加入:2014-12-11 23:46
谢谢你的快速回复

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

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()——>完成。

情况没有改变。谢谢你能给我更多的建议——谢谢你

PM_Dialog
离线
最后看到:1天16小时前
工作人员
加入:2018-02-08 11:03
嗨jsayed,

嗨jsayed,

如果您不停止广告,App_Advertise_Complete将永远不会击中。应用程序将向堆栈发送GAPM_CANCEL_CMD以停止广告。完成后,您将获得一个GAPM_ADV_UNDIRECT,这意味着已完成广告程序,并且将触发APP_ONC_ADC_UNDIRECT_COMPLETE。请检查app_task.c文件。在代码中启用了唤醒按钮的位置?仅在app_advertise_complete()中?

谢谢,PM_Dialog