app_easy_wakeup和app_easy_wakeup_set是如何工作的?

⚠️
大家好. .谢谢你来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,包含在主对话网站中。所有岗位和账户都已迁移。我们现在只接受新论坛的流量-请在上面发布任何新帖子https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
29个帖子/ 0个新帖子
最后一篇
daniel59
离线
最后看到:1年7个月前
加入:2016-01-08 04:34
app_easy_wakeup和app_easy_wakeup_set是如何工作的?

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

设备:
MT_dialog
离线
最后看到:4个月2周前
职员
加入:2015-06-08 34
嗨Daniel59,

嗨Daniel59,

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

由于MT_dialog

daniel59
离线
最后看到:1年7个月前
加入: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), //选择pin (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN)
wkupct_pin_polarization (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, wkupct_pin_polarization _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), //选择pin (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN)
wkupct_pin_polarization (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, wkupct_pin_polarization _low), //极性低
1,// 1事件
40);//调试时间= 0

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

MT_dialog
离线
最后看到:4个月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), //选择pin (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN)
wkupct_pin_polarization (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, wkupct_pin_polarization _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();//强制摇晃醒来
ARCH_BLE_EXT_WAKEUP_OFF();//禁用外部唤醒(如果您在进入永久睡眠之前设置了ARCH_BLE_EXT_WAKESUP_ON()函数)
app_easy_wakeup ();//在BLE醒来时调用app_easy_wakeup()以执行app_wakeup_cb()函数并打开//LED

由于MT_dialog

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

嗨MT_dialog,

但我发现,在SmartTag源代码中,App_easy_wakeup()只是app_easy_wakeup_set()之后;

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

我的代码没有关闭BLE,所以我可以直接使用app_easy_wakeup没有if (arch_ble_ext_wakeup_get())吗?

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

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

谢谢,
丹尼尔

MT_dialog
离线
最后看到:4个月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中实现你的代码(如何使用这些回调,你可以在UM-B-051 - da1458x软件平台参考v1.0.pdf中找到更多信息7.2节)。

对于arch_ble_ext_wakeup_get(),检查是为了验证用户是否已经调用了arch_ble_ext_wakeup_on(),如果你在睡觉之前不调用这个函数,你就不需要做检查。

通常,WKUPCT回调有外围设备的初始化(Periph_init()),迫使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年7个月前
加入: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(void)

b + +;
返回GOTO_SLEEP;

空白user_resume_from_sleep(空白)

c++;

并找到一个,B,C将增加,而不会击中定时器。

我想做的是支安打和SPI传感器FIFO水印中断唤醒定时器是否有幸获得连接,退出所有FIFO数据和计算步数,举个例子,如果一步数大于100开启蜂鸣器和领导,需要禁用睡眠模式的核心。

随着我在唤醒定时器回调中写下所有代码,它可以工作,但由于延长的睡眠模式,并且蜂鸣器无法工作,并且有时它将触发警告显示
if((development_debug)&&(use_power_optimizations))

slp_period_retated = slp_period;
//如果此断言命中,则LP ISR持续时间长于时间
//已通过LP_ISR_TIME_XTAL32_CYCLES和LP_ISR_TIME_USEC保留。
if(sleep_lp_cycles &&(sleep_lp_cycles ASSERT_WARNING (0);

我试图把所有的代码放入容易唤醒回调,它工作一样,但不会触发警告,但我发现我的手机断开与芯片。

如何编写代码?

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

您应该重新配置与LED和蜂鸣器相关的GPIO引脚,在唤醒句柄中,因为引脚的所有配置都在睡眠模式下WKUP时丢失。
像这样
如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN))
periph_init ();

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

嗨,克里斯,

是的,我重新配置了它们。但在睡眠模式下,LED恰到好处约0.5秒。

MT_dialog
离线
最后看到:4个月2周前
职员
加入:2015-06-08 34
嗨Daniel59,

嗨Daniel59,

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

在第二种情况下,通过使用app_easy_wakeup()触发代码,基本上您正在发送消息,并且您不会与连接事件和活动的BLE过程进行间隔,但显然您花费与传感器交互以读取数据的时间对于这种活动来说非常大或您的连接间隔太小,因此您错过了连接事件,因此设备考虑丢失的连接。尝试在较小的块中分离传感器交互(读取较小部分的数据),以便580将能够为传感器交互和BLE事件提供服务或增加连接间隔超时和连接的延迟,因此在发生连接间隔之前,设备在与传感器发生更多的时间内具有更多时间,以便在有助于的情况下,您的设备在缺失事件中具有更多的速度。

关于LED,它亮了大约0.5秒,当在睡眠模式下,引脚保持他们的状态,所以当要睡觉时没有问题,问题是当设备醒来。在每次唤醒时,都会调用peri_init()来配置应用程序使用的引脚,所以当peri_init()执行时,引脚会被重新配置和它们的状态。为了克服这一点,你将不得不存储pin的值(活动的,不活动的)和在每个唤醒配置pin的状态在外围init()函数根据你已经存储的状态。

由于MT_dialog

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

嗨MT_dialog,

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

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

下面是代码吗?
静态const struct connection_param_configuration user_connection_param_conf = {
///在BLE双槽(1.25ms)中测量的连接间隔最小值
///使用宏观MS_TO_DOUBLESLOTS从毫秒(MS)转换为双插槽
.intv_min = ms_to_doubleslots(10),

///连接间隔最大测量ble双插槽(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),

///最小连接事件持续时间(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和蜂鸣器可以在延长睡眠模式下工作,但我必须设置状态在外围init()?

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

MT_dialog
离线
最后看到:4个月2周前
职员
加入:2015-06-08 34
嗨Daniel59,

嗨Daniel59,

关于您提出代码的重要情况,我想你的意思是接口外部传感器的代码,因为我提到上面,它取决于设备的状态(连接,广告)以及您的代码需要多长时间执行,如果需要足够长,您可能缺少连接间隔和与您的外设有松散的连接。

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

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

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

是的,睡眠模式可以节省电力,设备会在睡眠和醒来安排连接的间隔,对于periph_init调用()和频率,如上所调用的每个连接间隔为了与中央,一般连接间隔的时间越长,你应该睡的时间越长(不考虑外部醒来),你睡得越多,你消耗的就越少。

由于MT_dialog

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

嗨MT_dialog,

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

以常规方式,代码应该是简单的唤醒回调?

所以在我的应用程序中,需要一直连接DA14580,核心通过连接间隔睡眠并唤醒?

我发现Android没有用于更改连接间隔的API,因此我可以使用App_easy_gap_param_update_start在user_on_connection中更新user_config.h中的user_connection_param_conf的连接参数吗?

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

在培训04,它说使用RCX20,它可以计数多达2秒只有当连接或在无限的时间,而广告,这意味着连接间隔必须小于2秒?

在SmartTag参考文献中,表10显示,2500 ms间隔使用比500 ms间隔更多的功率,原因是:对于更长的间隔,RF接收器必须是
活动时间较长,以检测从主轮询。和你说的不一样。是为了连接功耗吗?

谢谢,
丹尼尔

MT_dialog
离线
最后看到:4个月2周前
职员
加入:2015-06-08 34
嗨Daniel59,

嗨Daniel59,

你的意思是,如果在哪个文件中你要放置回调你要放置app_easy_wakeup_set()的重要性?不,没关系。至于你应该把你的代码放在哪里,如上所述,这取决于交易的长度,如果交易保持MCU占用了很长一段时间,这无关代码在哪里,它会毁了你的因为你占用单片机的连接很长一段时间(这是打破你的情况你应该考虑事务在小块),如果你把你的代码在唤醒定时器回调会影响系统的醒来因为你与传感器交互将interfiere唤醒过程,在app_easy方法中,设备将通过一条消息同步启动事务,这对于唤醒过程来说是可以的,但是同样,如果过程足够长并且延迟了设备从服务的连接间隔,你将会失去连接。

是的,SDK会根据广告或连接间隔(设备休眠)照顾用户。

正如上面提到的,是的,你可以向中心发送请求,如果它接受外设指示的参数,它取决于中心,而且SDK发送请求需要一些时间(大约10秒)。

否,BLE指定可以实现的最大连接间隔为4秒。

在之前的文章中,我提到了一个可以遵循的一般规则,但并非所有的设计都是如此,Smart Tag中提到的功耗是指每次唤醒时的功耗。这意味着,在第一种情况下每次设备会醒来,醒来每500 ms)它将消耗约752 ua和每次在第二种情况下,设备会醒来(2500毫秒),它将消耗约1199,更清楚在第二种情况下设备将消费更多,但醒来更少时间。所以这是一个必须考虑的权衡。

由于MT_dialog

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

嗨MT_dialog,

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

我发现如果我把代码放在唤醒定时器回调中,DA14580就会失效。如果我把代码放在容易唤醒回调,它也不能工作。

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

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

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

嗨MT_dialog,

我有什么问题吗?

期待您的回复!

谢谢,
丹尼尔

MT_dialog
离线
最后看到:4个月2周前
职员
加入:2015-06-08 34
嗨Daniel59,

嗨Daniel59,

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

由于MT_dialog

daniel59
离线
最后看到:1年7个月前
加入: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(void)

b + +;
返回GOTO_SLEEP;

空白user_resume_from_sleep(空白)

c++;

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

MT_dialog
离线
最后看到:4个月2周前
职员
加入:2015-06-08 34
嗨Daniel59。

嗨Daniel59。

在回调我的意思是,你在app_easy_wakeup_set组()设置一个标志,表明你有数据从传感器接收准备,和有一个检查的app_on_system_powered检查国旗,如果它真的,它开始与传感器的交互。不让外围interraction一下子因为如果你保持580年app_on_system_powered然后当连接事件打你将执行代码从传感器获得数据,你就会继续这样做,直到你的互动结束,这将导致不执行rwip_schedule。所以要在app_on_system_powered中进行交互,并像你在文章中提到的那样把它放在一小块数据中。因此,如果您有一个200个数据事务,那么就进行10个事务,每个事务包含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年7个月前
加入:2016-01-08 04:34
嗨MT_dialog,

嗨MT_dialog,

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

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

问候,
丹尼尔

MT_dialog
离线
最后看到:4个月2周前
职员
加入:2015-06-08 34
嗨Daniel59,

嗨Daniel59,

一开始我对你的实现感到困惑,那是我提到的增加连接间隔(我认为你在每个连接间隔中与传感器的交互会唤醒,与传感器的交互将花费太多的时间,直到下一个连接间隔)。关于连接间隔的长度,这取决于您想要实现的应用程序。短连接的间隔意味着你会醒来经常为了传输,因此您将消耗更多的权力,但你将能够发送更多的数据和速度,如果你不感兴趣的sed那么多数据和连接时间间隔较短,没有理由醒来,常常因为不会有数据交换,因此,没有理由经常唤醒设备。就像之前的文章中提到的那样,一个人可以有更长的连接间隔来节省更多的电力,但这同样取决于应用程序,这是一个权衡。

由于MT_dialog

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

嗨MT_dialog,

我测试代码3天,有时它也会死亡。死亡意味着它无法找到,没有从我的手机断开连接。我无法弄清楚为什么。

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

这种方式是否具有与使用system_powered的消耗量相同?因为在与传感器交互时,我必须使用System_Power保持电源的电源?

此致,
丹尼尔

MT_dialog
离线
最后看到:4个月2周前
职员
加入:2015-06-08 34
嗨Daniel59,

嗨Daniel59,

我不完全明白情况,你提到设备死机意味着没有断开电话,但不能找到(我想你的意思是广告),当它连接的设备是广告,以及?

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

我不认为这将对您的功耗产生任何重大影响,因为在这两种情况下,您在两种情况下都保持580才能从传感器中读取,或许在块中读取的同时保持设备的方法将保持设备唤醒更多,但我不认为功耗将是重要的。

由于MT_dialog

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

嗨MT_dialog,

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

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

一段时间后,它会断开连接,无法再找到,按钮功能不能再工作,所以我认为芯片已经死了。

错误代码来自NRF连接器。

此致,
丹尼尔

MT_dialog
离线
最后看到:4个月2周前
职员
加入:2015-06-08 34
嗨Daniel59,

嗨Daniel59,

对不起但我很困惑,你提到你放弃了,我建议为了如何获取数据和执行整个数据事务app_easy_wakeup触发时(从第一次设备造成失速的原因由于我上面提到的)。由于连接和通知的数据意味着设备卡在代码中的某个地方,由于ASSERTION,您将不得不进行调试,以检查设备确切的停顿位置。

由于MT_dialog

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

嗨MT_dialog,

我尝试了3种方式,

1.与传感器交互并在易于捕获的唤醒回调中读取数据,而无禁用_sleep_mode(),只有蜂鸣器打开时禁用_sleep_mode()。
2.与传感器交互并使用disable_sleep_mode()简单的唤醒回调读取数据。
3.在user_on_system_powered()中与传感器交互并读取数据,在简单的唤醒回调中仅读取传感器状态和set flag,并在蜂鸣器打开时使用disable_sleep_mode()。

他们都失败了。

虽然我把代码放在易于唤醒回调的时候,但UVISION不会触发断言,所以我找不到出错的地方。

此致,
丹尼尔

MT_dialog
离线
最后看到:4个月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_attach.uvprojx命名为xxx_attach.uvprojx
3)运行附加项目,进入项目选项
4)在调试选项卡禁用在启动时加载应用程序复选框,并删除到初始化文件的链接
5)点击调试器的设置按钮,禁用连接后重置复选框
6)单击“确定”和“确定”再次关闭项目选项
7)回到原来的项目,像往常一样编译你的代码
8)附加调试器下载代码(在RAM中)
分离调试器以启动代码的执行

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

10)在不下载代码(热连接)的情况下再次连接到附件并启动调试器。如果CPU处于断点,那么您可以找到已停止的代码行。

由于MT_dialog

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

嗨MT_dialog,

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

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

加载“f:\\对话框\\ 5.0.4 \\ projects \\ target_apps \\ template \\ v2 - leedwake \\ keil_5 \\ out_580 \\ extent_peripheral_template_580.axf”
设置JLink项目文件为“F:\Dialog\5.0.4\projects\target_apps\template\v2 - ledwake\Keil_5\JLinkSettings.ini”
* JLink Info: Device“CORTEX-M0”selected。

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 Info: Found Cortex-M0 r0p0, Little endian。
* JLink Info: FPUnit: 4 code (BP)插槽和0字面值插槽
* jlink信息:coresight组件:
* JLink信息:ROMTbl 0 @ E00FF000
* jlink信息:romtbl 0 [0]:fff0f000,cid:b105e00d,pid:000bb008 scs
* JLink Info: ROMTbl 0 [1]: FFF02000, CID: B105E00D, PID: 000BB00A DWT
* JLink Info: ROMTbl 0 [2]: FFF03000, CID: B105E00D, PID: 000BB00B fbb
ROMTableAddr = 0 xe00ff000

目标信息:
-------------
设备:ARMCM0
vtarget = 3.300V.
针的状态:
Tck: 0, tdi: 0, tdo: 1, tms: 0, tres: 1, trst: 0
硬件断点:4
软件断点:8192
观察点:2
JTAG速度:4000千赫

没有算法发现:20000000H - 2000009FH
没有找到算法:20000160H - 20000323H
没有找到算法:20000340H - 200003E3H
No Algorithm found for: 20000440H - 20005803H
抹去了!
错误:Flash下载失败- "Cortex-M0"
Flash Load在15:40:09结束

此致,
丹尼尔

MT_dialog
离线
最后看到:4个月2周前
职员
加入:2015-06-08 34
嗨Daniel59,

嗨Daniel59,

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

由于MT_dialog