你好,
我试图得到延长睡眠工作在我的定制板与DA14581 MOD板。安装过程如下:
系统最初配置为无OTP拷贝的扩展_睡眠。唤醒是在按钮中断上配置的,第一次按下按钮确实会唤醒系统。唤醒后,睡眠被禁用(使用arch_disable_sleep),因此我可以使用计时器0每100毫秒对传感器进行一次采样。延长睡眠时间意味着在7秒后重新启用。
定义一段时间后(约3 - 4秒),系统似乎就决定它应该回到extended_sleep,尽管它从来没有被重新启用,并根据arch_get_sleep_mode睡眠模式(0)。当然timer0不再运行,所以传感器不再是被采样。
如果我将系统配置为不使用扩展_睡眠,则一切正常。同样,当运行RAM(使用KEIL debug)时,这个具有扩展_睡眠的系统可以正常工作,但在使用flash时则不行。
你知道这是什么原因吗?
谢谢
关键词:
设备:
我设置了default_operation_adv = NULL,而不是像所有其他示例那样设置了user_app_adv_start。一旦把它放回user_app_adv_start,那么当广告运行时,它在flash中工作得很好。如果我等到广告完成后再按下按钮,它就会再次冻结。根据当前的消耗,当它冻结时,它看起来不是实际上在extended_sleep模式,实际上仍然在活动模式,只是停留在某处。
你知道为什么会这样吗?从我的角度来看,所有这些都改变了,一开始是做广告,而不是不做广告,但它似乎影响的不止这些。
嗨AdamShier,
感谢您在线提出的问题以及您对我们的微型模块解决方案的兴趣,让我为您的初始帖子更改设备选择,因为选择了DA14581而不是DA14531微型模块。
如果我的理解有误,请更正:在系统初始化时,模块配置为EXT Sleep模式,带有OTP copy-user_app_init()回调-并且还启用了唤醒控制器,以便通过GPIO触发器唤醒系统。当芯片启动时,你能指出它是否也开始做广告吗?您是否调用用户\u app\u adv\u start()回调?
>>>在定义的时间段(〜3-4秒)后,系统似乎只是决定它应该重新进入Extende_sleep,事件从未重新启用
那么,如果从System-RAM启动,在设备决定休眠后,可以在GPIO触发器后唤醒它吗?
你能检查一下定时器是否会导致"自动"睡眠吗?您将使用哪个SDK项目作为开发自己的应用程序的参考?
>>>根据它冻结时的电流消耗,它看起来实际上并没有处于延长睡眠模式,实际上仍然处于活动模式,只是卡在某个地方。
是否可以在调试模式下运行它,并检查代码是否会中断为断言、NMI等。?
如果default_operation_adv = user_app_adv_start,那么DA4531将在系统初始化后自动开始发布。
谢谢,PM_Dialog
该模块在ext_sleep_模式下配置没有OTP拷贝,user_app_init被用作.app_on_init,并且唤醒控制器被配置为使用GPIO作为从按钮唤醒。当芯片醒来时,它不会开始做广告,因为我已经有意识地删除了那个方面。user_app_adv_start()回调函数只在某人按住按钮10秒时调用。
我可以用GPIO触发器第一次把它从睡眠中唤醒。一旦它醒来,它会在3-4秒后冻结,除非启用了广告,在这种情况下,一切都会正常工作。
在调试模式下运行的问题是,在调试模式下一切都能正常运行,但从flash中运行时就不行了。
我理解default_operation_adv = user_app_adv_start在开始时自动启动广告的方面。我只是不确定为什么这似乎改变了代码的行为在定义的时期之后冻结,而不是像预期的那样工作。
就其类似的基本项目而言,它将是用户和代理的组合,用于睡眠模式。
如果使用app_easy_timer()而不是将timer0设置为计数器,代码也可以正常工作。我知道timer0在扩展睡眠模式是禁用的,但我使用arch_disable_sleep()从按钮醒来,所以我不知道为什么这将是一个问题。
从按钮唤醒后,计时器将完全重新初始化/配置,因此它似乎可以正常启动,但一段时间后,代码将停止。
编辑:这一次从按钮醒来到冻结是2.7秒,非常一致。它绝对没有休眠,运行电流从200uA上升到300uA当冻结发生。
嗨AdamShier,
您是对的–当设备处于睡眠状态时,计时器0处于关闭状态,因为所有外围模块都处于关闭状态。您可以使用app_easy_timer()定期唤醒,因为它使用的是BLE定时器。您能检查一下设备是否在广告时间间隔内休眠吗?我
在调试模式下运行的问题是,一切都能在调试模式下正常运行,但从flash中运行时就不行了。
连接调试器时,这将防止系统进入任何睡眠模式。
您能解释一下您所说的设备在规定时间后冻结是什么意思吗?
由于您是从flash启动的,因此可以使用arch_printf()在串行终端中打印一些调试信息。
谢谢,PM_Dialog
当使用闪存启动时,当我没有按下按钮或在广告之间时,设备肯定会进入睡眠状态,睡眠电流降至~10uA。
我使用printf来确定它是否已冻结。按下按钮时,睡眠被禁用,定时器0启动,并每100ms产生一次中断。中断处理程序所做的就是打印递增索引。递增的索引工作2.7秒,直到它停止,这就是为什么我知道它在2.7秒后会一直冻结。
这或多或少已经解决了。我不知道为什么在2.7秒后它会冻结,或者为什么在启用广告时它会工作,但现在当我移除
如果(arch_ble_ext_wakeup_get())在按钮按回调。我认为它在示例项目中,因为按钮开始广告,它只有在广告完成时评估为真。所以对于我的项目来说,它不存在是有意义的。
嗨AdamShier,
默认情况下,WDOG超时约为2.6秒,因此我假设WDOD计时器过期。
您运行的是附加了调试器的吗?您还应该启用开发调试-CFG\u development\u debug。
谢谢,PM_Dialog
wdog没有在配置文件中定义,但这些时间似乎太接近了,不可能是巧合。定义了CFG_开发_调试。从闪存运行时会出现此问题,无论是否连接了调试器都会出现此问题。
嗨AdamShier,
您能否在调试模式下定义WDOG并运行它?如果在正常模式下从系统RAM运行它(没有安装调试器),您是否可以复制此行为?随附调试器时,这会阻止系统睡眠状态。
谢谢,PM_Dialog
因此,我尝试启用了watchdog,这似乎也解决了问题,而不是在wakeup回调中取消对arch_ble_ext_wakeup_get的检查。我将在这里为大家总结以下组合:
如果你有
if(arch_ble_ext_wakeup_get())
{
拱力唤醒();
arch_ble_ext_wakeup_off ();
app_easy_wakeup();
}
你想要禁用睡眠一段时间,然后在稍后的时间点重新启用睡眠,那么看门狗必须被启用。否则在唤醒后代码会在看门狗超时后冻结,仍然不确定到底为什么。还有一种情况是,当广告启用时,它将在设备广告时工作,然后将再次冻结时,无限的广告,你不会看到这个问题。
嗨AdamShier,
谢谢你的提示,很高兴你能让它工作。
谢谢,PM_Dialog
嗨AdamShier,
我目前正在努力解决类似的问题,围绕外睡眠,按钮唤醒和周期性读取传感器值。你是否愿意分享一些代码与更多的信息,如你如何进入睡眠,你如何配置按钮按下唤醒/回调,..?
非常感谢并致以最良好的问候,
约瑟夫