嗨,
我正在尝试使用DA14581 MOD板在我的定制板上延长睡眠。设置如下:
系统最初配置为无OTP拷贝的扩展\u睡眠。唤醒是在一个按钮中断上配置的,它在第一次按下时唤醒系统。在唤醒时,睡眠被禁用(使用arch\u disable\u sleep),因此我可以使用计时器0每100ms采样一个传感器。延长睡眠时间意味着在7秒后重新启用。
在定义的时间段(〜3-4秒)之后,系统似乎只是决定它应该返回到Extende_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 mode,在系统初始化时使用OTP copy-user\u app\u init()callback-唤醒控制器也已启用,以便通过GPIO触发器唤醒系统。当芯片启动时,你能指出它是否也开始做广告吗?是否调用用户\u app \u adv \u start()回调?
>>>在一段规定的时间(约3-4秒)之后,系统似乎决定应该重新进入长时间睡眠,即使它从未重新启用
所以,如果从系统RAM启动,可以在设备决定睡觉后GPIO触发后唤醒它?
请检查计时器是否会导致“自动”睡眠?您使用哪种SDK项目作为开发自己的应用程序的引用?
>>>根据它冻结时的电流消耗情况,它看起来实际上并没有处于延长睡眠模式,实际上仍然处于活动模式,只是卡在了某个地方。
有没有可能在调试模式下运行它,并检查代码是否会中断为断言、NMI等。?
如果default_operation_adv = user_app_adv_start,那么DA4531将在系统初始化后自动启动广告。
谢谢,PM_DIALOG.
模块配置为ext\ U sleep\ U模式没有OTP Copy,User_App_Init用作.app_on_init,唤醒控制器配置为使用GPIO作为从按钮唤醒。当芯片唤醒它不会启动广告时,因为我已经纯化了那个方面。user_app_adv_start()只有当某人保存按钮10秒时只调用回调。
我可以第一次用GPIO触发器把它从睡眠中唤醒。一旦它醒来,它将冻结后3-4秒,除非广告是启用,在这种情况下,一切都将正常工作。
在调试模式下运行的问题是,在调试模式下,一切都正常工作,但在从闪存中运行时不正常工作。
我理解default_operation_adv = user_app_adv_start的方面自动启动广告。我只是不确定为什么似乎在定义时期后冻结的代码的行为似乎改变了代码的行为,而不是预期工作。
就一个与之类似的基本项目而言,它将是用户/外围设备项目和睡眠模式的代理项目的组合。
如果我使用app_easy_timer()而不是将Timer0设置为计数器,则代码也正常工作。我知道Timer0在扩展睡眠模式下禁用,但我在唤醒按钮时使用Arch_disable_sleep(),所以我不明白为什么这将是一个问题。
当从按钮中唤醒时,计时器被完全重新初始化/配置,因此它似乎可以正常启动,但过了一段时间代码就停止了。
编辑:这次从按钮唤醒,直到冻结为2.7秒,非常一致。它绝对不睡觉,当发生冻结时,运行电流从200ua到300ua上升。
嗨adamshier,
你说得对–当设备处于睡眠状态时,定时器0关闭,因为所有外围设备都会阻塞。您可以使用app\u easy\u timer()定期唤醒,因为它使用的是BLE计时器。你能检查一下设备是否在广告时间间隔内休眠吗?我
>>>在调试模式下运行的问题是一切都在调试模式下正常工作,但在从闪存中运行时没有。
连接调试器时,这将阻止系统进入任何睡眠模式。
您能否澄清一下你的意思是在定义的时间内冻结的装置?
因为您是从flash启动的,所以可以使用arch\u printf()在串行终端中打印一些调试信息。
谢谢,PM_DIALOG.
当使用flash启动时,设备肯定会进入睡眠状态当我没有按下按钮或在广告之间时,睡眠电流会下降到~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\u DEVELOPMENT\u DEBUG。问题发生在从flash运行时,无论是否附加了调试器都会发生。
嗨adamshier,
你能定义WDOG并在调试模式下运行它吗?如果您在正常模式下从系统RAM运行它(没有附加调试器),您能复制这个行为吗?连接调试器时,这会阻止系统进入睡眠状态。
谢谢,PM_DIALOG.
所以我尝试启用看门狗,这也似乎也解决了它,而不是删除唤醒回调中的Arch_ble_ext_WakeUp_get的检查。我会总结一下人民的组合:
如果你有
if(arch\u ble\u ext\u wakeup\u get())
{
拱力唤醒();
ARCH_BLE_EXT_WAKEUP_OFF();
app_easy_wakeup();
}
并且您想在某个时期禁用睡眠,然后在稍后重新启用睡眠,然后必须启用看门狗。否则唤醒后,代码将在看门狗超时后冻结,仍然不确定为什么。还有情况下广告已启用,然后在设备广告时它将起作用,然后在完成后将再次冻结,因此无限广告您没有看到此问题。
嗨adamshier,
谢谢你的指示,很高兴你能成功。
谢谢,PM_DIALOG.