app_easy_wakeup和app_easy_wakeup_set是如何工作的?

⚠️
大家好. .谢谢你来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,包含在主对话网站中。所有岗位和账户都已迁移。我们现在只接受新论坛的流量-请在上面发布任何新帖子//www.xmece.com/support.我们将在未来几天修复bug /优化搜索和标记。
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 11: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);// debouncing time = 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);// debouncing time = 0

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

MT_dialog
离线
最后看到:4个月2周之前
工作人员
加入:2015-06-08 11: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);// debouncing time = 0

静态void app_button_press_cb(void)

如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN))

periph_init();

if(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_WAKEUP_CB()函数并打开// LED,请立即调用APP_EASY_WAKEUP()按顺序调用APP_EASY_WAKEUP()

由于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之前修改睡眠模式?或者我可以在Easy Wakeup回调中修改睡眠模式吗?

我的代码不要向下打击,所以我可以直接使用app_easy_wakeup而没有if(arch_ble_ext_wakeup_get())?

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

什么代码应该在WKUPCT回调中,什么代码应该在Easy Wakeb回调中?

谢谢,
丹尼尔

MT_dialog
离线
最后看到:4个月2周之前
工作人员
加入:2015-06-08 11: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(如何使用这些回调时,您可以在7.2节中找到更多信息在7.2节中的UM-B-051 - DA1458X软件平台参考V1.0.pdf。

对于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年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(空白)

b + +;
返回goto_sleep;

void user_resume_from_sleep(void)

C ++;

发现a b c在没有点击唤醒计时器的情况下会增加。

我想做的是唤醒唤醒定时器与SPI传感器FIFO水印中断是否连接或不连接,拉出所有FIFO数据并计算步骤数,如果步数大于100,则打开蜂鸣器和LED,需要核心禁用睡眠模式。

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

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年1周前
加入:2017-01-11 05:59
您应该重新配置GPIO

你应该重新配置与Led和蜂鸣器相关的gpio引脚,在你的唤醒句柄,因为所有的配置引脚已经丢失从睡眠模式醒来。
像这样
如果(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 11:34
嗨daniel59,

嗨daniel59,

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

在第二种情况下,通过使用app_easy_wakeup()触发您的代码,本质上您是在发送一条消息,并且您不会干扰连接事件和活动BLE过程,但是很明显,你花在与传感器交互读取数据上的时间相当大,或者你的连接间隔对于这种活动来说太小,所以你错过了连接事件,因此设备认为连接丢失了。要么试着独立传感器交互小块(读取数据在更小的部分),580年将能够服务于传感器交互和BLE事件或增加一点的连接超时间隔和延迟设备连接,这样有更多的时间与传感器交互连接的时间间隔occurs, so that your device has more tollerance in missing events in case that helps.

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

由于MT_dialog

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

嗨mt_dialog,

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

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

下面是代码吗?
static 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),

///在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和蜂鸣器可以在扩展的睡眠模式下工作,但我必须在periph_init()中设置状态?

如果我的产品需要一直连接,可以睡眠模式保存电源?因为我发现连接后,通常被调用Periph_init(),这意味着通常会醒来的话。

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

嗨daniel59,

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

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

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

如上所述,LED可以起作用,因为在设备处于休眠模式时PIN保留其状态,您只需要记住引脚的状态并因此在PERIPH_INIT()中设置它,因为唤醒PERIPH_INIT()执行并且销钉是重新配置的。关于蜂鸣器我认为提供PWM,定时器在睡眠模式下关闭,因此PWM,因此在设备处于睡眠模式时,您不会产生PWM以驱动蜂鸣器。

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

由于MT_dialog

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

嗨mt_dialog,

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

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

那么在我的应用程序中,需要一直连接DA14580,核心按连接间隔进行休眠和唤醒?

我发现Android没有api来改变连接间隔,所以我可以在user_on_connection中使用app_easy_gap_param_update_start来更新连接参数到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中,它显示2500ms的间隔比500ms的间隔使用更多的功率,原因是:对于更长的间隔,射频接收器必须
活跃较长的时间来检测从主人轮询。它与你所说的不同。它是连接功耗吗?

谢谢,
丹尼尔

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

嗨daniel59,

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

是的,根据广告或连接间隔的睡眠,SDK保理。

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

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

在上一篇文章中,我提到了一个可以遵循的一般规则,这不是每个设计的情况,并且智能标签上提到的功耗是每个唤醒中的功耗。这意味着在第一种情况下,每次设备将唤醒(并唤醒每500ms时),它将消耗大约752ua,并且每次设备将唤醒(2500ms)它将消耗大约1199在第二种情况下更清晰,该设备将消耗更多,但它将醒来减少次数。因此,这是一个必须考虑的权衡。

由于MT_dialog

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

嗨mt_dialog,

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

而且我找到了我把代码放在唤醒定时器回调中,da14580去死了。如果我把代码放在易于唤醒回调中,它也无法工作。

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

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

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

嗨mt_dialog,

有关我的问题的原因吗?

期待您的回音!

谢谢,
丹尼尔

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

嗨daniel59,

虽然,间隔的增加不会解决您的问题,但我忽略了这个事实,因为你有一个连接而你也唤醒了外部中断,就可以在连接事件之前发生外部中断可能会发生外部中断,从理论上,如果事务足够小,因为设备将有时间使传感器事务进行时间,通过调用RWIP_Schedule函数来实现传感器事务并提供BLE事件的时间。现在,在您的情况下,如果发生在连接事件之前的RWIP_Schedule()(调度邮件的函数)之前,则会发生交易,则会被调用(从传感器事务正在进行)之前发生(因此正在进行)可能会导致断开连接。您可以尝试的是,正如以前的帖子中提到的是在触发APP_EASY_MESSAGE时设置标志,而不是在处理程序中具有交互。在主循环中(使用回调函数我提到app_on_system_powered),您可以检查该标志并在块中具有传感器交互,并在每个较小的事务顺序中返回keep_powered以强制RWIP_Schedule()函数运行调度程序并提供任何越来越多的事件。

由于MT_dialog

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

嗨mt_dialog,

因此,您意味着我设置了一个名为samplefull的标志,当传感器使中断时,我将标志设置为唤醒回调,并在app_on_system_power中写下代码

user_on_system_powered()
如果样本== 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;

void user_resume_from_sleep(void)

C ++;

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

MT_dialog
离线
最后看到:4个月2周之前
工作人员
加入:2015-06-08 11: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年7个月前
加入:2016-01-08 04:34
嗨mt_dialog,

嗨mt_dialog,

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

还有一个问题,你说的时间间隔不会解决我的问题,而且你也是该活动对于这种活动来说太小了,所以你错过了连接事件。所以增加间隔做什么帮助?降低消耗?

问候,
丹尼尔

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

嗨daniel59,

在开始时,我对您的实现感到困惑,我提到的是增加连接间隔(虽然你在每个连接间隔唤醒中与传感器交互的情况下,与传感器的交互将花费太多时间直到下一个连接间隔。)。关于连接间隔的长度,这取决于您想要实现的应用程序。更短的连接间隔意味着您将更频繁地唤醒以便传输,因此您将消耗更多的电源,但如果您对SALINCING这么多的数据并具有短连接间隔,您将能够更快地发送更多的数据和更快。,没有理由唤醒,因为没有数据无法交换,因此没有理由唤醒设备经常唤醒设备。如前所述,作为一般规则,一个可以具有更长的连接间隔来节省更多的电源,但是再次取决于应用程序,并且还有一个权衡。

由于MT_dialog

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

嗨mt_dialog,

我测试代码3天,有时它也会死机。死亡意味着再也找不到它,而不是与我的手机断开连接。我不知道为什么。

现在我改变了主意,当触发唤醒定时器回调时,我唤醒了核心,在易于唤醒回调中使用传感器进行所有的东西,然后睡觉。

这种方式是否有相同的消费使用system_powered之一?因为我必须在与传感器交互时使用system_powered保持供电核心?

最好的问候,
丹尼尔

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

嗨daniel59,

我没有完全搞清楚,你提到的是那些没有从手机断开连接但无法找到的设备的死亡含义(我想你的意思是通告),设备连接它是广告的?

关于第二个问题,如果我错了,纠正了我,但我是我们在上一篇文章中处理的情况,我提到的是在块中完成所有传感器交互,而不是在唤醒回调中进行所有交互。关于您在十进制中获得133的GATT错误不是有效的GATT错误代码,如果您提到究竟发生的情况下,请在断开回调中有帮助?您提到的错误是断开连接原因?

我不认为会有任何显著影响能耗自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 11:34
嗨daniel59,

嗨daniel59,

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

由于MT_dialog

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

嗨mt_dialog,

我试了三种方法,

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

他们都失败了。

而当我把代码放在容易唤醒回调,uvision不会触发断言,所以我找不到哪里出了问题。

最好的问候,
丹尼尔

MT_dialog
离线
最后看到:4个月2周之前
工作人员
加入:2015-06-08 11: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
3)运行附件项目并转到项目选项
4)在“调试”选项卡上禁用“启动应用程序”中的“加载”复选框并删除链接到初始化文件
5)单击调试器的“设置”按钮,然后在“连接”复选框后禁用复位
6)单击“确定”和“确定”再次关闭项目选项
7)返回原始项目并按照您的代码编译
安装调试器来下载代码(在RAM中)
9)分离调试器以启动代码的执行

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

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:\\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 Info: Device“CORTEX-M0”selected。

JLink信息:
------------
DLL:v5.12e,编译4月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信息:找到cortex-m0 r0p0,小endian。
* jlink信息:fpUnit:4代码(BP)插槽和0个字幕插槽
* JLink信息:corelight组件:
* JLink信息:ROMTbl 0 @ E00FF000
* JLink Info: 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
romtableddr = 0xe00ff000

目标信息:
------------
设备:ARMC0.
VTarget = 3.300 v
针的状态:
TCK:0,TDI:0,TDO:1,TMS:0,TRES:1,TRST:0
Hardware-Breakpoints: 4
Software-Breakpoints: 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 11:34
嗨daniel59,

嗨daniel59,

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

由于MT_dialog