扩展睡眠模式禁用/重新启用

学到更多常见问题解答教程

13个帖子/ 0新
最后一篇
adamshier
离线
最后一次露面:4周1日前
加入:2020-07-30 18:04
扩展睡眠模式禁用/重新启用

嗨,

我正在尝试使用DA14581 MOD板在我的定制板上延长睡眠。设置如下:

系统最初配置使用Extended_sleep,而无需OTP副本。唤醒在按钮中断时配置,首先按下系统唤醒系统。在唤醒时,禁用睡眠(使用Arch_disable_sleep),因此我可以使用Timer0每100ms对传感器进行排样。然后,Extended_sleep将在7秒后重新启用。

在定义的时间段(〜3-4秒)之后,系统似乎只是决定它应该返回到Extende_sleep,它永远不会重新启用它,并且根据Arch_Get_Sleep_Mode睡眠模式关闭(0)。当然,Timer0不再运行,因此传感器不再被采样。

如果我配置系统以不使用Extended_sleep,那么一切都按预期工作。同样,当耗尽RAM(使用Keil Debug)时,使用Extended_sleep的此系统工作正常,但不使用闪存时。

你有什么想法造成这个吗?

谢谢

设备:
adamshier
离线
最后一次露面:4周1日前
加入:2020-07-30 18:04
我设置了默认值

我已经设置了default_operation_adv = null,而不是user_app_adv_start,因为所有其他示例都已。一旦它返回到User_App_Adv_Start,那么在广告正在运行时它就在Flash中正常工作。如果我等到广告完成以按下按钮,那么再次冻结。基于当前消耗时,它冻结时,它看起来它实际上不是在Extended_sleep模式下,实际上仍处于活动模式,只是粘在某个地方。

你有什么想法是否为什么?从我的角度来看,所有这些都改变了它在开始时的广告,但它似乎影响不仅仅是那样的。

PM_DIALOG.
离线
最后一次露面:28分55秒前
员工
加入:2018-02-08 11:03
嗨adamshier,

嗨adamshier,

感谢您在线的问题,为了您对我们的微小模块解决方案的兴趣,让我更改初始帖子的设备选择,因为选择了DA14581而不是DA14531微型模块。

如果我的理解是错误的当筹码唤醒时,可以请注明它是否也开始广告?你打电话给user_app_adv_start()回调吗?

>>>在定义的时间段(〜3-4秒)后,系统似乎只是决定它应该重新进入Extende_sleep,事件从未重新启用

所以,如果从系统RAM启动,可以在设备决定睡觉后GPIO触发后唤醒它?

请检查计时器是否会导致“自动”睡眠?您使用哪种SDK项目作为开发自己的应用程序的引用?

>>>基于当前消耗它冻结时,看起来它实际上不是在Extended_sleep模式下,实际上仍然处于活动模式,只是粘在某个地方。

是否有可能以调试模式运行它,并检查代码是否已破坏到断言,NMI等?

如果default_operation_adv = user_app_adv_start,那么DA4531将在系统初始化后自动启动广告。

谢谢,PM_DIALOG.

adamshier
离线
最后一次露面:4周1日前
加入:2020-07-30 18:04
模块配置在

该模块在ext_sleep_mode中配置没有OTP Copy,User_App_Init用作.app_on_init,唤醒控制器配置为使用GPIO作为从按钮唤醒。当芯片唤醒它不会启动广告时,因为我已经纯化了那个方面。user_app_adv_start()只有当某人保存按钮10秒时只调用回调。

我可以使用GPIO触发器从睡眠中唤醒它。一旦它醒来,除非是启用广告,否则将在3-4秒后冻结,除非是广告,在这种情况下,一切都将正常工作。

在调试模式下运行的问题是,在调试模式下,一切都正常工作,但在从闪存中运行时不正常工作。

我理解default_operation_adv = user_app_adv_start的方面自动启动广告。我只是不确定为什么似乎在定义时期后冻结的代码的行为似乎改变了代码的行为,而不是预期工作。

就它类似的基本项目而言,它将是睡眠模式的User_Peripheral one和代理一个的组合。

adamshier
离线
最后一次露面:4周1日前
加入:2020-07-30 18:04
如果我的话,代码也很好

如果我使用app_easy_timer()而不是将Timer0设置为计数器,则代码也正常工作。我知道Timer0在扩展睡眠模式下禁用,但我在唤醒按钮时使用Arch_disable_sleep(),所以我不明白为什么这将是一个问题。

在从按钮唤醒时,定时器完全重新初始化/配置,因此它似乎是正确的,但在一段时间后,代码只是停止。

编辑:这次从按钮唤醒,直到冻结为2.7秒,非常一致。它绝对不睡觉,当发生冻结时,运行电流从200ua到300ua上升。

PM_DIALOG.
离线
最后一次露面:28分55秒前
员工
加入:2018-02-08 11:03
嗨adamshier,

嗨adamshier,

您是对的 - 当设备睡眠时,Timer0已关闭,作为所有外围设备。您可以使用app_easy_timer()定期唤醒,因为它是使用BLE定时器。您可以检查设备是否在广告间隔之间睡觉?一世

>>>在调试模式下运行的问题是一切都在调试模式下正常工作,但在从闪存中运行时没有。

随附调试器时,会阻止系统进入任何睡眠模式。

您能否澄清一下你的意思是在定义的时间内冻结的装置?

由于您从Flash启动,您可以使用ARCH_PRINTF()以便在串行终端中打印一些调试信息。

谢谢,PM_DIALOG.

adamshier
离线
最后一次露面:4周1日前
加入:2020-07-30 18:04
使用闪光灯启动时,

当使用闪光灯启动时,当我没有按下按钮或在广告中占用时,设备肯定会睡觉,睡眠电流下降到〜10ua。

我正在使用printf,以确定它被冻结。按下按钮后,禁用睡眠状态,并启动Timer0并每100ms生成中断。所有中断处理程序都已打印递增索引。递增索引工作2.7秒,直到它只是停止,这就是我知道它在2.7秒后始终冻结。

adamshier
离线
最后一次露面:4周1日前
加入:2020-07-30 18:04
这或多或少解决了。

这或多或少解决了。我并不完全了解为什么它在2.7秒后冻结,或者为什么在启用广告时它正在运行,但它在我删除的时候正常工作

如果按钮中的(ARCH_BLE_EXT_WAKEUP_GET())按回调。我认为它在示例项目中,因为该按钮开始了广告,它只评估广告完成后的真实情况。所以对于我的项目来说,它没有意义。

PM_DIALOG.
离线
最后一次露面:28分55秒前
员工
加入:2018-02-08 11:03
嗨adamshier,

嗨adamshier,

默认情况下,WDOG超时左右2.6秒,所以我假设WDOD定时器到期。

您是否始终连接调试器?您还应该具有启用的开发调试 - CFG_DEVELVELMMENT_DEBUG。

谢谢,PM_DIALOG.

adamshier
离线
最后一次露面:4周1日前
加入:2020-07-30 18:04
WDOG未定义

WDOG未在配置文件中定义,但那些时间似乎太接近是巧合。定义了CFG_DEVELINMENT_DEBUG。从Flash运行时出现此问题,并发生调试器是否已连接。

PM_DIALOG.
离线
最后一次露面:28分55秒前
员工
加入:2018-02-08 11:03
嗨adamshier,

嗨adamshier,

您能否在调试模式下定义WDOG并运行它?如果在正常模式下从系统RAM运行它(没有安装调试器),您是否可以复制此行为?随附调试器时,这会阻止系统睡眠状态。

谢谢,PM_DIALOG.

adamshier
离线
最后一次露面:4周1日前
加入:2020-07-30 18:04
所以我尝试了启用

所以我尝试启用看门狗,这也似乎也解决了它,而不是删除唤醒回调中的Arch_ble_ext_WakeUp_get的检查。我会总结一下人民的组合:

如果你有

if(arch_ble_ext_wakeup_get()))
{
ARCH_BLE_FORCE_WAKEUP();
ARCH_BLE_EXT_WAKEUP_OFF();
app_easy_wakeup();
}

并且您想在某个时期禁用睡眠,然后在稍后重新启用睡眠,然后必须启用看门狗。否则唤醒后,代码将在看门狗超时后冻结,仍然不确定为什么。还有情况下广告已启用,然后在设备广告时它将起作用,然后在完成后将再次冻结,因此无限广告您没有看到此问题。

PM_DIALOG.
离线
最后一次露面:28分55秒前
员工
加入:2018-02-08 11:03
嗨adamshier,

嗨adamshier,

谢谢你的迹象,很高兴你有工作。

谢谢,PM_DIALOG.