9个员额/ 0个新员额
最后发表
zwang308
离线
最后看到:4年5个月前
主
加入:2014-07-02福音14:15
深度睡眠模式。

嗨,对话框中,

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

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

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

2.我评论的代码

#如果(EXT_SLEEP_ENABLED)
app_set_extended_sleep ();
# elif (DEEP_SLEEP_ENABLED)
app_set_deep_sleep ();
其他#
app_disable_sleep ();
# endif

在我得到一个I2C包之前,在main_func中禁用睡眠模式。

3.当我得到I2C包时,我添加了以下代码:

app_stop_adv ();
app_set_deep_sleep ();

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

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

谢谢!

TR_Dialog
离线
最后看到:1天6小时前
工作人员
加入:2014-06-30 23:52
嗨的产品:

嗨的产品:

首先请注意以下几点:

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

如果您使用的是闪存,那么上面的步骤也会发生,导致OTP中的代码(如果您从未刻录过它,那么很可能都是0)被复制到sysRAM中。M0将尝试执行它,导致看门狗复位。BootRom将从闪存中获取代码并从头开始执行。这个过程大约需要2.5到3秒。

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

-在da15480_config.h中定义CFG_DEEP_SLEEP,

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

/*

#如果(EXT_SLEEP_ENABLED)
app_set_extended_sleep ();
# elif (DEEP_SLEEP_ENABLED)
app_set_deep_sleep ();
其他#
app_disable_sleep ();
# endif

*/

app_disable_sleep ();

现在您可以在I2C事务的末尾有以下代码:

app_stop_adv ();
app_set_deep_sleep ();

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

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

app_stop_adv ();
app_set_deep_sleep ()

app_ble_ext_wakeup_on ();
app_button_enable ();

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

你的中断处理程序(app_button_press_cb)必须有以下代码:

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

如果(app_ble_ext_wakeup_get ())

/ /唤醒祝福
app_disable_sleep ();
SetBits32 (GP_CONTROL_REG BLE_WAKEUP_REQ 1);
app_ble_ext_wakeup_off ();//如果在进入深度睡眠之前已经使用了app_ble_ext_wakeup_on(),则使用此方法


app_button_enable ();

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

如果你从外部MCU加载代码到DA14580,你有两个选择:

只使用长时间睡眠:你的能量消耗将为1。x uA。但您不必在每次醒来时都重新加载代码

使用深度睡眠:你将获得一些额外的电力节省。但是你必须每次都将固件加载到系统ram上

谢谢,

TR_DIALOG

zwang308
离线
最后看到:4年5个月前
主
加入:2014-07-02福音14:15
嗨TR_Dialog,

嗨TR_Dialog,

非常感谢您的快速回复。我添加app_disable_sleep ();在评论之后,应用程序当前的消耗从800uA下降到大约200uA。但是我仍然想知道200uA是从哪里来的。我尝试将DEVELOPMENT_DEBUG定义为0和1。另外,我尝试不定义DEVELOPMENT_DEBUG。但应用程序仍然消耗200 uA。你对此有什么想法吗?

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

谢谢!

zwang308
离线
最后看到:4年5个月前
主
加入:2014-07-02福音14:15
嗨Tr_Dialog,

嗨Tr_Dialog,

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

非常感谢你的帮助。

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

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

RandyYu
离线
最后看到:2年10个月前
加入:2015-01-28 08:49
如果我想唤醒它

如果我想用ke_timer唤醒它,我怎么修改它。
谢谢你!

MT_dialog
离线
最后看到:2个月2周以前
工作人员
加入:2015-06-08 34
嗨RandyYu,

嗨RandyYu,

是的,你可以,只要在下降之前设置一个内核计时器永久地睡眠。例如,如果您想要发布永久休眠,然后再次开始发布,您可以通过调用advertise_stop()来停止发布,并在广告停止回调中设置内核计时器。在内核计时器的回调中,您可以调用advertise_start()来再次开始发布。

由于MT_dialog

RandyYu
离线
最后看到:2年10个月前
加入:2015-01-28 08:49
哪个函数是

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

MT_dialog
离线
最后看到:2个月2周以前
工作人员
加入:2015-06-08 34
嗨RandyYu,

嗨RandyYu,

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

由于MT_dialog