亲爱的Dialog_Support,
我们正在使用两个中断方法开发我们将唤醒设备的应用程序。
1.使用按钮中断
2.传感器中断[如果传感器中断引脚上的任何活动]
我已经提到了BLE_SLEEP_MODE示例,但对于我的应用程序,它无法正常工作。
我使用以下代码段来配置中断,
静态孔隙app_button_press_cb(空白)
{
arch_disable_sleep ();
// ARCH_FORCE_ACTIVE_MODE();
如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN))
{
periph_init ();
}
如果(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 ();
}
}
void app_button_enable(void)
{
app_easy_wakeup_set (app_wakeup_cb);
wkupct_register_callback(app_button_press_cb);
WKUPCT_PIN_SELECT(GPIO_I2C_BUZZER_PORT, ACCELEROMETER_INT), //选择pin (GPIO_PORT_1, GPIO_PIN_1)
wkupct_pin_polarity(gpio_key_port,gpio_key_pin,wkupct_pin_polarity_low)|wkupct_pin_polarity(gpio_i2c_buzzer_port,Accelerometer_Int,WKUPCT_PIN_POLARITY_LOW),//极性低
1,// 1事件
40);// debouncing time = 0
}
void user_app_add_undirect_complete(uint8_t状态)
{
//禁用BLE和TIMER事件的唤醒。只有外部(GPIO)唤醒事件可以唤醒处理器。
if(status == gap_err_canceled)
{
user_app_adv_start();
//配置唤醒按钮
app_button_enable();
}
}
使用此,我无法生成中断并从睡眠中唤醒我的设备。
一些随机行为正在发生,就像我只有第一次检测到按钮中断,如果重复第二次,则无法检测到。
与传感器中断相同。
请帮我解决问题。
感谢和问候
rohit.
嗨rajapurerohit,
您能否澄清您想要与您的申请有关的?As I can see in your code that you have posted, you call user_app_adv_start() into user_app_adv_undirect_complete() function, so when the advertise is completed (cancelled by your application) you will start advertise again and your device won’t go to sleep mode. So can you please explain what exactly you would like to do? For example you would like to advertise and have the wake up interrupt configured while advertising?
醒来可能会失败的几个原因:
•在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);
感谢和问候
rohit.
嗨rajapurerohit,
1,2)设备在广告和连接间隔之间睡眠。设备可以从预编程的BLE事件(广告事件或连接事件或内核定时器)或唤醒中断时唤醒。例如,在广告案例中,设备将唤醒广告,并将再次返回睡眠状态,直到下一个广告间隔时间经过时间。我无法获得你的意思,即使在手机上应该在手机上显示,即使它在睡眠状态。你能澄清你的问题吗?
3)在你上次发布的配置中,你已经在GPIO上配置了一个中断。这个中断只会在你的设备被唤醒并且它正在广告的时候被执行。这个配置不能在睡眠期间唤醒设备,唤醒控制器应该在设备进入睡眠模式时使用,以便外部中断唤醒它。
由于PM_dialog
您将必须了解设备的运行方式,该设备将根据广告间隔唤醒和广告,因此您可以将设备放在永久睡眠中并仅通过按钮或内核计时器唤醒,或者您可以设置标准的广告间隔,以便设备将自动唤醒(后者是从中央发现的唯一途径)。我还提到了您附加的代码实现中未遵循的一些事情:
1.启用终端请求的标准set_pad_functions和回调你也混合了中断醒来,当你在睡眠模式关于永久或自动醒来这些简单的gpio中断无法唤醒系统,该系统通过醒来醒来当睡眠中断。这些中断只会在系统始终处于开启状态时工作。
2.此外,在调用Timer App_addata_update_timer_used之后,调用您调用停止广告,然后您重新启动广告,然后启动唤醒中断,并且您也可以启用错误(传递错误的参数),因为您已将PIN参数混淆使用极性参数(请检查函数接受或查看此论坛票证的参数https://support.dialog-semiconductor.com/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 ();它是如何工作的,极性是什么。
在数据表中也没有多少解释。你能告诉我两个中断针灸配置的例子吗?
来自附带的链接,我也无法清除我的别针中断。
如果遵循睡眠模式示例配置,我无法检测到两个中断或只有一个中断第二个不起作用。
请帮我解决这个问题。
感谢和问候
rohit.
嗨rajapurerohit,
我已经修改了SDK5.0.4的ble_app_sleepmode示例,以便提供一个两个中断引脚配置的示例。在本例中,可以使用DA1458x ProDK使用SW2 (GPIO0_6) button2或SW3 (GPIO1_1)按钮唤醒设备。设备在通电时广告一段定义的时间(APP_ADV_DATA_UPDATE_TO)。默认值是10秒。在以上超时结束后,如果设备没有进入连接状态,它将停止广告。在此之后,设备什么也不做,并等待外部事件退出睡眠状态。你可以按我刚才提到的两个按钮中的一个来唤醒这个设备。按下按钮后,设备将重新开始进行预定时间的广告。您可以通过以下步骤修改ble_app_sleepmode示例。
1)将user_periph_setup.h中的SW2 (GPIO0_6) button2定义为HW_CONFIG_PRO_DK配置
#定义GPIO_BUTTON_2_PORT GPIO_PORT_0
#define gpio_button_2_pin gpio_pin_6.
2)保留按钮2。到达user_periph_setup.c文件并添加到gpio_reservations()函数以下代码:
保留_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_enable_irq(wkupct_pin_plect(gpio_button_port,gpio_button_pin)| wkupct_pin_select(gpio_button_2_port,gpio_button_2_pin),//选择pin(gpio_button_port,gpio_button_pin)
wkupct_pin_极性(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, WKUPCT_PIN_POLARITY_LOW
1,// 1事件
40);// debouncing time = 0
}
如果您遵循以下步骤,则必须能够使用两个中断引脚配置并使用其中任何一个唤醒您的设备。此外,我建议您再次检查申请中醒来的三种可能的原因可能会失败。
由于PM_dialog
你好pm_dialog,
感谢您的答复,
我有更改的功能,对我来说很好。
基本上我的最终目标是追随部分
1.在按下开关后醒来并在6秒后返回睡眠,如果未按下按钮
(运动检测)
2.在检测到运动后保持清醒,如果没有运动,6秒后恢复睡眠
再次检测到(切换)
3.在收到连接状态时醒来,需要嗡嗡声。然后回去
如果没有检测到动作(按下开关),6秒后进入睡眠状态
我正在使用Timer0和Timer 2用于PWM生成。但如果在上面提到的流程的情况下,那么M不能正确连接设备,并且PWM也不正常工作,因为它总是可以睡眠状态。
你能帮我使用计时器醒来,6秒后睡觉
感谢和问候
rohit.
嗨rajapurerohit,
我能理解的是,你想通过开关按钮或传感器中断来唤醒自己,然后播放6秒钟的广告。6秒后,设备应该进入睡眠状态,并通过下一个中断醒来。我理解对了吗?如果您想这样做,您应该在app_button_enable()函数中修改wkupct_enable_irq()函数的输入。在我发布的示例中,wkupct_enable_irq()函数启用了中断GPIO和两个按钮的极性。在您的情况下,您应该将wkupct_enable_irq()修改为:
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);// debouncing time = 0
例如,GPIO_SENSOR_PORT和GPIO_SENSOR_PIN。在您的应用程序中,您应该以输入您的GPIO传感器定义。为了宣传6秒,您醒来时,您应该更改广告数据时间的值。请转到user_sleepmode.h文件并将app_addata_update_to定义的值更改为600.此外,我建议您检查传感器的极性以捕获中断并触发唤醒控制器。例如,如果传感器的极性低,并且您将唤醒控制器的极性配置为低电平,则不会捕获中断,并且不会触发唤醒控制器。我在上一篇文章中提供的示例从两个源设置了一个唤醒信号,可以使用该信号并使用传感器的极性使用中断替换按钮。
3)我前一篇文章里已经提到过,当设备在延长睡眠模式只能从BLE事件醒来,当你会起床和睡眠有关的根据预定义的连接的间隔安排与你的主人,你不能只是去永久睡眠6秒钟,仍然能够保持联系。关于定时器,当在延长睡眠时,设备将关闭所有的外设,你将无法与PWM操作,而你在睡眠。请试着理解BLE是如何操作的。
https://support.dialog-semiconductor.com/forums/post/dialog-smartbond-bl..。
由于PM_dialog