app_easy_wakeup和app_easy_wakeup_set是如何工作的?

⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.xmece.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
29个员额/ 0个新员额
最后发表
daniel59
离线
最后看到:1年8个月前
加入:2016-01-08 04:34
app_easy_wakeup和app_easy_wakeup_set是如何工作的?

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

设备:
MT_dialog
离线
最后看到:5个月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年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), //选择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), //选择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), //选择pin (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN)
wkupct_pin_极性(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, WKUPCT_PIN_POLARITY_LOW), //极性低
1, // 1事件
40);//恢复时间= 0

静态void app_button_press_cb(void)

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()只是app_easy_wakeup_set()之后;

而且你意味着我必须在app_easy_wakeup之前修改睡眠模式?或者我可以在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中唤醒并实现你的代码(如何使用那些回调,你可以在UM-B-051 - da1458x软件平台参考v1.0.pdf中找到更多信息在7.2节)。

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

通常wkupct回调的initilalization外设(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年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水印中断是否连接或不连接,拉出所有FIFO数据并计算步骤数,如果步数大于100,则打开蜂鸣器和LED,需要核心禁用睡眠模式。

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

slp_period_retained = 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年3个星期前
加入:2017-01-11 05:59
您应该重新配置gpio

你应该在你的唤醒手柄中重新配置与Led和蜂鸣器相关的gpio管脚,因为当wkup从睡眠模式时,所有的管脚配置已经丢失。
像这样
如果(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秒,当处于睡眠模式时,引脚保持其状态,所以在进入睡眠状态时没有问题,问题是设备醒来时。为了配置应用程序使用的引脚,在每次唤醒时都会调用peripher_init(),因此当peripher_init()执行时,会重新配置引脚及其状态。为了克服这个问题,您必须存储引脚的值(活动的,不活动的),并在每次唤醒时根据您所存储的状态在peripher_init()函数中配置引脚的状态。

由于MT_dialog

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

嗨MT_dialog,

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

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

下面是代码吗?
Static const struct connection_param_configuration 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,

//监控超时(10毫秒)
///使用宏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和蜂鸣器可以在扩展睡眠模式下工作,但我必须在peripher_init()中设置状态?

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

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

嗨daniel59,

关于你把代码放在哪里是否重要,我认为你指的是与外部传感器接口的代码,正如我上面提到的,它取决于设备的状态(连接,广告)和代码执行所需的时间,如果它花费的时间足够长,您可能会错过连接间隔和与外围设备的连接松散。

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

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

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

是的,睡眠模式可以节省电力,设备会在睡眠和醒来安排连接的间隔,对于periph_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()?

在training 04中,它说使用RCX20,它只能在连接时计数2秒,或者在无限的广告时间,这是否意味着连接间隔必须小于2秒?

而在SmartTag参考表10中,可以看出2500 ms间隔比500 ms间隔使用更多的功率,原因是:对于更长的间隔,射频接收机必须
活跃较长的时间来检测从主人轮询。它与你所说的不同。它是连接功耗吗?

谢谢,
丹尼尔

MT_dialog
离线
最后看到:5个月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年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

阅读所有样本
做某事

返回goto睡眠

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

所以我必须这样写:

user_on_system_powered ()
如果samplenumber > 0

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

其他的
返回goto睡眠

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

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 ++;

并且发现,在连接之前,每次增加9,B增加8和C增加1.连接后,每次增加5,B增加4和C增加1.为什么?

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

嗨daniel59。

我的意思是您在app_easy_wakeup_set()设置的回调中设置了一个标志,该标志将指示您有准备从传感器接收的数据,并在app_on_system_powered中查看检查该标志,如果它的真实,它开始与传感器的交互。不要一次性地进行外围内容,因为如果将580保留在app_on_system_powered中,那么当连接事件点击时,您将执行从传感器获取数据的代码,直到您的互动结束,并且会导致这样做在不执行RWIP_Schedule。因此,在App_on_system_power中互动,并在您的帖子中提到的数据中的小块数据中。因此,如果您有200个数据事务,请在每个事务返回的每个事务返回的20个数据中,从App_oN_System_Powered()返回10个数据,以便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,

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

由于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,

我不完全理解情况,你提到的设备去死的意思是没有断开连接,但无法找到(我想你的意思是广告),设备连接时,它也是广告?

关于第二个问题,如果我错了,纠正了我,但我是我们在上一篇文章中处理的情况,我提到的是在块中完成所有传感器交互,而不是在唤醒回调中进行所有交互。关于您在十进制中获得133的GATT错误不是有效的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,

我试了三种方法,

1.与传感器交互并在易于捕获的唤醒回调中读取数据,而无禁用_sleep_mode(),只有蜂鸣器打开时禁用_sleep_mode()。
2.使用disable_sleep_mode()与传感器交互并在简单的唤醒回调中读取数据。
3.与传感器交互并读取user_on_system_powered()中的数据,只读取传感器状态并在easy wakeup callback中设置标志,并在蜂鸣器打开时使用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_attach.uvprojx命名为xxx_attach.uvprojx
3)运行附加项目,转到项目选项
4)在“调试”页签禁用“启动时加载应用程序”复选框,并擦除到初始化文件的链接
5)单击调试器的设置按钮,禁用“连接后重启”复选框
6)单击“确定”,再次单击“确定”,关闭项目选项
7)回到原来的项目,编译你的代码,就像你总是做的
附加调试器以下载代码(在RAM中)
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:\\对话框\\ 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信息:设备“CORTEX-M0”被选中。

JLink信息:
------------
DLL: V5.12e,编译Apr 29 2016 15:03:58
固件:J-Link ARM-OB STM32编译2012年8月22日19:52:04
硬件:V7.00
S / N: 20090928
功能:RDI,Flashdl,FlashBP,JFLASH,GDBFULL

* JLink Info: Found SWD-DP with ID 0x0BB11477
* JLink Info: Found Cortex-M0 r0p0, Little endian。
* JLink Info: FPUnit: 4代码(BP)槽和0文字槽
* JLink信息:CoreSight组件:
* JLink Info: 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 FPB
ROMTableAddr = 0 xe00ff000

目标信息:
------------
设备: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"
闪电加载在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