使用BLE定时器睡眠唤醒

了解更多常见问题解答教程

9个帖子/ 0个新
最后一篇
巴拉吉
离线
最后一次露面:3周6天前
加入:2019-12-06 06:48
使用BLE定时器睡眠唤醒

你好,

我使用USB开发工具包,以尽量减少功耗,我们正试图合并睡眠模式之一从以下链接

http://lpccs-docs.dialog-semiconductor.com/DA14531_Sleep_Mode + /介绍……

我的要求是,

1.在每100毫秒的周期中,它应该休眠50毫秒(剩下的50毫秒,它将做adc读取和更新到ble)

2.通过BLE计时器它应该醒过来了。

您可以为我提供以上约束的一个例子。

谢谢提前

巴拉吉。

mhv_dialog.
离线
最后一次露面:2天前1周
职员
加入:15 2013-12-06
嗨,巴拉

嗨,巴拉

选择三个不同模式之一后,SDK6管理SleepMode。在您的情况下,最佳模式将延长睡眠状态。设置此模式时(根据SleepMode教程)设备将自动唤醒以执行任何BLE事务 - 您不必在代码中执行任何操作以确保正确的BLE唤醒。

就常规ADC活动而言,您可以选择使用app_easy_timer触发读数,或者您可以将ADC绑定到每个BLE事件的尾部。您可以在此处找到有关如何在此处使用app_easy_timer的说明:http://lpccs-docs.dialog-semiconductor.com/Tutorial_SDK6/timer.html

将ADC读数与每个BLE事件结束的读数稍微更高的节能,因为它限制了唤醒量。您可以在主标头文件中定义宏函数,例如user_myproj.h:

#定义DLG_EVENT_HANDLER_EXIT () (ble_event_ended ())

在这个文件中还添加一个原型函数:

空白ble_event_ended(无效);

最后在user_myproj.c中,在此函数中实现您的ADC。

我希望这有帮助。

/ MHv

巴拉吉
离线
最后一次露面:3周6天前
加入:2019-12-06 06:48
嗨mhv,

嗨mhv,

感谢您的快速回复,我会尝试调查它,只需进行后续查询,我需要在ble时为每100毫秒实现相同的ADC操作未连接.my广告间隔是687.5ms,广告超时是3分钟。广告周期仅在用户按下按钮时重新启动,直到无线电应保持关闭。是有可能的“延长睡眠"如果BLE是像你上面提到的那样连接的"深度睡眠“当没有连接BLE时。备用建议是相同的。

提前致谢!

Br,

巴拉。

mhv_dialog.
离线
最后一次露面:2天前1周
职员
加入:15 2013-12-06
嗨,巴拉

嗨,巴拉

这就只剩下app_easy_timer,这是最容易实现的。对于需要每100ms(在您的情况下执行ADC读数)唤醒的设备来说,延长睡眠时间是功率最低的解决方案。从深度睡眠中醒来需要额外的能量,以便从OTP复制到RAM执行。如果您的应用程序代码是在flash中,那么深度睡眠只会对天数或数周的睡眠时间有用。

请记住,睡眠由SDK管理。除非:

  1. 蓝牙无线电需要有效
  2. 默认睡眠模式设置为ARCH_SLEEP_OFF
  3. 您的应用程序处于活动状态(例如读取ADC)
  4. 下一个预定的活动很快就会发生这种能量将被睡觉浪费

/ MHv

巴拉吉
离线
最后一次露面:3周6天前
加入:2019-12-06 06:48
嗨mhv,

嗨mhv,

我把ble_app_sleepmode项目和配置了一个app_easy定时器user_sleepmode.c.

void user_app_adv_undirect_complete(uint8_t status) {app_awake_timer_used = EASY_TIMER_INVALID_TIMER;//关闭BLE和timer事件的唤醒。只有外部(GPIO)唤醒事件才能唤醒处理器。if (status == GAP_ERR_CANCELED) {#ifdef GPIO_WAKE arch_ble_ext_wakeup_on();//设置唤醒按钮app_button_enable();#endif #ifdef BLE_TIMER_WAKE arch_ble_ext_wakeup_off();ble_timer_wake ();# endif}}

在这个ble_timer_wake()里面

Static void ble_timer_wake(void) {app_easy_wakeup_set(app_wakeup_cb);if(! app_wake_timer_used) {APP_WAKE_UP_TIMER = app_easy_timer(APP_WAKE_UP_TIMER,app_ble_wkp_cb);FUNCTION static void app_ble_wkp_cb(void) {#if !defined (__DA14531__) if (GetBits16(SYS_STAT_REG, PER_IS_DOWN)) #endif {app_wkp_cb ();} 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 ();GPIO_SetInactive (GPIO_LED_PORT GPIO_LED_PIN);//唤醒后关闭led}}

我制作了5秒的BLE ADV超时,睡眠时间为10秒,唤醒后。它按预期工作。

现在我有了一个用户应用程序任务,它在user_app_callback下面配置

.app_on_set_dev_config_complete = user_on_set_dev_config_complete

创建的函数原型和定义如下

空白user_on_set_dev_config_complete(无效);void user_on_set_dev_config_complete(){//配置一个用户ble定时器user_app_timer_used = app_easy_timer(USER_APP_TIMER, user_app_timer_cb);// 1 second timer default_app_on_set_dev_config_complete();} //在回调我正在切换gpio每1秒静态void user_app_timer_cb() {if(usr_adv_flag == 0) {GPIO_SetActive(GPIO_LED_PORT,GPIO_LED_PIN);//这个引脚不同于LED引脚usr_adv_flag = 1;// arch_printf(“Led On \n”);} else {GPIO_SetInactive(GPIO_LED_PORT,GPIO_LED_PIN);usr_adv_flag = 0;// arch_printf(“Led Off \n”);}}

我担心的是,如果应用程序是广告,在上述任务的执行有延迟,但当ble是在延长睡眠,它工作如预期。什么可能是可能的错误。

我需要知道一旦停止adv是如何达到睡眠的,参见下面的片段。

static void adv_data_update_timer_cb(){//如果mnd_data_index设置了MSB,制造商数据存储在扫描响应uint8_t *mnf_data_storage = (mnf_data_index & 0x80) ?stored_scan_rsp_data: stored_adv_data;//更新制造商数据mnf_data_update();//更新广告数据(制造商数据)memcpy(mnf_data_storage + (mnf_data_index & 0x7F), &mnf_data, sizeof(struct mnf_specific_data_ad_structure));//动态更新广告数据app_easy_gap_update_adv_data(stored_adv_data, stored_adv_data_len, stored_scan_rsp_data, stored_scan_rsp_data_len);//停止广告空中操作-按一个按钮将唤醒系统app_easy_gap_advertise_stop();}

1。主循环设置睡眠模式如何?

2.如果将BLE_APP_PRESENT禁用应用程序以输入睡眠?

提前谢谢,

Br,

巴拉吉。

mhv_dialog.
离线
最后一次露面:2天前1周
职员
加入:15 2013-12-06
嗨Belaji,

嗨Belaji,

蓝牙活动的优先级高于任何用户应用程序。这意味着有时您的app_easy_timer会稍后触发。在实时执行附近实现的唯一方法是停止所有蓝牙LE活动(没有广告,无连接)。

睡眠实现是SDK中最复杂的部分,并且完全从用户抽象出来。超出论坛的范围,可以解释这一点的复杂细节。如前所述的回复,您需要了解的只是睡眠的就是您可以设置默认操作模式,并且设备将在何时睡眠状态。请看看“使用SDK6开始”教程我之前提到的。在该教程中,您可以找到关于睡眠模式所需的所有内容。

取消BLE_APP_PRESENT的定义只有在您以GTL模式使用设备时才相关(而您不是),所以保持原样。

/ MHv

巴拉吉
离线
最后一次露面:3周6天前
加入:2019-12-06 06:48
嗨mhv,

嗨mhv,

感谢您详细的回复。就像你说的,没有广告或者没有应用的时候。用户应用程序将按照预期执行。但是我们的产品要求没有达到。我的邮箱:balaji.s@pmsind.com..我可以分享我们的需求,经过4个月的开发,我们陷入了困境。我们需要支持对SDK的轻微修改。如果这个问题没有解决,我们将被迫更改BLE模块。到目前为止,你们的产品很棒,请记住,我们的智能手杖产品(我们选择ble设计使用da14531)到目前为止售出了10万件。请考虑我的要求并尽早回复。

谢谢提前

布尔

巴拉吉

巴拉吉
离线
最后一次露面:3周6天前
加入:2019-12-06 06:48
嗨mhv,

嗨mhv,

当我设置睡眠模式时

静态const sleep_state_t app_default_sleep_mode = ARCH_EXT_SLEEP_ON;

在user_config.h和项目文件中是ble_sleepmode项目来自SDK。

超时进入睡眠(如pd_sys已关闭),如文档所述,我们可以使用多个选项唤醒,因此我更喜欢BLE Timer

我在user_app_callbacks中配置了一个BLE计时器

static const struct app_callbacks user_app_callbacks = {.app_on_set_dev_config_complete = user_on_set_dev_config_complete,};void user_on_set_dev_config_complete(){app_easy_wakeup_set(app_wakeup_cb);app_awake_timer_used = app_easy_timer(app_wake_up_timer,app_ble_wkp_cb);// 5秒唤醒default_app_on_set_dev_config_complete();}

设备睡觉,但没有从睡梦中醒来。如何使用RTC /定时器1 / BLE定时器唤醒。为我分享一个小片段。

设备输入睡眠时是否已取消用户应用程序定时器?

谢谢提前

Br,

巴拉吉

PM_DIALOG.
离线
最后一次露面:9小时5分钟前
职员
加入:2018-02-08 11:03
嗨,巴拉

嗨,巴拉

我阅读了整个对话并就此声明:

>>我需要实现相同的adc操作每100毫秒,当BLE没有连接。我的广告时间间隔是687.5ms,广告超时时间是3分钟。

当设备配置为延长睡眠模式时,它将在间隔(广告或连接间隔)之间休眠。在睡眠模式下,所有外围域都关闭电源,以便系统消耗更低的功率。因此,如果系统处于延长睡眠模式,这意味着不可能使用包括ADC在内的任何外围模块。

作为MHV_Dialog所提到的,要定期唤醒它,应使用app_easy_timer()。此API正在使用BLE定时器,因此在扩展睡眠模式下有效。您能否请检查App_easy_Timer()中注册的回调是否已进行Triggreed?

>>>设备睡觉,但没有从睡梦中醒来。如何使用RTC /定时器1 / BLE定时器唤醒。

哪个是睡眠模式?睡着睡了吗?

谢谢,PM_DIALOG.