深度睡眠模式。

9个员额/ 0个新员额
最后一篇文章
zwang308
离线
最后一次见到:4年8个月前
主人
加入:2014-07-02 14:15
深度睡眠模式。

嗨,对话,

我想让DA14580在没有任何睡眠模式的情况下工作,并在I2C事件后进入深度睡眠模式。

我做了下面的更改列表,但是看起来DA并没有真正进入深度睡眠模式。

1.我在da15480_config.h中定义CFG_DEEP_SLEEP并取消定义

2.我对代码进行注释

#如果(外部睡眠已启用)
app_set_extended_sleep ();
#elif(已启用深度睡眠)
应用程序设置深度睡眠();
其他#
app_disable_sleep ();
#恩迪夫

在main_func中,在获取I2C包之前禁用睡眠模式。

3.我在得到I2C软件包时添加了以下代码:

app_stop_adv ();
应用程序设置深度睡眠();

我看到DA停止了广告,但我没有看到功耗下降。看起来处理器没有停止,它仍然消耗我大约800uA。

你能帮我如何在I2C事件之后将DA设置为深度睡眠模式(任何其他事件都可以,我只是想强制将其设置为深度睡眠模式),而在此之前不使用睡眠模式。

谢谢!

tru对话框
离线
最后一次见到:2个月2周以前
工作人员
加入:2014-06-30 23:52
你好,泽宇:

你好,泽宇:

首先,请注意以下几点:

当您脱离深度睡眠时,硬件使用专用硬件块将应用程序代码从OTP复制到SysRam,然后将控制传递给M0处理器,以便在进入深度睡眠之前从停止的位置运行。因此,只有当应用软件处于OTP中时,才能从深度睡眠中完全退出。

如果您使用的是闪存,则会发生上述相同的步骤,从而导致OTP中的任何代码(如果您从未烧掉它,则很可能为全零)被复制到系统内存中。M0将尝试执行它,导致看门狗引起的重置。BootRom将从闪存中获取代码并从头开始执行。这个过程大约需要2.5到3秒。

对于上面描述的场景,我建议如下:

-在da15480_config.h中定义CFG_DEEP_SLEEP,

-您可以在arch_main.c中注释掉该部分,但在底部添加一行,如下所示。

/*

#如果(外部睡眠已启用)
app_set_extended_sleep ();
#elif(已启用深度睡眠)
应用程序设置深度睡眠();
其他#
app_disable_sleep ();
#恩迪夫

*/

app_disable_sleep ();

现在,您可以在I2C事务结束时获得以下代码:

app_stop_adv ();
应用程序设置深度睡眠();

通过上述更改,代码将进入深度睡眠,但每10秒醒来一次以处理BLE。

如果你不希望发生这种情况,那么你需要有以下代码:

app_stop_adv ();
应用程序设置深度睡眠()

app_ble_ext_wakeup_on();
应用程序按钮启用();

现在,只有当外部中断发生时,系统才会唤醒。

您的中断处理程序(应用程序按钮按下按钮cb)必须具有以下代码:

如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN))
periph_init();//退出深度睡眠或延长睡眠后重新初始化外围设备。

如果(应用程序可扩展性外部唤醒获取())
{
/ /唤醒祝福
app_disable_sleep ();
SetBits32(GP_控制_注册,BLE_唤醒_需求,1);
app_ble_ext_wakeup_off ();//如果在进入深度睡眠之前已经使用了app_ble_ext_wakeup_on(),则使用此方法
}

应用程序按钮启用();

如果你的代码现在从闪存中运行,将app_deep_sleep调用替换为app_set_extended sleep。

如果要将代码从外部MCU加载到DA14580,则有两种选择:

仅使用延长睡眠:您的功耗将达到1.xUA。但您不必在每次醒来时重新加载代码

使用深度睡眠:您将获得一些额外的节能效果。但每次都必须将固件加载到系统RAM上

谢谢,

tru对话框

zwang308
离线
最后一次见到:4年8个月前
主人
加入:2014-07-02 14:15
嗨TR_Dialog,

嗨TR_Dialog,

非常感谢您的迅速回复。我添加了app_disable_sleep();在评论和应用程序之后,电流消耗从800uA降至约200uA。然而,我仍然想知道200uA是从哪里来的。我试图定义开发调试0和1。此外,我还试图取消定义开发调试。但该应用程序仍消耗200 uA。你知道吗?

基本上,在我们的应用程序中,我们不关心唤醒人员,因为每次系统通电时,我们都会通过SPI总线将FW重新加载到系统ram中。

谢谢!

zwang308
离线
最后一次见到:4年8个月前
主人
加入:2014-07-02 14:15
嗨Tr_Dialog,

嗨Tr_Dialog,

问题解决了。连接到某些DA引脚的组件会消耗额外的电流。在进入深度睡眠模式之前,我需要将PIN配置为特定模式。

非常感谢你的帮助。

伏地水
离线
最后一次见到:4年1个月前
加入:2016-04-12 13:27
有调试好的睡眠例子工程,可以给我一份吗,谢谢!

有调试好的睡眠例子工程,可以给我一份吗,谢谢!476369963@qq.com

兰迪尤
离线
最后一次见到:3年2个月前
加入:2015-01-28 08:49
如果我想把它叫醒的话

如果我想用计时器叫醒它,我怎么能修改它呢。
非常感谢。

MT_对话框
离线
最后一次见到:6个月2周前
工作人员
加入:2015-06-08 11:34
嗨RandyYu,

嗨RandyYu,

是的,你可以,只是在掉下去之前设置一个内核计时器永久地睡觉例如,如果您想永久性地播发秋季睡眠,然后再次开始播发,您可以通过调用advertise_stop()停止播发,并在advertising stop回调中设置内核计时器。在内核计时器的回调中,您可以调用adversed_start()以再次启动adversed。

谢谢你的对话

兰迪尤
离线
最后一次见到:3年2个月前
加入:2015-01-28 08:49
这个函数是什么

哪个函数是内核计时器的回调函数?

MT_对话框
离线
最后一次见到:6个月2周前
工作人员
加入:2015-06-08 11:34
嗨RandyYu,

嗨RandyYu,

每个计时器的回调声明是一个自定义函数,您可以在启动计时器时将其作为输入插入。对于easy_timer api(在SDK 5上),一个例子是app_easy_timer(您需要的时间,在时间流逝时调用的回调)。对于SDK,您必须在app_task_handlers.h文件中声明消息和回调,就像位于该文件中的所有回调一样,为了启动计时器,您需要调用app_timer_set()函数。

谢谢你的对话