延长睡眠模式禁用/重新启用

了解更多常见问题教程

13个职位/0个新职位
最后一篇文章
亚当希尔
离线
最后一次见到:4周1天前
已加入:2020-07-30 18:04
延长睡眠模式禁用/重新启用

你好,

我试图得到延长睡眠工作在我的自定义板与DA14581模块板。设置如下:

系统最初配置为无OTP拷贝的扩展\u睡眠。唤醒是在一个按钮中断上配置的,它在第一次按下时唤醒系统。在唤醒时,睡眠被禁用(使用arch\u disable\u sleep),因此我可以使用计时器0每100ms采样一个传感器。延长睡眠时间意味着在7秒后重新启用。

在定义的时间段(约3-4秒)之后,系统似乎刚刚决定它应该返回到延长的睡眠状态,即使它从未重新启用,并且根据arch\u get\u sleep\u mode,睡眠模式是关闭的(0)。当然,计时器0不再运行,因此传感器不再被采样。

如果我将系统配置为不使用扩展睡眠,那么一切都按预期工作。同样,这个带有扩展睡眠的系统在运行RAM(使用KEIL debug)时工作正常,但在使用flash时工作不正常。

你知道这是什么原因吗?

谢谢

设备:
亚当希尔
离线
最后一次见到:4周1天前
已加入:2020-07-30 18:04
我设置了默认值

我已经设置了默认的\u操作\u adv=NULL,而不是像所有其他示例那样设置用户\u app \u adv \u start。一旦把它放回用户的app\u adv\u启动,它就可以在广告运行时在flash中正常工作。如果我等到广告完成后再按按钮,它就会再次冻结。根据它冻结时的电流消耗情况,它看起来实际上并没有处于延长睡眠模式,实际上仍然处于活动模式,只是卡在了某个地方。

你知道为什么会这样吗?从我的角度来看,所有这些都改变了,一开始是广告,而不是没有,但它似乎影响的不仅仅是这个。

PM\U对话框
在线的
最后一次见到:1分56秒前
工作人员
已加入:2018-02-08 11:03
你好,亚当希尔,

你好,亚当希尔,

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

如果我的理解有误,请更正:模块配置为EXT Sleep mode,在系统初始化时使用OTP copy-user\u app\u init()callback-唤醒控制器也已启用,以便通过GPIO触发器唤醒系统。当芯片启动时,你能指出它是否也开始做广告吗?是否调用用户\u app \u adv \u start()回调?

>>>在一段规定的时间(约3-4秒)之后,系统似乎决定应该重新进入长时间睡眠,即使它从未重新启用

因此,如果您是从系统RAM引导,您能在设备决定睡眠后,在GPIO触发后唤醒它吗?

你能检查一下计时器是否会导致“自动”睡眠吗?您使用哪个SDK项目作为开发自己应用程序的参考?

>>>根据它冻结时的电流消耗情况,它看起来实际上并没有处于延长睡眠模式,实际上仍然处于活动模式,只是卡在了某个地方。

有没有可能在调试模式下运行它,并检查代码是否会中断为断言、NMI等。?

如果默认的\u operation \u adv=user \u app \u adv \u start,那么DA4531将在系统初始化后自动开始播发。

谢谢,下午好

亚当希尔
离线
最后一次见到:4周1天前
已加入:2020-07-30 18:04
模块在中配置

模块配置为ext\ U sleep\ U模式没有OTP copy,user\u app\u init用作\u init上的.app\u,并且唤醒控制器配置为使用GPIO作为按钮的唤醒。当芯片被唤醒时,它不会开始做广告,因为我故意删除了那个方面。只有当有人按住按钮10秒时,才会调用user\u app\u adv\u start()回调。

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

在调试模式下运行的问题是,在调试模式下一切都可以正常工作,但从flash运行时就不行了。

我了解默认操作的方面\u adv=user\u app\u adv\u start在开始时自动启动广告。我只是不知道为什么这似乎改变了代码的行为,比如在定义的时间段后冻结,而不是按预期工作。

就一个与之类似的基本项目而言,它将是用户/外围设备项目和睡眠模式的代理项目的组合。

亚当希尔
离线
最后一次见到:4周1天前
已加入:2020-07-30 18:04
如果我

如果我使用app\u easy\u timer()而不是将timer0设置为计数器,那么代码也可以正常工作。我知道定时器0在延长睡眠模式下被禁用,但我在从按钮上唤醒时使用arch\u disable\u sleep(),所以我不明白为什么会有问题。

当从按钮中唤醒时,计时器被完全重新初始化/配置,因此它似乎可以正常启动,但过了一段时间代码就停止了。

编辑:这个时间从按钮唤醒到冻结是2.7秒,非常一致。当冻结发生时,运行电流从200uA上升到300uA。

PM\U对话框
在线的
最后一次见到:1分56秒前
工作人员
已加入:2018-02-08 11:03
你好,亚当希尔,

你好,亚当希尔,

你说得对–当设备处于睡眠状态时,定时器0关闭,因为所有外围设备都会阻塞。您可以使用app\u easy\u timer()定期唤醒,因为它使用的是BLE计时器。你能检查一下设备是否在广告时间间隔内休眠吗?我

>>>在调试模式下运行的问题是,在调试模式下一切都可以正常工作,但从flash运行时就不行了。

连接调试器时,这将阻止系统进入任何睡眠模式。

你能澄清一下你所说的设备在规定的时间后被冻结是什么意思吗?

因为您是从flash启动的,所以可以使用arch\u printf()在串行终端中打印一些调试信息。

谢谢,下午好

亚当希尔
离线
最后一次见到:4周1天前
已加入:2020-07-30 18:04
使用闪存启动时,

当使用flash启动时,设备肯定会进入睡眠状态当我没有按下按钮或在广告之间时,睡眠电流会下降到~10uA。

我使用printf来确定它是否冻结了。当按下该按钮时,睡眠被禁用,计时器0被启动并每100ms生成一个中断。中断处理程序所做的只是打印一个递增索引。递增索引工作2.7秒,直到它停止,这就是为什么我知道它在2.7秒后会一直冻结。

亚当希尔
离线
最后一次见到:4周1天前
已加入:2020-07-30 18:04
这或多或少已经解决了。

这或多或少已经解决了。我不知道为什么它在2.7秒后会冻结,或者为什么它在启用广告时工作,但是现在当我移除

如果(arch\u ble\u ext\u wakeup\u get())在按钮中,请按callback。我认为这是在示例项目中,因为按钮启动了广告,并且只有在广告完成时才评估为真。所以对于我的项目来说,它不在那里是有意义的。

PM\U对话框
在线的
最后一次见到:1分56秒前
工作人员
已加入:2018-02-08 11:03
你好,亚当希尔,

你好,亚当希尔,

默认情况下,WDOG超时大约为2.6秒,因此我假设WDOD计时器将过期。

你运行的是附加了调试器的吗?您还应该启用开发调试-CFG\u development\u debug。

谢谢,下午好

亚当希尔
离线
最后一次见到:4周1天前
已加入:2020-07-30 18:04
中未定义wdog

配置文件中没有定义wdog,但是这些时间似乎太接近了,不可能是巧合。定义了CFG\u DEVELOPMENT\u DEBUG。问题发生在从flash运行时,无论是否附加了调试器都会发生。

PM\U对话框
在线的
最后一次见到:1分56秒前
工作人员
已加入:2018-02-08 11:03
你好,亚当希尔,

你好,亚当希尔,

你能定义WDOG并在调试模式下运行它吗?如果您在正常模式下从系统RAM运行它(没有附加调试器),您能复制这个行为吗?连接调试器时,这会阻止系统进入睡眠状态。

谢谢,下午好

亚当希尔
离线
最后一次见到:4周1天前
已加入:2020-07-30 18:04
所以我试着启用

所以我试着启用了watchdog,这似乎也解决了这个问题,而不是在wakeup回调中删除对arch\u ble\u ext\u wakeup\u get的检查。我在这里为大家总结一下这些组合:

如果你有

if(arch\u ble\u ext\u wakeup\u get())
{
拱力唤醒();
arch_ble_ext_wakeup_off();
app_easy_wakeup();
}

如果要在一段时间内禁用睡眠,然后在稍后的某个时间重新启用睡眠,则必须启用看门狗。否则唤醒后的代码会在看门狗超时后冻结,仍不确定具体原因。还有一种情况,当广告被启用,那么它将工作,而设备是广告,然后将再次冻结完成时,因此与无限广告你看不到这个问题。

PM\U对话框
在线的
最后一次见到:1分56秒前
工作人员
已加入:2018-02-08 11:03
你好,亚当希尔,

你好,亚当希尔,

谢谢你的指示,很高兴你能成功。

谢谢,下午好