嗨,对话,
我想让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设置为深度睡眠模式(任何其他事件都可以,我只是想强制将其设置为深度睡眠模式),而在此之前不使用睡眠模式。
谢谢!
你好,泽宇:
首先,请注意以下几点:
当您脱离深度睡眠时,硬件使用专用硬件块将应用程序代码从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对话框
嗨TR_Dialog,
非常感谢您的迅速回复。我添加了app_disable_sleep();在评论和应用程序之后,电流消耗从800uA降至约200uA。然而,我仍然想知道200uA是从哪里来的。我试图定义开发调试0和1。此外,我还试图取消定义开发调试。但该应用程序仍消耗200 uA。你知道吗?
基本上,在我们的应用程序中,我们不关心唤醒人员,因为每次系统通电时,我们都会通过SPI总线将FW重新加载到系统ram中。
谢谢!
嗨Tr_Dialog,
问题解决了。连接到某些DA引脚的组件会消耗额外的电流。在进入深度睡眠模式之前,我需要将PIN配置为特定模式。
非常感谢你的帮助。
有调试好的睡眠例子工程,可以给我一份吗,谢谢!476369963@qq.com
如果我想用计时器叫醒它,我怎么能修改它呢。
非常感谢。
嗨RandyYu,
是的,你可以,只是在掉下去之前设置一个内核计时器永久地睡觉例如,如果您想永久性地播发秋季睡眠,然后再次开始播发,您可以通过调用advertise_stop()停止播发,并在advertising stop回调中设置内核计时器。在内核计时器的回调中,您可以调用adversed_start()以再次启动adversed。
谢谢你的对话
哪个函数是内核计时器的回调函数?
嗨RandyYu,
每个计时器的回调声明是一个自定义函数,您可以在启动计时器时将其作为输入插入。对于easy_timer api(在SDK 5上),一个例子是app_easy_timer(您需要的时间,在时间流逝时调用的回调)。对于SDK,您必须在app_task_handlers.h文件中声明消息和回调,就像位于该文件中的所有回调一样,为了启动计时器,您需要调用app_timer_set()函数。
谢谢你的对话