app_easy_wakeup_set和app_easy_wakeup_wake是如何工作的?

⚠️
大家好. .谢谢你来参加论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,并包含在Dialog主网站中。所有的帖子和账户都已迁移。我们现在只接受新论坛的流量-请张贴任何新的线程//www.xmece.com/support.我们将在未来几天修复漏洞/优化搜索和标签。
29个岗位/ 0个新岗位
最后发表
daniel59
离线
最后看到:1年8个月前
加入:2016-01-08 04:34
app_easy_wakeup_set和app_easy_wakeup_wake是如何工作的?

我在SMARTTAG和睡眠模式源代码中找到了这个函数,但在SDK参考中找不到使用方法,它是如何工作的?它会唤醒核心吗?或者在我触发中断之后,内核被唤醒?

设备:
MT_dialog
离线
最后看到:5个月2周前
工作人员
加入:2015-06-08 34
嗨daniel59,

嗨daniel59,

它只是一个用于唤醒时使用的api,使用app_easy_wakeup_set(),您只需为设备设置一个回调函数,以便在app_easy_wakeup函数()发送唤醒消息时立即执行。因此app_easy_wakeup_set()函数从唤醒定时器中断中被调用(它将特定的消息推入内核),一旦内核被唤醒并调度消息,您通过app_easy_wakeup_set()设置的函数将被触发。

由于MT_dialog

daniel59
离线
最后看到:1年8个月前
加入:2016-01-08 04:34
如果我想打开LED

所以如果我想打开LED的延长睡眠模式。我应该如何编写代码?

1.
app_button_press_cb {
turn_on_led ();

on_init () {
wkupct_register_callback (app_button_press_cb);
wkupct_enable_irq(WKUPCT_PIN_SELECT(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN), // select pin (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN))
wkupct_pin_极性(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, WKUPCT_PIN_POLARITY_LOW), //极性低
1, // 1事件
40);//弹跳时间= 0

或2。
wakeup_cb () {
turn_on_led ();

app_button_press_cb () {
app_easy_wakeup_set (turn_on_led);
app_easy_wakeup ();

on_init () {
wkupct_register_callback (app_button_press_cb);
wkupct_enable_irq(WKUPCT_PIN_SELECT(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN), // select pin (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN))
wkupct_pin_极性(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, WKUPCT_PIN_POLARITY_LOW), //极性低
1, // 1事件
40);//弹跳时间= 0

我应该在哪里放置arch_disable_sleep函数?

MT_dialog
离线
最后看到:5个月2周前
工作人员
加入:2015-06-08 34
嗨daniel59,

嗨daniel59,

在开始发布时设置唤醒中断(如果设备将以扩展睡眠模式发布广告),或者在从.app_on_adv_undirect_complete完成发布过程后立即设置唤醒中断。中断的设置可以如下所示:

app_easy_wakeup_set (app_wakeup_cb);// app_wakeup_cb是你要打开LED的地方,所以它只包括函数GPIOSetActive()。
wkupct_register_callback (app_button_press_cb);// app_button_press是唤醒中断的回调(如下所述)
wkupct_enable_irq(WKUPCT_PIN_SELECT(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN), // select pin (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN))
wkupct_pin_极性(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, WKUPCT_PIN_POLARITY_LOW), //极性低
1, // 1事件
40);//弹跳时间= 0

静态无效app_button_press_cb

if (GetBits16(SYS_STAT_REG, PER_IS_DOWN))

periph_init ();

如果(arch_ble_ext_wakeup_get ())

arch_set_sleep_mode (ARCH_SLEEP_OFF);//关闭休眠模式
arch_ble_force_wakeup ();//强制BLE唤醒
arch_ble_ext_wakeup_off ();//禁用外部唤醒(如果你在进入永久睡眠之前设置了arch_ble_ext_wakeup_on()函数)
app_easy_wakeup ();//在BLE醒来后立即调用app_easy_wakeup()来执行app_wakeup_cb()函数并打开//LED

由于MT_dialog

daniel59
离线
最后看到:1年8个月前
加入:2016-01-08 04:34
嗨MT_dialog,

嗨MT_dialog,

但我发现在SMARTTAG源代码中,app_easy_wakeup_set()刚好在app_easy_wakeup_set()之后;

你的意思是我必须在app_easy_wakeup之前修改睡眠模式?或者我可以在简单唤醒回调中修改睡眠模式?

和我的代码不把BLE,所以我可以直接使用app_easy_wakeup没有if (arch_ble_ext_wakeup_get())?

如果我有更多的操作,在核心唤醒后,我应该把代码放在哪里?在wkupct回调还是在容易唤醒回调?

什么代码应该在wkupct回调和什么代码应该在容易唤醒回调?

谢谢,
丹尼尔

MT_dialog
离线
最后看到:5个月2周前
工作人员
加入:2015-06-08 34
嗨daniel59,

嗨daniel59,

app_easy_wakeup_set()它只是设置回调,当来自app_easy_wakeup()的消息被发送时,它将被执行,当你设置这个消息时并不重要,你只需要在调用触发它的app_easy_wakeup()之前设置。关于修改睡眠。您可以在来自唤醒计时器的中断发生或app_easy回调执行时立即更改睡眠模式。

有关,你应该把额外的操作代码,这取决于你想做什么,对切换GPIO app_easy_wakeup可以使用回调,但如果有与外部的交互外设,传感器等你应该醒来并实现您的代码在app_on_ble_powered或app_on_system_powered(如何使用这些回调函数你可以找到更多的信息在嗯- b - 051 - da1458x软件平台参考v1.0.pdf 7.2节)。

关于arch_ble_ext_wakeup_get(),检查是为了验证用户是否调用了arch_ble_ext_wakeup_on(),如果你在睡觉前没有调用这个函数,你不必进行检查。

通常wkupct回调有外围设备的初始化(外围初始化),强制BLE唤醒(如果需要),调用arch_ble_ext_wakeup_off(),如果arch_ble_ext_wakeup_on()在进入睡眠之前被调用,并通过app_easy_wakeup()发送消息,以便在BLE被唤醒时立即执行一些代码。app_easy_wakeup()回调接受您想要的任何类型的代码,但您应该注意在该函数中执行的代码不会花费太长时间,因为存在丢失BLE事件的情况。对于外设UART, SPI, I2C的长时间操作,您应该使用前面提到的回调。

由于MT_dialog

daniel59
离线
最后看到:1年8个月前
加入:2016-01-08 04:34
嗨MT_dialog,

嗨MT_dialog,

我的产品需要一直连接到电话,所以我不使用arch_ble_ext_wakeup_on()函数。

我尝试了app_on_system_powered, app_on_ble_powered和user_resume_from_sleep。我觉得他们做不到我想要的。

我尝试了一个简单的代码。

arch_main_loop_callback_ret_t user_on_system_powered(空白)

+ +;
返回GOTO_SLEEP;

arch_main_loop_callback_ret_t user_on_ble_powered(空白)

b + +;
返回GOTO_SLEEP;

空白user_resume_from_sleep(空白)

c++;

找到a b c会在没有命中的情况下增加唤醒定时器。

我想做的是用SPI传感器FIFO水印中断按唤醒定时器,无论BLE是否连接,取出所有FIFO数据并计算步长,如果步长大于100,例如,打开蜂鸣器和led,这需要核心禁用睡眠模式。

我写了所有的代码在唤醒定时器回调,它可以工作,但led和蜂鸣器不能工作,因为扩展睡眠模式,有时它会触发警告显示
if ((DEVELOPMENT_DEBUG) && (USE_POWER_OPTIMIZATIONS))

slp_period_retain = slp_period;
//如果该断言命中,则LP ISR持续的时间长于该时间
//通过LP_ISR_TIME_XTAL32_CYCLES和LP_ISR_TIME_USEC保留。
If (sleep_lp_cycles && (sleep_lp_cycles < slp_period))
ASSERT_WARNING (0);

我试着把所有的代码都放在简单的唤醒回调中,它的工作原理是一样的,但不会触发警告,但我发现我的手机与芯片断开了。

如何编写代码?

chris0409
离线
最后看到:4年1个月前
加入:2017-01-11 05:59
您应该重新配置gpio

你应该在唤醒手柄中重新配置与Led和蜂鸣器相关的gpio引脚,因为当从睡眠模式唤醒时,该引脚的所有配置都丢失了。
像这样
如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN))
periph_init ();

daniel59
离线
最后看到:1年8个月前
加入:2016-01-08 04:34
嗨,克里斯,

嗨,克里斯,

是的,我重新配置了。但在睡眠模式下,LED只亮0.5秒。

MT_dialog
离线
最后看到:5个月2周前
工作人员
加入:2015-06-08 34
嗨daniel59,

嗨daniel59,

您使用的回调将在系统通过主循环时执行,因为设备不会进入睡眠状态,这意味着在唤醒执行连接间隔后,代码将通过所有这些函数并增加您拥有的变量,直到连接间隔结束并到达睡眠过程。从那一刻起,它将停留在WFI()中,直到下一个连接事件到来。如果你有你的实现在唤醒定时器回调,那么你正在延迟唤醒睡眠和ASSERT_WARNING(),你看到的,通知你设备应该已经被唤醒,但某些事情已经延迟了这个过程。

在第二种情况下,通过app_easy_wakeup()触发你的代码,本质上你是在发送一个消息,你不会干扰连接事件和活动BLE过程,但显然你花在与传感器交互读取数据的时间相当大,或者你的连接间隔对于这种活动太小,所以你错过了连接事件,因此设备认为连接丢失了。要么尝试将传感器交互分离成更小的块(读取更小部分的数据),以便580能够服务于传感器交互和BLE事件,要么增加一点连接间隔超时和连接的延迟,以便设备在连接间隔发生之前有更多的时间与传感器交互,以便您的设备在丢失事件时有更大的容忍度。

至于LED灯,它会亮0.5秒,当处于睡眠模式时,引脚会保持他们的状态,所以当进入睡眠状态时没有问题,问题是当设备醒来时。为了配置应用程序使用的引脚,在每次唤醒时都会调用perid_init(),因此当执行perid_init()时,引脚将被重新配置及其状态。为了克服这个问题,你必须存储引脚的值(激活的,非激活的),并且在每次唤醒时,根据你所存储的状态在函数中配置引脚的状态。

由于MT_dialog

daniel59
离线
最后看到:1年8个月前
加入:2016-01-08 04:34
嗨MT_dialog,

嗨MT_dialog,

所以我把代码放在哪里重要吗?

如何增加连接时间间隔、超时时间和延迟时间?

是下面的代码吗?
user_connection_param_conf = {
///双槽连接间隔最小值为1.25ms
///使用宏MS_TO_DOUBLESLOTS将毫秒(ms)转换为双槽
.intv_min = MS_TO_DOUBLESLOTS(10),

///双槽最大连接间隔(1.25ms)
///使用宏MS_TO_DOUBLESLOTS将毫秒(ms)转换为双槽
.intv_max = MS_TO_DOUBLESLOTS(20),

///在连接事件中测量的延迟
.latency = 0,

///监控超时时间(10ms)
///使用宏MS_TO_TIMERUNITS将毫秒(ms)转换为计时器单位
.time_out = MS_TO_TIMERUNITS(1250),

///在ble双插槽中测量的最小连接事件持续时间(1.25ms)
///使用宏MS_TO_DOUBLESLOTS将毫秒(ms)转换为双槽
.ce_len_min = MS_TO_DOUBLESLOTS(0),

///最大连接事件持续时间(1.25ms)
///使用宏MS_TO_DOUBLESLOTS将毫秒(ms)转换为双槽
.ce_len_max = MS_TO_DOUBLESLOTS(0),
};

我用RCX20作为睡眠时钟有关系吗?

所以led和蜂鸣器可以在扩展睡眠模式下工作,但我必须在perid_init()中设置状态?

如果我的产品需要一直连接,睡眠模式能省电吗?因为我发现,连接后,经常被调用的外围init(),这意味着核心如果经常被唤醒。

MT_dialog
离线
最后看到:5个月2周前
工作人员
加入:2015-06-08 34
嗨daniel59,

嗨daniel59,

至于你把代码放在哪里很重要,我想你的意思是代码接口外部传感器,正如我上面提到的,这取决于设备的状态(连接,广告)和你的代码需要多长时间才能执行,如果它需要足够长的时间,你可能会错过连接间隔和与外围设备连接松散。

关于如何增加连接间隔,连接间隔是由中央定义的,你能做的就是发出一个连接更新请求,中央将决定是否接受你请求的连接参数。你所粘贴的SDK部分是设备在与中心连接时检查的部分,如果当前参数不匹配,将向中心发送请求以更新连接参数(该请求在连接建立后10秒发送),因此如果中心接受参数,连接将更改为user_connection_param_conf结构中的指定值。

对于连接参数,您的LP时钟没有任何影响。

如上所述,LED可以工作,因为当设备处于睡眠模式时,引脚保持它们的状态,你只需要记住引脚的状态,并在外围初始化()中相应地设置它,因为在唤醒外围初始化()时执行,引脚被重新配置。关于蜂鸣器,我假设你提供了一个PWM,定时器在睡眠模式下被关闭,因此你不能在设备处于睡眠模式时产生PWM来驱动蜂鸣器。

是的,睡眠模式可以节省电力,设备将在安排的连接间隔中进入睡眠和唤醒,关于peri_init()和调用的频率,如前所述,它在每个连接间隔中被调用,以便与中央通信,一般来说连接间隔越长,你应该睡得越长(不考虑外部唤醒),你睡得越多,消耗的就越少。

由于MT_dialog

daniel59
离线
最后看到:1年8个月前
加入:2016-01-08 04:34
嗨MT_dialog,

嗨MT_dialog,

不,我的意思是把代码放在唤醒定时器回调或简单唤醒回调中。一个会影响睡眠另一个会影响连接事件?解决这两个问题的方法是增加连接间隔?

在常规的方式,代码应该在容易唤醒回调?

那么在我的应用中,DA14580需要一直连接,核心通过连接间隔进入睡眠和唤醒?

我发现Android没有api来改变连接间隔,所以我可以使用app_easy_gap_param_update_start在user_on_connection更新连接参数到我的user_connection_param_conf在user_config.h?

user_gapm_conf中的interval和user_connection_param_conf中的interval有什么区别?它们是一样的吗?如何使用user_gapm_conf与app_easy_gap_dev_configure()?

在训练04中,它说使用RCX20,它可以在连接时计数最多2秒,或者在广告时无限时间计数,这是否意味着连接间隔必须小于2秒?

在SmartTag参考中,表10显示,2500毫秒间隔比500毫秒间隔使用更多的功率,原因是:对于更长的间隔,射频接收机必须
活动较长时间以检测来自主服务器的轮询。这和你说的不一样。是为了连接功耗吗?

谢谢,
丹尼尔

MT_dialog
离线
最后看到:5个月2周前
工作人员
加入:2015-06-08 34
嗨daniel59,

嗨daniel59,

你的意思是如果你要在哪个文件中放置回调函数你要把app_easy_wakeup_set()放在哪个文件中?不,没关系。关于你应该把你的代码放在上面提到的地方,这取决于交易的长度,如果交易让MCU占用了很长一段时间,那么代码在哪里并不重要,它会破坏你的连接,因为你占用了MCU很长一段时间(这种情况下,你应该考虑把你的交易分成更小的部分),如果你把你的代码放在唤醒定时器回调中会影响系统的唤醒,因为你与传感器的交互会干扰唤醒过程,在app_easy方法中,设备将通过消息同步启动事务,对于唤醒过程来说是可以的,但是同样,如果这个过程足够长并且延迟了设备的服务连接间隔,你将失去连接。

是的,SDK会根据广告或连接间隔来处理设备的休眠。

如上所述,是的,你可以向中心发送一个请求,如果它接受外设指示的参数,它将由中心决定,而且SDK发送请求将需要一些时间(大约10秒)。

不可以,BLE指定最大连接间隔为4秒。

在之前的帖子中,我提到了一个可以遵循的一般规则,并不是每个设计都是这样,智能标签上提到的功耗是每次唤醒时的功耗。这意味着在第一种情况下,每次设备唤醒(每500ms唤醒一次),它将消耗约752uA,在第二种情况下,每次设备唤醒(2500ms),它将消耗约1199 ua,更清楚地说,在第二种情况下,设备将消耗更多,但它将唤醒更少的次数。所以这是一个必须考虑的权衡。

由于MT_dialog

daniel59
离线
最后看到:1年8个月前
加入:2016-01-08 04:34
嗨MT_dialog,

嗨MT_dialog,

现在我将最小连接间隔设置为1秒,最大连接间隔设置为2秒。

我发现如果我把代码放在唤醒定时器回调中,DA14580会死。如果我把代码放在easy wakeup回调中,它也不能工作。

我的想法是:在唤醒定时器回调中,无论连接间隔有多长,代码都会延迟唤醒过程,所以它是死的。
但在易唤醒回调中,如果芯片正确唤醒,并且间隔足够长,代码可以运行,则可以工作。

但DA14580也死了。为什么?所以也许我需要增加睡眠间隔?

daniel59
离线
最后看到:1年8个月前
加入:2016-01-08 04:34
嗨MT_dialog,

嗨MT_dialog,

我的问题有什么原因吗?

期待您的回复!

谢谢,
丹尼尔

MT_dialog
离线
最后看到:5个月2周前
工作人员
加入:2015-06-08 34
嗨daniel59,

嗨daniel59,

然而在第二个,间隔的增加不会解决你的问题,我忽略了这个事实,因为你有一个连接,你也由一个外部中断醒来有外部中断的可能性可能发生在连接事件之前,理论上如果事务是足够小的,不应该影响自设备的连接会使传感器事务和服务通过调用rwip_schedule BLE事件函数。现在,在您的情况下,显然事务相当长,如果它发生在连接事件之前,rwip_schedule()(调度消息的函数)将不会被调用(因为传感器事务正在进行),因此您将错过事件,这可能会导致断开连接。正如前面的文章中提到的,您可以尝试在app_easy_message被触发时设置一个标志,而不是在处理程序中进行交互。在主循环中(使用我提到的app_on_system_powered的回调函数),您可以检查该标志,并在每个较小的事务顺序中以KEEP_POWERED返回传感器交互,以强制rwip_schedule()函数运行调度器并为任何即将到来的事件提供服务。

由于MT_dialog

daniel59
离线
最后看到:1年8个月前
加入:2016-01-08 04:34
嗨MT_dialog,

嗨MT_dialog,

所以你的意思是我设置了一个名为samplefull的标志,当传感器使中断时,我在唤醒回调中将标志设置为true,并在app_on_system_powered中编写代码

user_on_system_powered ()
如果samplefull = = true

阅读所有示例
做某事

回去睡觉

我不能一次读取所有的样本,如果200个样本造成中断,我必须一次读取20个样本,并且读取10次,否则芯片就会出错?

所以我必须这样写:

user_on_system_powered ()
如果samplenumber > 0

阅读20个样本
samplenumber-20
做某事
返回保持动力

其他的
回去睡觉

我在一个空白模板项目中尝试了之前提到的简单代码。

arch_main_loop_callback_ret_t user_on_system_powered(空白)

+ +;
返回GOTO_SLEEP;

arch_main_loop_callback_ret_t user_on_ble_powered(空白)

b + +;
返回GOTO_SLEEP;

空白user_resume_from_sleep(空白)

c++;

并发现,在连接之前,每次a增加9,b增加8,c增加1。连接后,a每增加5,b增加4,c增加1。为什么?

MT_dialog
离线
最后看到:5个月2周前
工作人员
加入:2015-06-08 34
嗨daniel59。

嗨daniel59。

我的意思是在你在app_easy_wakeup_set()设置的回调中设置一个标志,这将表明你已经准备好从传感器接收数据,并在app_on_system_powered中进行检查,检查该标志,如果它为真,它开始与传感器的交互。不要一次性进行外围设备交互,因为如果您在app_on_system_powered中保留580,那么当连接事件发生时,您将执行从传感器获取数据的代码,并且您将一直这样做,直到交互结束,这将导致不执行rwip_schedule。因此,将交互放在app_on_system_powered中,并将其放在小块数据中,正如您在文章中提到的那样。所以是的,如果你有一个200数据的事务,每个事务20个数据,每个事务从app_on_system_powered()返回KEEP_POWERED之后,app_on_ble_powered()再次运行,并调度消息(如果有的话)。

对于您的实验,每个函数的调用取决于设备的状态和事件。这些功能尤其是app_on_ble_powered和app_on_system_powered运行不止一次在每个醒来(只要设备是活跃BLE事件),同样的事实app_on_system_powered + 1比app_on_ble_powered运行时间,运行它,因为第一个运行只要祝福核心是活跃的,它需要一些时间为核心的活跃,为user_resume_from_sleep()只运行一次就醒来。如果您想知道为什么在每个广告事件上有更多的交互,而不是连接事件,那是因为广告事件比连接事件持续的时间更长。

由于MT_dialog

daniel59
离线
最后看到:1年8个月前
加入:2016-01-08 04:34
嗨MT_dialog,

嗨MT_dialog,

谢谢你的回答,芯片现在工作正常了。我把所有的操作与传感器到动力回调。我要测试它是否处于稳定状态。

还有一个问题,你说间隔的增加并不能解决我的问题,你还说连接间隔对于这种活动来说太小了,所以你错过了连接事件。那么增加间隔有什么帮助呢?降低消费?

问候,
丹尼尔

MT_dialog
离线
最后看到:5个月2周前
工作人员
加入:2015-06-08 34
嗨daniel59,

嗨daniel59,

一开始我对你的实现感到困惑,我提到要增加连接间隔(我认为你在每个连接间隔中都与传感器交互,并且与传感器的交互将花费太多时间,直到下一个连接间隔)。关于连接间隔的长度,这取决于您希望实现的应用程序。更短的连接间隔意味着你将更频繁地唤醒以传输,因此你将消耗更多的电力,但你将能够更快地发送更多的数据,如果你对保存那么多数据不感兴趣,并且连接间隔很短,没有理由经常唤醒设备,因为没有数据交换,因此没有理由经常唤醒设备。正如在之前的文章中提到的,是的,作为一般规则,人们可以有更长的连接间隔来节省更多的电力,但这同样取决于应用程序,在这方面有一个权衡。

由于MT_dialog

daniel59
离线
最后看到:1年8个月前
加入:2016-01-08 04:34
嗨MT_dialog,

嗨MT_dialog,

我测试了3天的代码,有时它也会死机。死的意思是再也找不到它了,而不是和我的手机断了。我不知道为什么。

现在我改变了主意,当触发唤醒定时器回调,我唤醒核心,做所有的事情与传感器在容易唤醒回调,然后去睡觉。

这种方式与使用system_powered的方式消耗相同吗?因为在与传感器交互时,我必须使用system_powered来保持为核心供电?

最好的问候,
丹尼尔

MT_dialog
离线
最后看到:5个月2周前
工作人员
加入:2015-06-08 34
嗨daniel59,

嗨daniel59,

我不太明白情况,你提到的设备死机的意思是没有断开连接,但无法找到(我想你的意思是广告),设备连接时,它也是广告?

关于第二个问题,如果我错了请纠正我,但是,我认为这是我们在以前的文章中处理的情况,我提到过在块中进行所有传感器交互,而不是在唤醒回调中进行所有交互。关于GATT错误,你得到的十进制133不是一个有效的GATT错误代码,如果你提到这到底发生在哪里,在断开连接回调会有帮助?你提到的错误是断开的原因吗?

我不认为这会对你的功耗有任何重大影响,因为在这两种情况下,你都是保持580活着,以便从传感器读取,也许当保持设备活着时,读取块的方法会让设备清醒一点,但我不认为功耗会那么显著。

由于MT_dialog

daniel59
离线
最后看到:1年8个月前
加入:2016-01-08 04:34
嗨MT_dialog,

嗨MT_dialog,

因为Android没有像Lightblue这样的工具,所以我使用nrf连接器来测试我的芯片。

下载代码后,我扫描芯片,连接它,切换通知并查看结果。

过了一段时间,它断开了,再也找不到,按钮功能也不能工作了,所以我认为芯片死了。

错误码来自nrf连接器。

最好的问候,
丹尼尔

MT_dialog
离线
最后看到:5个月2周前
工作人员
加入:2015-06-08 34
嗨daniel59,

嗨daniel59,

我很抱歉,但我很困惑,你提到你放弃了我建议的方式,以便如何获取数据,当app_easy_wakeup被触发时,你执行整个数据事务(这导致从第一次设备由于我上面提到的原因而停滞)。由于连接和通知的数据,这意味着设备卡在代码的某处,由于断言,你将不得不调试,以检查设备到底在哪里停滞。

由于MT_dialog

daniel59
离线
最后看到:1年8个月前
加入:2016-01-08 04:34
嗨MT_dialog,

嗨MT_dialog,

我尝试了3种方法,

1.与传感器交互并在轻松唤醒回调中读取数据,而不需要disable_sleep_mode(),当蜂鸣器打开时只需要disable_sleep_mode()。
2.通过disable_sleep_mode()与传感器交互并在轻松唤醒回调中读取数据。
3.与传感器交互并在user_on_system_powered()中读取数据,仅在易唤醒回调中读取传感器状态和设置标志,并在蜂鸣器打开时使用disable_sleep_mode()。

他们都失败了。

虽然我把代码放在容易唤醒回调,uvision不会触发断言,所以我不能找到哪里出错了。

最好的问候,
丹尼尔

MT_dialog
离线
最后看到:5个月2周前
工作人员
加入:2015-06-08 34
嗨daniel59,

嗨daniel59,

我很抱歉,但是根据你提供的信息,我无法找出设备的故障位置,你必须在不同的情况下进行测试,以便给我更多的线索来找出可能出现的问题。如果你在设备从user_on_system_powered()唤醒时读取传感器,并且你返回KEEP_POWERED以便设备在读取时保持清醒,那么我不认为你错过了任何BLE事件。如果在调试模式下,设备没有死机,那么你可以让设备在没有休眠模式下运行,当这个问题发生时,连接调试器并按照下面解释的方法检查设备死机的位置:

1)搜索项目的所有文件“SetBits16(SYS_CTRL_REG, DEBUGGER_ENABLE, 0);”并在所有地方注释它。//如果您正在使用SDK5,这应该已经完成
2)创建xxx的副本。Uvprojx,命名为xxx_attachment . Uvprojx
3)运行附加项目并进入项目选项
4)在调试选项卡上禁用“启动时加载应用程序”复选框,并删除到初始化文件的链接
5)单击调试器的“设置”按钮,关闭“连接后重置”复选框
6)单击“确定”,再次单击“确定”关闭项目选项
7)返回到原来的项目和编译你的代码,因为你总是这样做
8)连接调试器下载代码(内存)
9)分离调试器开始执行代码

------------------------- 运行代码,一旦问题发生 ------------------

10)在不下载代码的情况下再次附加(热附加),请转到附加项目并启动调试器。如果cpu处于断点,那么您可以找到已经停止的代码行。

由于MT_dialog

daniel59
离线
最后看到:1年8个月前
加入:2016-01-08 04:34
嗨MT_dialog,

嗨MT_dialog,

我尝试了你提到的方法,(找不到任何“SetBits16(SYS_CTRL_REG, DEBUGGER_ENABLE, 0);”,但找到“SetBits16(SYS_CTRL_REG, DEBUGGER_ENABLE, 1);”)复制项目文件,修改选项,并首先启动调试会话,并在xxx.uvprojx中运行代码。然后等待芯片出错,然后运行xxx_attach。Uvprojx和启动调试会话。

但是它显示了一个错误。日志如下:

加载“F:\\Dialog\\5.0.4\\projects\\target_apps\\template\\v2 - ledwake\\Keil_5\\out_580\\empty_peripheral_template_580.axf”
将JLink项目文件设置为“F:\Dialog\5.0.4\projects\target_apps\template\v2 - ledwake\Keil_5\JLinkSettings.ini”
* JLink信息:设备“CORTEX-M0”选中。

JLink信息:
------------
DLL: V5.12e,已编译Apr 29 2016 15:03:58
固件:J-Link ARM-OB STM32编译Aug 22 2012 19:52:04
硬件:V7.00
S/ n: 20090928
功能:RDI,FlashDL,FlashBP,JFlash,GDBFull

* JLink信息:发现ID为0x0BB11477的SWD-DP
* JLink信息:发现皮质- m0 r0p0,小端。
* JLink信息:FPUnit: 4代码(BP)槽和0文字槽
* JLink信息:CoreSight组件:
* JLink信息:ROMTbl 0 @ E00FF000
* JLink信息:ROMTbl 0 [0]: FFF0F000, CID: B105E00D, PID: 000BB008 SCS
* JLink信息:ROMTbl 0 [1]: FFF02000, CID: B105E00D, PID: 000BB00A DWT
* JLink信息:ROMTbl 0 [2]: FFF03000, CID: B105E00D, PID: 000BB00B FPB
ROMTableAddr = 0xE00FF000

目标信息:
------------
设备:ARMCM0
VTarget = 3.300V
引脚状态:
Tck: 0, tdi: 0, tdo: 1, tms: 0, tres: 1, trst: 0
Hardware-Breakpoints: 4
Software-Breakpoints: 8192
监测点:2
JTAG速度:4000 kHz

没有找到算法:20000000H - 2000009FH
20000160H - 20000323H没有算法
没有找到:20000340H - 200003E3H的算法
没有找到用于:20000440H - 20005803H的算法
抹去了!
错误:Flash下载失败- "Cortex-M0"
Flash加载在15:40:09结束

最好的问候,
丹尼尔

MT_dialog
离线
最后看到:5个月2周前
工作人员
加入:2015-06-08 34
嗨daniel59,

嗨daniel59,

我在上面的说明中提到过,如果你使用的是最新的SDK SetBits16(SYS_CTRL_REG, DEBUGGER_ENABLE, 0);当设备进入睡眠状态时,SDK5.0.4不会禁用调试器模块(旧版本的SDK会禁用)。关于你看到的错误,是因为你没有在Keil中指定,你将在“目标选项”中的“实用工具选项卡”中“使用外部工具进行Flash编程”。

由于MT_dialog