使用可编程定时器进行睡眠-唤醒

了解更多常见问题教程

9个帖子/ 0新
最后一篇文章
巴拉吉
离线
最后一次见到:3周3天前
已加入:2019-12-06 06:48
使用可编程定时器进行睡眠-唤醒

你好,

我使用的USB开发工具包,以尽量减少功耗,我们正试图纳入其中一个睡眠模式从下面的链接

http://lpccs docs.dialog semiconductor.com/DA14531\u Sleep\u Mode+/introduct。。。

我的要求是,

1.在每100毫秒循环中,它应该睡50毫秒。(剩下50毫秒,它将DO读取和更新到BLE)

2通过可编程定时器它应该醒了。

你能给我举一些以上限制的例子吗。

提前谢谢

巴拉吉。

MHv\U对话框
离线
最后一次见到:6天7小时前
工作人员
已加入:2013-12-06 15:10
嗨巴拉吉,

嗨巴拉吉,

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

就您的常规ADC活动而言,您可以选择使用app\u easy\u计时器触发读数,也可以将ADC读数绑定到每个BLE事件的尾部。您可以在此处找到有关如何使用app\u easy\u计时器的说明:http://lpccs-docs.dialog-semiciondiond.com/tutorial_sdk6/timer.html.

将ADC读数绑定到每个BLE事件的末尾可以稍微提高能效,因为它限制了唤醒的数量。您可以在主头文件中定义宏函数,例如user\u myproj.h:

#define DLG\u EVENT\u HANDLER\u EXIT()(ble\u EVENT\u ended())

在此文件中,还向函数添加原型:

无效事件结束(void);

最后,在usermyproj.c中,实现这个函数中的ADC read。

我希望这有帮助。

/MHv公司

巴拉吉
离线
最后一次见到:3周3天前
已加入:2019-12-06 06:48
嗨,MHv,

嗨,MHv,

感谢您的快速回复,我会努力研究它,只是一个后续的查询,我需要实现相同的adc操作每100毫秒时,BLE是未连接。我的广告间隔是687.5毫秒,广告超时是3秒几分钟后只有当用户按下按钮时,广告周期才会重新开始,直到这时收音机应该保持关闭。“有没有可能去”延长睡眠时间“如果BLE如您所述连接并且”沉睡“当BLE不是有联系吗相同的替代建议。

提前谢谢!

比尔,

巴拉吉。

MHv\U对话框
离线
最后一次见到:6天7小时前
工作人员
已加入:2013-12-06 15:10
嗨巴拉吉,

嗨巴拉吉,

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

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

  1. 蓝牙收音机需要启动
  2. 默认睡眠模式设置为ARCH\ U sleep\ U OFF
  3. 应用程序正在执行某些操作(例如读取ADC)
  4. 下一个预定的事件发生得太快,以至于睡觉会浪费精力

/MHv公司

巴拉吉
离线
最后一次见到:3周3天前
已加入:2019-12-06 06:48
嗨,MHv,

嗨,MHv,

我拍了BLE_APP_SLEEPMODE项目,并配置了APP_EASY TIMER用户\睡眠模式.c

void user\u app\u adv\u undirect\u complete(uint8\t status){app\u awake\u timer\u used=EASY\u timer\u INVALID\u timer;//禁用BLE和计时器事件的唤醒。只有外部(GPIO)唤醒事件才能唤醒处理器。if(status==GAP_ERR_cancelled){#ifdef GPIO_WAKE arch_ble_ext_WAKE up_on();//配置唤醒按钮app_button_enable();#endif#ifdef ble_TIMER_WAKE arch_ext_WAKE up_off();ble_TIMER_WAKE();#endif}}

在这个ble\u timer\u wake()中

静态void ble\u timer\u wake(void){app\u easy\u wakeup\u set(app\u wakeup\u 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 timer回调函数static void app_ble_wkp_cb(void){if!已定义(u DA14531_u31)if(GetBits16(SYS_STAT_REG,PER_IS_DOWN))#endif{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();GPIO_SetInactive(GPIO_LED_PORT,GPIO_LED_PIN);//唤醒后关闭LED}}

我使ble adv超时5秒,睡眠时间是10秒,醒来后。一切如期进行。

现在我有一个用户应用程序任务,它在下面的user\u app\u回调中配置

.app \u on \u set \u dev \u config \u complete=用户\u on \u set \u dev \u config \u 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秒定时器默认值_app_on_set_dev_config_complete();}//在回调中,我每1秒切换一个gpio静态void user_app_timer_cb(){if(usr_adv_flag==0){gpio_SetActive(gpio_LED_PORT,gpio_LED_PIN);//此PIN与LED PIN usr_adv_flag=1不同;//arch_printf(“LED On\n”);}否则{gpio_SetInactive(gpio_LED_PORT,gpio_LED_PIN);usr_adv_flag=0;//arch_printf(“LED Off\n”);}}

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

我要知道adv停止后,睡眠是如何疼痛的,从下面的片段中推荐。

static void adv\u data\u update\u timer\u cb(){//如果mnd\u data\u index设置了MSB,则制造商数据存储在扫描响应uint8\u t*mnf\u data\u storage=(mnf\u data\u 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));//Update advisting data on the fly app_easy_gap_Update_adv_data(存储的_adv_data,存储的_adv_data,存储的_scan_rsp_data,存储的_scan_rsp_data_len);//停止广告播放操作-按下按钮将唤醒系统app_easy_gap_advised_Stop();}

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

2如果禁用BLE\u APP\u PRESENT,应用程序将进入睡眠状态?

提前谢谢,

比尔,

巴拉吉。

MHv\U对话框
离线
最后一次见到:6天7小时前
工作人员
已加入:2013-12-06 15:10
你好,贝拉吉,

你好,贝拉吉,

蓝牙活动的优先级高于任何用户应用程序。这意味着有时候你的应用程序的简易计时器会在稍晚的时候触发。实现近实时执行的唯一方法是停止所有Bluetooth LE活动(没有广告,没有连接)。

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

undefining ble_app_present仅在gtl模式(您不是)中使用的设备时相关,因此请留下。

/MHv公司

巴拉吉
离线
最后一次见到:3周3天前
已加入:2019-12-06 06:48
嗨,MHv,

嗨,MHv,

谢谢你的详细回复。正如你所说,当没有广告或应用程序未连接。用户应用程序执行为是的,但是我们的产品不符合要求。我的邮件id:巴拉吉。邮箱:s@pmsind.com. 我可以分享我们的需求,经过4个月的发展,我们在这里卡住了。我们需要在SDK的轻微修改支持。如果这个问题得不到解决,我们将被迫更换BLE模块。到目前为止,您的产品非常棒,请记住,我们的smartcane产品(我们选择使用da14531的ble设计)迄今已售出10万台。请考虑我的请求并尽早回复。

提前谢谢

比尔

巴拉吉

巴拉吉
离线
最后一次见到:3周3天前
已加入:2019-12-06 06:48
嗨,MHv,

嗨,MHv,

当我把睡眠模式设为

静态const sleep\u state\u t app\u default\u sleep\u mode=ARCH\u EXT\u sleep\u ON;

在user\ u config.h中,项目文件为ble\ U睡眠模式项目来自SDK。

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

我在user_app_callbacks内配置了一个ble timer

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 u easy_WAKE UP_set(app_WAKE UP_cb);app_WAKE_timer_used=app_easy_timer(app_WAKE UP_timer,app_ble_wkp_cb);//唤醒5秒后默认_app u on_set_dev_config_complete()}

设备进入睡眠状态,但没有从睡眠中醒来。如何使用RTC/Timer 1/BLE Timer唤醒。和我分享一个同样的小片段。

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

提前谢谢

比尔,

巴拉吉

PM\U对话框
离线
最后一次见到:2天15小时前
工作人员
已加入:2018-02-08 11:03
嗨巴拉吉,

嗨巴拉吉,

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

>>当BLE未连接时,我需要为每100毫秒达到相同的ADC操作。我的广告间隔是687.5ms,广告超时是3分钟。

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

正如MHv\u Dialog提到的,为了定期唤醒它,应该使用app\u easy\u timer()。这个API使用的是BLE计时器,因此它在扩展睡眠模式下有效。你能检查一下在app\u easy\u timer()中注册的回调是否被触发了吗?

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

哪种睡眠模式?是延长睡眠吗?

谢谢,下午好