嗨对话框,
我想在没有任何睡眠模式的情况下使DA14580工作,并在I2C事件后进入深度睡眠模式。
我在下面做了更改列表,但似乎da并不真正进入深度睡眠模式。
1.我在da15480_config.h中定义了CFG_DEEP_SLEEP并未定义
2.我评论代码
#if(ext_sleep_enabled)
app_set_extended_sleep ();
#elif(deep_sleep_enabled)
app_set_deep_sleep();
其他#
app_disable_sleep ();
#万一
在main_func中禁用睡眠模式,然后再获得I2C包。
3.当我获取I2C软件包时,我添加了此代码:
app_stop_adv ();
app_set_deep_sleep();
我看到了DA停止广告,但我没有看到功耗下降。看起来处理器没有停止,它仍然会消耗大约800A。
你能帮我如何在I2C事件之后将DA设置为深度睡眠模式(其他事件都可以,我只是想强制将其设置为深度睡眠模式),而在此之前不要使用睡眠模式。
非常感谢!
嗨Zeyu:
首先请注意以下内容:
当您退出深度睡眠硬件时,使用专用硬件块将应用程序代码从OTP复制到Sysram,然后将控件传递给M0处理器以在深入睡眠前从其离开的位置运行。因此,仅当应用软件处于OTP时,才会发生从深度睡眠的干净退出。
如果您使用的是闪存,则会发生同样的上述步骤,从而导致OTP中的代码(如果您从未刻录的所有零)复制到Sysram中。M0将尝试执行它导致手表狗导致复位。Bootrom将从闪存中获取代码,并从头开始执行它。这个过程大约需要2.5到3秒。
对于您上面描述的场景,我建议如下:
-在da15480_config.h中定义CFG_DEEP_SLEEP,
- 您可以在Arch_Main.c中发表介绍该部分,但在底部添加一行,如下所示。
/*
#if(ext_sleep_enabled)
app_set_extended_sleep ();
#elif(deep_sleep_enabled)
app_set_deep_sleep();
其他#
app_disable_sleep ();
#万一
* /
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();//退出深层或延长睡眠后重新启动外设。
if(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.但是每次唤醒时都不需要重新加载代码
使用深睡眠:您将节省一些添加节能。但您每次都必须将固件加载到Sysram上
谢谢,
tr_dialog.
嗨TR_Dialog,
非常感谢您的SWIFT回复。我添加app_disable_sleep();评论后和应用程序当前消耗从800A到大约200UA。然而,我仍然想知道200ua来自哪里。我试图定义开发_debug 0和1.此外,我还尝试了unefine development_debug。但该应用程序仍然消耗200 uA。你有什么想法吗?
基本上,在我们的应用程序中,我们不在乎唤醒人员,因为每次系统都能提升,我们将通过SPI总线将FW重新加入系统RAM。
非常感谢!
嗨Tr_Dialog,
问题已经解决了。连接到某个DA引脚的组件消耗额外的电流。在进行深度睡眠模式之前,我需要将PIN配置为某些模式。
非常感谢您的帮助。
有调试好的睡眠例子工程,可以给我一份吗,谢谢!476369963@qq.com.
如果我想用ke_timer唤醒它,我如何修改它。
谢谢你
嗨RandyYu,
是的,您可以,刚刚在下降之前设置内核计时器永久到睡觉 。例如,如果您想广告跌倒才能永久睡觉,然后再次启动广告,您可以通过调用advertise_stop()和广告停止回调设置内核定时器来停止广告。在内核计时器的回调中,您可以调用通告_start()以便再次启动通告。
谢谢mt_dialog.
哪个函数是内核计时器的回调?
嗨RandyYu,
每个计时器的回调声明是当您启动计时器时将其作为输入插入的自定义函数。在Easy_Timer API(在SDK 5)的情况下,示例将是app_easy_timer(time_you_need,callback_that_should_be_called_when_ime_elapse)。在SDK的情况下,您必须在app_task_handlers.h文件中声明消息和回调,如该文件中的所有回调,并且要启动您需要调用app_timer_set()函数的计时器。
谢谢mt_dialog.