亲爱的Dialog_Support,
我们正在使用两个中断方法开发我们将唤醒设备的应用程序。
1.使用按钮中断
2.传感器中断[如果传感器中断引脚上的任何活动]
我引用了ble_sleep_mode的例子,但对于我的应用程序,它不能正常工作。
我使用以下代码段来配置中断,
静态void app_button_press_cb(void)
{
ARCH_DISABLE_SLEEP();
// ARCH_FORCE_ACTIVE_MODE();
if(getBits16(sys_stat_reg,per_is_down))
{
periph_init();
}
if(arch_ble_ext_wakeup_get()))
{
ARCH_SET_SLEEP_MODE(app_default_sleep_mode);
ARCH_BLE_FORCE_WAKEUP();
ARCH_BLE_EXT_WAKEUP_OFF();
app_easy_wakeup();
}
}
空白app_button_enable(空白)
{
app_easy_wakeup_set(app_wakeup_cb);
wkupct_register_callback(app_button_press_cb);
wkupct_enable_irq(wkupct_pin_plect(gpio_key_port,gpio_key_pin)| wkupct_pin_select(gpio_i2c_buzzer_port,Accelerometer_int),//选择PIN(GPIO_PORT_1,GPIO_PIN_1)
wkupct_pin_polarized _low (GPIO_I2C_BUZZER_PORT, ACCELEROMETER_INT, wkupct_pin_极化_low), //极性低
1,// 1事件
40);//揭发时间= 0
}
空白user_app_adv_undirect_complete (uint8_t状态)
{
//禁用BLE和定时器事件的唤醒。只有外部(GPIO)唤醒事件才能唤醒处理器。
if(status == gap_err_canceled)
{
user_app_adv_start();
//配置唤醒按钮
app_button_enable();
}
}
使用这个我无法产生中断和唤醒我的设备从睡眠。
一些随机行为正在发生,就像我只有第一次检测到按钮中断,如果重复第二次,则无法检测到。
与传感器中断相同。
请帮我解决这个问题。
感谢致敬
罗希特
嗨Rajapurerohit,
你能澄清一下你的申请要做什么吗?正如我在你的代码中看到的,你已经发布,你调用user_app_adv_start()到user_app_adv_undirect_complete()函数,所以当广告完成(取消你的应用),你将开始再次广告,你的设备不会进入睡眠模式。所以你能解释一下你到底想做什么吗?例如,您想要广告和唤醒中断配置时,广告?
醒来可能失败的几个原因:
•在user_app_adv_undirect_complete()函数中,您不调用arch_ble_ext_wakeup_on()函数,作为SDK的ble_app_sleepmode示例。该函数在广告完成时将sleep_ext_force变量变为true,默认情况下为false。当按下按钮触发app_button_press_cb()函数时,arch_ble_ext_wakeup_get()将返回默认值为false,因此进入if (arch_ble_ext_wakeup_get())的代码将不会执行。所以,我建议检查一下。
•此外,您应该检查唤醒引脚的状态,并确保它们均高(由于您已将唤醒配置为低电平时)。由于两个源中的一个留在中断状态(在您的情况下),因此当另一个中断切换低时,唤醒控制器不会被触发。
•此外,您是否第二次将按钮启用到应用程序代码中?如果它启用了一次,只有第一次可以检测按钮中断。所以在你想从外部中断唤醒之前,你会调用app_button_enable()吗?
由于PM_Dialog
你好pm_dialog,
感谢您的答复。
我的要求是,
1.在Extended_sleep模式下配置设备,当从按钮中断时,传感器中断以及如果在连接后写入特性时,请唤醒。
2.广告和连接是否有可能睡觉?
其次,希望在广告期间在睡眠中设置设备,但它应该在我的移动应用程序上显示,即使它在睡眠状态。
如果移动应用程序连接,则睡眠。可能吗?如果是,我应该遵循哪种算法。
3. algorithm现在实施的是唤醒设备,只要有按钮或传感器中断,但在有按钮中断时无法唤醒设备,我在我之前的评论中有附加的代码片段。
GPIO配置如下
GPIO_ConfigurePin(GPIO_KEY_PORT, GPIO_KEY_PIN, INPUT_PULLUP, PID_GPIO, false);
gpio_enableirq(gpio_key_port,gpio_key_pin,gpio3_irqn,true,true,250);
GPIO_RegisterCallback (GPIO3_IRQn PushButtonInterruptHandler);
gpio_configurepin(gpio_sensor_port,sensor_int,input_pulldown,pid_gpio,false);
gpio_enableirq(gpio_sensor_port,sensor_int,gpio2_irqn,false,true,250);
GPIO_RegisterCallback (GPIO2_IRQn SENSORInterruptHandler);
感谢致敬
罗希特
嗨Rajapurerohit,
1,2)设备会在广告和连接间隔之间进入睡眠状态。设备可以从一个预先编程的BLE事件(一个广告事件或一个连接事件或一个内核计时器)或一个唤醒中断中唤醒。例如,在广告的情况下,设备将唤醒广告,并再次返回睡眠,它将不会广告,直到时间为下一个广告间隔。我不能理解你的意思,你的设备应该显示在你的手机,即使它在睡眠。你能把你的问题说清楚吗?
3)在您在上一篇文章中发布的配置中,您已在GPIO上配置了中断。此中断将仅在您的设备唤醒时执行,并且它是广告。此配置无法在睡眠期间唤醒设备,当设备进入睡眠模式时,应使用唤醒控制器,以便外部中断唤醒它。
谢谢pm_dialog.
您将必须了解设备的运行方式,该设备将根据广告间隔唤醒和广告,因此您可以将设备放在永久睡眠中并仅通过按钮或内核计时器唤醒,或者您可以设置标准的广告间隔,以便设备将自动唤醒(后者是从中央发现的唯一途径)。我还提到了您附加的代码实现中未遵循的一些事情:
1.You enable the standard IRQs in the set_pad_functions and in the callbacks you are also mixed up with the wake up interrupt, when you are in sleep mode regarding permanent or wake up automatically those simple gpio interrupts won’t be able to wake up the system, the system wakes up when sleep via the wake up interrupt. Those interrupts will only work while the system is always on.
2.计时器app_adv_data_update_timer_used后还叫你调用停止广告然后重新启动广告然后启用中断醒来,和你也使错了(传递错误的参数)自从你混销参数与极性参数(请检查参数函数接受或检查这个论坛的票https://support.dialog-semicondiondiondum/forums/post/dialog-smartbond-bl ...)。Additionally when the interrupt occurs from the external source you send a start advertising command while you are still advertising, but you won’t be able to do that ever since you are checking arch_ble_ext_wakeup_get() which will always will return flash since you have never enabled the arch_ble_ext_wakeup_on() (which is something that I’ve already mentioned in previous post).
综上所述,我不知道您所附加的代码到底应该做什么,或者您想要做什么,我建议您看看ble_app_sleepmode示例,并尝试理解系统究竟是如何运行的。
谢谢pm_dialog.
嗨pm_dialog,
感谢您的答复。
但我无法理解wkupct_enable_irq();它是如何工作和什么极性。
在数据表中也没有太多的解释。你能给我两个中断引脚配置的例子吗?
来自附带的链接,我也无法清除我的别针中断。
如果遵循睡眠模式的例子配置,我不能检测到两个中断或它工作只有一个中断,第二个一个不会工作。
请帮我解决问题。
感谢致敬
罗希特
嗨Rajapurerohit,
我已经修改了SDK5.0.4的BLE_APP_SLEEPMODE示例,以便为您提供两个中断引脚配置的示例。在此示例中,您可以使用DA1458x Prodk使用SW2(GPIO0_6)按钮2或使用SW3(GPIO1_1)按钮唤醒您的设备。设备通电时,该设备已广告已定义的时间(App_add_data_update_to)。默认值为10秒。在上述超时到期后,如果设备未进入连接状态,则会停止广告。之后,该设备无能为力并等待外部事件以退出睡眠状态。您可以通过按我刚刚提到您的两个按钮之一唤醒设备。按钮按下设备后,将开始再次通告预定义的时间。您可以按照以下步骤修改BLE_APP_SLEEPMODE示例。
1)将user_periph_setup.h中的sw2(gpio0_6)按钮2定义为hw_config_pro_dk配置
#define gpio_button_2_port gpio_port_0.
#define gpio_button_2_pin gpio_pin_6.
2)保持沉默。获取user_periph_setup.c文件并添加到GPIO_reservations()函数,代码如下:
RESERVE_GPIO(PUSH_BUTTON, GPIO_BUTTON_2_PORT, GPIO_BUTTON_2_PIN, PID_GPIO);
3)转到user_periph_setup.c和在set_pad_functions()中添加以下代码:
gpio_configurepin(gpio_button_2_port,gpio_button_2_pin,input_pullup,pid_gpio,false);
4)在sleep_mode。c,用下面的函数替换app_button_enable()函数。下面的函数将两个按钮设置为唤醒中断。
静态void app_button_enable(void)
{
app_easy_wakeup_set(app_wakeup_cb);
wkupct_register_callback(app_button_press_cb);
WKUPCT_PIN_SELECT(GPIO_BUTTON_2_PORT, GPIO_BUTTON_2_PIN), //选择pin (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN)
wkupct_pin_polarity(gpio_button_port,gpio_button_pin,wkupct_pin_polarity_low)|wkupct_pin_polarity(gpio_button_2_port,gpio_button_2_pin,wkupct_pin_polarity_low),//极性低
1,// 1事件
40);//揭发时间= 0
}
如果你遵循下面的步骤,你必须能够有两个中断引脚配置和唤醒你的设备使用他们中的任何一个。另外,我建议您再次检查应用程序中唤醒可能失败的三个可能原因。
谢谢pm_dialog.
你好pm_dialog,
感谢您的答复,
我已经改变了功能,它很适合我。
基本上我的最终目标是达到以下部分
1.按下开关后保持清醒状态,如果没有按下开关,6秒后返回睡眠状态
(检测到的运动)再次
2.在检测到运动后醒来,6秒后恢复睡眠,如果动作不是
再次检测到(切换)
3.在收到处于连接状态的东西并需要嗡嗡作响时保持清醒。然后回去
6秒后睡觉,如果没有检测到动作(切换)再次
我正在使用Timer0和Timer 2用于PWM生成。但如果在上面提到的流程的情况下,那么M不能正确连接设备,并且PWM也不正常工作,因为它总是可以睡眠状态。
你能帮我使用计时器醒来,6秒后睡觉
感谢致敬
罗希特
嗨Rajapurerohit,
1,2)由于我能够理解,您希望通过交换机按钮中断或通过传感器中断醒来,并通过传感器中断并宣传6秒。6秒后,设备应睡觉并通过下一个中断唤醒。我明白了吗?如果您想要这样做,则应在App_Button_Enable()函数中修改WKUPCT_ENABLE_IRQ()函数的输入。在我发布的示例中,WKUPCT_ENABLE_IRQ()函数使得中断GPIO和两个按钮的极性。在您的情况下,您应该修改wkupct_enable_irq()作为:
wkupct_enable_irq(wkupct_pin_plect(gpio_button_port,gpio_button_pin)| wkupct_pin_select(gpio_sensor_port,gpio_sensor_pin),//选择pin(gpio_button_port,gpio_button_pin)
wkupct_pin_polarity(gpio_button_port,gpio_button_pin,wkupct_pin_polarity_low)|wkupct_pin_polarity(gpio_sensor_port,gpio_sensor_pin,wkupct_pin_polarity_low),//极性低
1,// 1事件
40);//揭发时间= 0
例如,GPIO_SENSOR_PORT和GPIO_SENSOR_PIN。在您的应用程序中,您应该以输入您的GPIO传感器定义。为了宣传6秒,您醒来时,您应该更改广告数据时间的值。请转到user_sleepmode.h文件并将app_addata_update_to定义的值更改为600.此外,我建议您检查传感器的极性以捕获中断并触发唤醒控制器。例如,如果传感器的极性低,并且您将唤醒控制器的极性配置为低电平,则不会捕获中断,并且不会触发唤醒控制器。我在上一篇文章中提供的示例从两个源设置了一个唤醒信号,可以使用该信号并使用传感器的极性使用中断替换按钮。
3)当我在前一篇文章中已经提到了,当设备处于扩展睡眠模式时,您只能从BLE事件唤醒,当连接时,您将根据您与您安排的预定义连接间隔唤醒和睡眠master, you can’t just go to permanent sleep for 6 seconds and still be able to maintain a connection. Regarding the timers, when in extended sleep the device will shut down all the peripherals, you are not going to be able to operate with PWM while you are in sleep. Please try to understand how BLE operates.
https://support.dialog-semicondiondiondum/forums/post/dialog-smartbond-bl ...
谢谢pm_dialog.