深度睡眠模式。

9 posts / 0 new
最后一篇文章
zwang308
离线
最后一次见到:4 years 5 months ago
硕士
已加入:2014-07-02 14:15
深度睡眠模式。

嗨,对话,

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

我做了下面的改变列表,但似乎DA并没有真正进入深度睡眠模式。

1. I define CFG_DEEP_SLEEP in da15480_config.h and undefine

2I注释代码

#如果(外部睡眠启用)
app_set_extended_sleep();
#elif(启用深度睡眠)
app_set_deep_sleep();
#else
app_disable_sleep();
#结束

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

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

app_stop_adv();
app_set_deep_sleep();

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

Could you help me with how to set DA into Deep Sleep mode after an I2C event(any other event is fine, I just want to force set it into deep sleep mode) while do not use sleep mode before that.

谢谢!

tru对话框
离线
最后一次见到:22小时25秒前
工作人员
已加入:2014-06-30 23:52
你好,泽宇:

你好,泽宇:

首先请注意以下事项:

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

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

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

- define CFG_DEEP_SLEEP in da15480_config.h,

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

/*

#如果(外部睡眠启用)
app_set_extended_sleep();
#elif(启用深度睡眠)
app_set_deep_sleep();
#else
app_disable_sleep();
#结束

*/

app_disable_sleep();

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

app_stop_adv();
app_set_deep_sleep();

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

If you donot want that to happen, then you need to have the following code:

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

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

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

您的中断处理程序(app\u button\u press\u cb)必须具有以下代码:

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

如果(app\u ble\u ext\u wakeup\u get())
{
//Wakeup BLE here
app_disable_sleep();
SetBits32(GP\ U CONTROL\ U REG,BLE\ U WAKEUP\ U REQ,1);
app_ble_ext_wakeup_off(); // use this if have used app_ble_ext_wakeup_on() before going to deep sleep
}

应用程序按钮启用();

如果您的代码运行从闪存,代表lace the call to app_deep_sleep with app_set_extended sleep.

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

只使用延长睡眠:你的功耗将达到1.xua,但你不必每次醒来都重新加载代码

使用深度睡眠:你会得到一些额外的节能。但是每次你都要把固件加载到系统内存中

Thanks,

tru对话框

zwang308
离线
最后一次见到:4 years 5 months ago
硕士
已加入:2014-07-02 14:15
Hi TR_Dialog,

Hi TR_Dialog,

非常感谢你的迅速回复。我添加app_disable_sleep();经过评论和应用,电流消耗从800uA下降到200uA左右。但是我仍然想知道200uA是从哪里来的。我尝试定义开发和调试0和1。此外,我还试图取消开发和调试的定义。但应用程序仍消耗200 uA。你知道吗?

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

谢谢!

zwang308
离线
最后一次见到:4 years 5 months ago
硕士
已加入:2014-07-02 14:15
Hi Tr_Dialog,

Hi Tr_Dialog,

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

非常感谢你的帮助。

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

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

兰迪尤
离线
最后一次见到:2 years 10 months ago
已加入:2015-01-28 08:49
如果我想把它叫醒的话

如果我想用定时器叫醒它,我怎么能修改它。
谢谢您

MT\u对话框
离线
最后一次见到:2 months 2 weeks ago
工作人员
已加入:2015-06-08 11:34
Hi RandyYu,

Hi RandyYu,

是的,你可以,只是设置一个内核定时器前下降永久地睡觉。例如,如果您想永久地进入睡眠状态,然后再次开始播发,您可以通过调用advertive_stop()停止播发,并在advertising stop回调中设置内核计时器。在内核计时器的回调中,您可以调用advertive\ u start()以再次启动advertive。

谢谢你的对话

兰迪尤
离线
最后一次见到:2 years 10 months ago
已加入:2015-01-28 08:49
哪个函数是

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

MT\u对话框
离线
最后一次见到:2 months 2 weeks ago
工作人员
已加入:2015-06-08 11:34
Hi RandyYu,

Hi RandyYu,

每个计时器回调的声明是一个自定义函数,在启动计时器时插入该函数作为输入。在easy\u timer api(在sdk5上)的例子是app\u easy\u timer(time\u you need,callback\u that\u should\u called\u when\u time elasse)。对于SDK,您必须在app\u task\u handlers.h文件中声明消息和回调,就像位于该文件中的所有回调一样,为了启动计时器,您需要调用app\u timer\u set()函数。

谢谢你的对话