嗨,对话框中,
我想让DA14580在没有任何睡眠模式的情况下工作,并在I2C事件后进入深度睡眠模式。
我做了下面的更改列表,但是看起来DA并没有真正进入深度睡眠模式。
1.我在da15480_config.h和unefine中定义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事件(任何其他事件都很好后,您可以帮助我在如何进入深度睡眠模式吗?在此之前不使用睡眠模式,我只想强制将其设置为深度睡眠模式)。
谢谢!
嗨的产品:
首先请注意以下几点:
当您从深度睡眠的硬件中退出时,使用专用的硬件块将应用程序代码从OTP复制到SysRam,然后它将控制传递给M0处理器,使其在进入深度睡眠之前从停止的位置运行。因此,只有当应用程序软件处于OTP时,才会从深度睡眠中干净地退出。
如果您使用的是闪存,那么上面的步骤也会发生,导致OTP中的代码(如果您从未刻录过它,那么很可能都是0)被复制到sysRAM中。M0将尝试执行它,导致看门狗复位。BootRom将从闪存中获取代码并从头开始执行。这个过程大约需要2.5到3秒。
对于你上面描述的场景,我建议如下:
- 在da15480_config中定义cfg_deep_sleep.h,
-你可以在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)必须有以下代码:
if(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_set_extended睡眠替换对app_deep_sleep的调用。
如果你从外部MCU加载代码到DA14580,你有两个选择:
只使用长时间睡眠:你的能量消耗将为1。x uA。但您不必在每次醒来时都重新加载代码
使用深度睡眠:你将获得一些额外的电力节省。但是你必须每次都将固件加载到系统ram上
谢谢,
TR_DIALOG
嗨tr_dialog,
非常感谢您的快速回复。我添加app_disable_sleep ();在评论之后,应用程序当前的消耗从800uA下降到大约200uA。但是我仍然想知道200uA是从哪里来的。我尝试将DEVELOPMENT_DEBUG定义为0和1。另外,我尝试不定义DEVELOPMENT_DEBUG。但应用程序仍然消耗200 uA。你对此有什么想法吗?
基本上,在我们的应用程序中,我们不关心唤醒人员,因为每次系统启动时,我们都会通过SPI总线将FW重新装入系统ram。
谢谢!
嗨tr_dialog,
问题解决了。连接到一些DA引脚的组件会消耗额外的电流。在进入深度睡眠模式之前,我需要将PIN配置到特定模式。
非常感谢你的帮助。
有调试好的睡眠睡眠子工程,可以给我一张,谢谢!476369963 @qq.com
如果我想用ke_timer唤醒它,我怎么修改它。
谢谢你!
嗨Randyyu,
是的,你可以,只要在下降之前设置一个内核计时器永久地睡眠。例如,如果您想要发布永久休眠,然后再次开始发布,您可以通过调用advertise_stop()来停止发布,并在广告停止回调中设置内核计时器。在内核计时器的回调中,您可以调用advertise_start()来再次开始发布。
由于MT_dialog
哪个函数是内核计时器的回调函数?
嗨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