嗨对话框,
1.我使用“app_easy_gap_undirected_advertise_with_timeout_start (uint16_t延迟,无效(* timeout_callback)(空白)”做广告,然后关闭它10秒(延迟是10 s)后,我添加一个“arch_set_sleep_mode (ARCH_DEEP_SLEEP_ON)”在“静态空app_easy_gap_advertise_stop_handler(空白)”DA14580进入深度睡眠,但它并不进入深度睡眠。DA14580是否需要关闭其他进程或函数才能进入深度睡眠?
以下是我固件的代码:
无效app_easy_gap_undirected_advertise_with_timeout_start(uint16_t delay, Void (*timeout_callback)(Void))
{
//停止当前运行的计时器
if(adv_timer_id!= easy_timer_invalid_timer)
app_easy_timer_cancel(avd_timer_id);
if(timeout_callback!= null)
adv_timeout_callback = timeout_callback;
avad_timer_id = app_easy_timer(delay,app_easy_gap_advertise_stop_handler);
app_easy_gap_undirected_advertise_start ();
}
静态孔隙app_easy_gap_advertise_stop_handler(空白)
{
app_easy_gap_advertise_with_timeout_stop ();
app_easy_gap_advertise_stop();
adv_timer_id = app_easy_timer(sleep_timeout,app_timeout_callback);
ARCH_SET_SLEEP_MODE(ARCH_DEEP_SLEEP_ON);
}
2.如果我将'app_easy_gap_undircted_advertise_start()'更改为'app_easy_gap_non_connectable_advertise_start()',则DA14580可以成功输入深度睡眠模式。是否不同的广告类型定义可以遵循的睡眠或空闲模式?
3.我发现这段代码使DA14580处于空闲模式。我如何知道哪些内核事件仍在运行(防止深度睡眠模式)?
rwip.c (Line323)
/ ************************************************************************
**************检查内核活动**************
************************************************************************ /
//检查某些内核处理是否正在进行中
如果(!KE_SLEEP_CHECK())
打破;
//可以启用处理器睡眠
proc_sleep = mode_idle;
dbg_swdiag(睡眠,algo,1);
4.如果我知道哪个事件仍在继续,我可以直接终止内核事件进入深度睡眠模式吗?
5.我可以强制深度睡眠模式,即使我不能识别或终止内核事件?
SDK5.0.3
谢谢
嗨RexDevelopment,
除了将App_default_sleep_mode更改为Arch_Deep_sleep_On和Off Course还是更改内存配置也没有其他进程或更改它所需的,以便设置FW以便深入睡眠。你怎么知道该设备无法深入睡眠,通过功耗检查它?你看到设备在广告上继续?另请注意,为了获得适当的功耗和测试深度睡眠模式,您必须使用#undefine CFG_Development_Debug并将图像中的图像烧毁,并与彩色应用程序标志一起烧毁OTP中的图像。亚博国际官网平台网址关于代码,app_easy_gap_undirected_advertise_with_timeout_start()将启动广告并设置计时器以完成广告过程,何时发生计时器,当时会发生App_easy_gap_advertise_stop_handler()以便停止广告并触发用户可能附加的回调。我没有得到你想在修改的app_easy_gap_advertise_stop_handler()中要做的事情,但是你再次在甚至停止前一个之前再次调用广告功能,并且您设置了计时器以便在指定时间唤醒。您可以尝试的是在app_easy_gap_undirected_advertise_with_timeOut_start()中的一个unull函数作为回调,通过一个将设置一个计时器的函数,该函数将计算下一个唤醒并将发起广告,如下所示:
空白set_the_timer(空白)
{
default_advertise_operation app_easy_timer (1000);
}
app_easy_gap_undirected_advertise_with_timeout_start(user_default_hnd_conf.advertise_period,set_the_timer);
没有不允许你睡觉的BLE事件,设备会醒来和睡眠取决于它可用的BLE事件,例如睡眠唤醒和广告返回睡眠,没有事件可以让设备长时间保持清醒,除非有多个事件需要设备服务,睡眠是不可能的。只有在应用程序端才能取消休眠模式。该设备将必须提供可用的事件,然后进入睡眠。我试图复制您的代码,在您在app_easy_gap_advertise_stop_handler()中设置的app_easy_timer()中,设备通过计时器断言停止。
同样关于你的实现,你也可以看一下ble_app_sleepmode,用一个内核定时器改变唤醒按钮来实现它。
谢谢mt_dialog.
嗨MT_dialog,
谢谢你的回复。我使用VAM(电流计)来测量当前的消耗。当DA14580进入深度睡眠模式时,我们从VAM读取~10uA。如果DA14580没有进入睡眠,我们从VAM读取~550uA。我们也用手机检查DA14580是否在做广告。
在我们的固件中,我们的循环需要从 - AredFortise - >深睡眠 - >信标 - >深睡眠。
对于我们的应用程序,我们必须让DA14580执行一个循环'app_easy_gap_undirected_advertise_start()',睡眠模式和'app_easy_gap_non_connectable_advertise_start()',所以我不能基于参考设计架构的固件。
1.)我可以使da14580进入深度睡眠模式吗?
2.)只要确认,DA14580只能进入“深度睡眠模式”如果图像被刻录为“OTP”?我目前在我们的光线上使用闪存,并且在睡眠/唤醒周期的部分时,电流达到10ua。我还观察到EVB上的10UA,具有相同的固件。我错过了什么?
谢谢,
亚历克斯
嗨RexDevelopment,
1)没有额外的方法可以将设备放入深度睡眠中,即我已经提到了。根据默认睡眠模式的设备将照顾睡眠并唤醒。10UA对于深度睡眠模式是相当多的一些,也许额外的电流来自您在自定义PCB上或在Dev套件上连接的另一个模块。由于我可以看到您的电路板上有闪光灯,可能额外的电流来自闪光灯。
2)是的,测试深度睡眠模式的唯一方法是刻录OTP并不要忘记拒绝CFG_Development_Debug,因为您没有设备不会强大的Sysram,它会像你一样延长睡眠。
谢谢mt_dialog.