使用BLE定时器唤醒睡眠

了解更多常见问题教程

9个岗位/ 0个新岗位
最后发表
巴拉吉
离线
最后看到:1个月前5天
加入: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周3天前
工作人员
加入: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_myprojr .h:

#定义DLG_EVENT_HANDLER_EXIT() (ble_event_ended())

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

空白ble_event_ended(无效);

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

我希望这能有所帮助。

/ MHv

巴拉吉
离线
最后看到:1个月前5天
加入:2019-12-06 06:48
嗨MHv,

嗨MHv,

谢谢你的快速回复,我会尽量调查一下,只是一个后续的查询,当BLE是时,我需要每100毫秒实现相同的adc操作没有连接我的广告间隔是687.5毫秒,广告超时是3分钟。只有用户按下按钮,广告周期才会重新开始,在此之前收音机应该保持关闭状态。是否有可能与"延长睡眠“如果BLE如你上面提到的那样连接并且”深度睡眠当BLE未连接时。还有其他建议吗?

提前谢谢!

Br,

巴拉。

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

嗨,巴拉

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

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

  1. 蓝牙无线电需要激活
  2. 默认睡眠模式设置为ARCH_SLEEP_OFF
  3. 您的应用程序处于活动状态,正在执行某些操作(例如读取ADC)
  4. 下一个预定的事件很快就会发生,以至于睡觉会浪费你的精力

/ MHv

巴拉吉
离线
最后看到:1个月前5天
加入: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_cancelled) {#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()中

静态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定时器回调函数静态无效app_ble_wkp_cb(void) {#if !defined (__DA14531__) if (GetBits16(SYS_STAT_REG, PER_IS_DOWN)) #endif{外置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 ();GPIO_SetInactive (GPIO_LED_PORT GPIO_LED_PIN);//唤醒后关闭

我让ble adv超时5秒,睡眠时间是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秒定时器default_app_on_set_dev_config_complete();} //在回调中,我每1秒切换一个gpio静态无效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周3天前
工作人员
加入:15 2013-12-06
嗨Belaji,

嗨Belaji,

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

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

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

/ MHv

巴拉吉
离线
最后看到:1个月前5天
加入:2019-12-06 06:48
嗨MHv,

嗨MHv,

谢谢你的详细回复。如你所说,没有广告或应用程序不连接。用户应用程序将按预期执行。但是我们的产品要求没有得到满足。我的邮箱:balaji.s@pmsind.com.我可以分享我们的需求,经过4个月的开发,我们被困在这里。我们需要支持轻微修改SDK。如果这个问题没有解决,我们将被迫更换BLE模块。到目前为止,你的产品很棒,请记住,我们的智能手杖产品(我们选择了使用da14531的ble设计)到目前为止已经销售了10万套。请考虑我的请求,并尽快回复。

提前谢谢你

Br

巴拉吉

巴拉吉
离线
最后看到:1个月前5天
加入:2019-12-06 06:48
嗨MHv,

嗨MHv,

当我设置睡眠模式为

app_default_sleep_mode = ARCH_EXT_SLEEP_ON

在user_config.h和项目文件中ble_sleepmode项目从SDK。

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

我在user_app_callbacks内部配置了一个BLE定时器

静态const结构app_callback user_app_callbacks = {.app_on_set_dev_config_complete = user_on_set_dev_config_complete,};无效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 / Timer 1 / BLE Timer唤醒。分享给我一个小片段。

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

提前谢谢你

Br,

巴拉吉

PM_Dialog
离线
最后看到:4小时38分钟前
工作人员
加入:2018-02-08 11:03
嗨,巴拉

嗨,巴拉

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

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

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

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

>>>设备进入睡眠,但没有从睡眠中醒来。如何使用RTC / Timer 1 / BLE Timer唤醒。

哪种是睡眠模式?是因为睡眠时间过长吗?

谢谢,PM_Dialog