使用BLE定时器唤醒睡眠

⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.wsdof.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
9个员额/ 0个新员额
最后发表
巴拉吉
离线
最后看到:3个月2周前
加入:2019-12-06 06:48
使用BLE定时器唤醒睡眠

你好,

我正在使用USB开发套件,以最大限度地减少我们试图从以下链接中包含一个睡眠模式的功耗

http://lpccs-docs.dialog-semicondiondumon.com/da14531_sleep_mode+/introduct ...

我的需要,

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

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

你能给我举个例子吗?

提前致谢

巴拉。

MHv_Dialog
离线
最后看到:1个月2周前
工作人员
加入:15 2013-12-06
嗨,巴拉

嗨,巴拉

SDK6在您选择三种不同模式之一后管理睡眠模式。在你的情况下,最佳模式是延长睡眠时间。当设置此模式时(根据睡眠模式教程),设备将自动唤醒来执行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:

#define dlg_event_handler_exit()(ble_event_eded())

在此文件中,还向功能添加了原型:

void ble_event_ended(无效);

最后,在user_myproject .c中,在这个函数中实现ADC读取。

我希望这对你有所帮助。

/ mhv.

巴拉吉
离线
最后看到:3个月2周前
加入:2019-12-06 06:48
嗨MHv,

嗨MHv,

谢谢你的快速回复,我会试着研究它,只是一个后续查询,我需要实现相同的adc操作每100毫秒时,BLE是没有连接.我的广告时间间隔是687.5ms,广告超时时间是3分钟。广告循环只有在用户按下按钮后才会重新开始,在此之前收音机应该保持关闭状态。有没有可能延长睡眠“如果像上面提到的一样,则为BLE和”深度睡眠当BLE未连接时。还有其他的建议吗。

提前致谢!

布罗尔,

巴拉吉。

MHv_Dialog
离线
最后看到:1个月2周前
工作人员
加入:15 2013-12-06
嗨,巴拉

嗨,巴拉

这使您与App_easy_Timer留下,这是最容易实现的。扩展睡眠是需要每100ms唤醒每100ms的设备的最低电源解决方案(在您的情况下执行ADC读数)。从深睡眠中醒来需要每个唤醒需要额外的能量,以便从OTP复制到RAM FOIR执行。如果您的应用程序代码在Flash中,那么深度睡眠只会对睡眠持续时间或几周的睡眠有用。

记住,睡眠是由SDK管理的。设备将进入休眠状态,除非:

  1. 蓝牙无线电必须处于激活状态
  2. 默认休眠模式设置为ARCH_SLEEP_OFF
  3. 您的应用程序处于活动状态(例如读取ADC)
  4. 下一个预定的事件发生得太快了,以至于你在睡觉的时候会浪费精力

/ mhv.

巴拉吉
离线
最后看到:3个月2周前
加入:2019-12-06 06:48
嗨MHv,

嗨MHv,

我使用ble_app_sleepmode项目并配置了一个app_easy计时器user_sleepmode.c

void user_app_add_undirect_complete(uint8_t status){app_ake_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();#万一 } }

在这个ble_timer_wake ()

静态void ble_timer_wake(void){app_easy_wakeup_set(app_wakeup_cb);if(!app_awake_timer_used){app_awake_timer_used = app_easy_timer(app_wake_up_timer,app_ble_wkp_cb);gpio_setactive(gpio_led_port,gpio_led_pin); //检查睡眠是否正常工作我打开LED} //ble计时器回调函数静态void app_ble_wkp_cb(void){#if!定义(__da14531__)(getBits16(sys_stat_reg,per_is_down))#endif {periph_init();}如果(!ahch_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);// Wakeup}}后关闭LED

我设定的超时时间是5秒,睡眠时间是10秒,并且在醒来后。果然奏效了。

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

.app_on_set_dev_config_complete = user_on_set_dev_config_complete.

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

void user_on_set_dev_config_complete(void);void user_on_set_dev_config_complete(){//配置用户ble timer user_app_timer_used = app_easy_timer(user_app_timer,user_app_timer_cb);// 1秒计时器default_app_on_set_dev_config_complete();在回调中,我可以为每1秒静态void user_app_timer_cb(){if(usr_adv_flag == 0){gpio_setactive(gpio_lex_port,gpio_led_pin)进行切换gpio;//此引脚与LED引脚USR_ADV_FLAG = 1;// ARCH_PRINTF(“LED \ n”);} else {gpio_setinactive(gpio_led_port,gpio_led_pin);usr_adv_flag = 0;// ARCH_PRINTF(“LED OFF \ n”);}}

我的担忧是如果应用程序是广告的,则执行上述任务的延迟,但是当BLE exeded睡眠时,它会按预期扫荡。可能的错误是什么?

我需要知道一旦adv被停止了睡眠是多么睡眠,参见下面的代码片段。

静态void adv_data_update_timer_cb(){//如果mnd_data_index具有MSB集,制造商数据存储在扫描响应中,uint8_t * mnf_data_storage =(mnf_data_index&0x80)?storage_scan_rsp_data:storage_add_data;//更新制造商数据Mnf_data_update();//更新广告数据(制造商数据)memcpy(Mnf_data_storage +(Mnf_data_index&0x7f)的所选字段(mnf_data_index&0x7f),&mnf_data,sizeof(struct mnf_specific_data_ad_structure);//更新Fly app_easy_gap_update_add_data(stordal_addata,storage_add_data_len,storage_scan_rsp_data,storage_scan_rsp_data_len)上的广告数据;//停止广告空气运营 - 按钮按将唤醒系统app_easy_gap_advertise_stop();}

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

2.where BLE_APP_PRESENT是禁用的应用程序进入睡眠?

提前致谢,

布罗尔,

巴拉。

MHv_Dialog
离线
最后看到:1个月2周前
工作人员
加入:15 2013-12-06
嗨Belaji,

嗨Belaji,

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

睡眠实现是SDK中最复杂的部分,因此完全从用户中抽象出来。解释其中错综复杂的细节超出了本论坛的范围。正如之前的回复中所提到的,关于睡眠,你所需要知道的是,你可以设置默认的操作模式,设备会在它可以休眠的时候休眠。请查看我之前提到的“入门SDK6”教程。在这个教程中,你可以找到你需要知道的关于睡眠模式的一切。

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

/ mhv.

巴拉吉
离线
最后看到:3个月2周前
加入:2019-12-06 06:48
嗨MHv,

嗨MHv,

感谢您的详细回复。正如你所说的那样,当没有连接的广告或应用程序时。用户应用程序按预期执行。但是我们的产品要求不会满足。我的邮件ID:balaji.s@pmsind.com.我可以分享我们的要求,经过4个月的发展,我们在这里陷入困境。我们需要支持SDK的略微修改。如果未解决此问题,我们被迫更改我们的BLE模块。到目前为止,您的产品很棒,请记住我们拥有我们的SmartCane产品(我们选择使用DA14531选择BLE设计)到目前为止销售了100K单位。请考虑我的要求并尽早恢复。

提前致谢

Br

巴拉吉

巴拉吉
离线
最后看到:3个月2周前
加入:2019-12-06 06:48
嗨MHv,

嗨MHv,

当我设置睡眠模式为

static const sleep_state_t app_default_sleep_mode = arch_ext_sleep_on;

在user_config.h和项目文件是BLE_SLEEPMODE项目从SDK。

超时进入睡眠(如PD_SYS是关闭的),正如文档中提到的,我们可以使用多个选项来唤醒,所以我更喜欢BLE定时器

我在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 SEC唤醒default_app_on_set_dev_config_complete();}

设备进入睡眠状态但没有从睡眠中醒来。如何唤醒使用RTC /定时器1 / BLE定时器。与我分享一个小片段。

当设备进入休眠状态时,用户应用程序的计时器是否被取消?

提前致谢

布罗尔,

巴拉吉

PM_Dialog
离线
最后看到:2天9小时前
工作人员
加入:2018-02-08 11:03
嗨,巴拉

嗨,巴拉

我读了整个对话,关于这个声明:

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

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

正如MHv_Dialog所提到的,为了周期性地唤醒它,应该使用app_easy_timer()。这个API使用BLE定时器,所以它在扩展睡眠模式下是有效的。你能检查在app_easy_timer()中注册的回调是否被触发吗?

>>>设备进入睡眠状态,但未从睡眠中醒来。如何唤醒使用RTC /定时器1 / BLE定时器。

哪个是睡眠模式?是延长睡眠时间?

谢谢,PM_Dialog