app_easy_wakeup和app_easy_wakeup_set如何运作?

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程//www.xmece.com/support.我们将在未来几天修复bug /优化搜索和标记。
29帖子/ 0新
最后发表
丹尼尔59.
离线
最后一次露面:1年7个月前
加入:2016-01-08 04:34
app_easy_wakeup和app_easy_wakeup_set如何运作?

我在SmartTag和SleepMode源代码中发现了这个功能,但不能在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.

丹尼尔59.
离线
最后一次露面: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_polarity(gpio_button_port,gpio_button_pin,wkupct_pin_polarity_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_polarity(gpio_button_port,gpio_button_pin,wkupct_pin_polarity_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_polarity(gpio_button_port,gpio_button_pin,wkupct_pin_polarity_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.

丹尼尔59.
离线
最后一次露面: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回调或简单的唤醒回调中?

什么代码应该在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_WAKESUP_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.

丹尼尔59.
离线
最后一次露面: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(void)
{
A ++;
返回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
离线
最后一次露面:3年11个月前
加入:2017-01-11 05:59
您应该重新配置GPIO

你应该重新配置与Led和蜂鸣器相关的gpio引脚,在你的唤醒句柄,因为所有的配置引脚已经丢失从睡眠模式醒来。
像这样
if(getBits16(sys_stat_reg,per_is_down))
periph_init();

丹尼尔59.
离线
最后一次露面: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秒,当在睡眠模式时,别针保留了它们的状态,所以在睡觉时没有问题,问题是当设备醒来时。在每个唤醒中都会调用Periph_init(),以便配置应用程序使用的引脚,因此当Periph_Init()执行引脚时,还可以重新配置,以及其状态。为了克服您必须存储PIN(活动,非活动)的值,并且在每个唤醒中根据所存储的状态配置PERIPH_INIT()函数中的引脚状态。

谢谢mt_dialog.

丹尼尔59.
离线
最后一次露面: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),

///在BLE双槽(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.

丹尼尔59.
离线
最后一次露面: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之间的间隔与user_connection_param_conf中的间隔之间有什么区别?他们是同样的吗?如何使用app_easy_gap_dev_configure()使用user_gapm_conf?

在训练04中,它表示,使用RCX20,只有在广告时连接或在无限时间内只能计算2秒,这意味着连接间隔必须小于2秒钟吗?

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

谢谢,
丹尼尔

mt_dialog.
离线
最后一次露面:4个月2天前
工作人员
加入:2015-06-08 11:34
嗨daniel59,

嗨daniel59,

你的意思是,如果您将要将回调放在哪个文件中放置app_easy_wakeup_set()?不,没关系。关于你应该放在上面提到的代码的位置,这取决于事务的长度,如果事务让MCU占用了很长时间,它在代码的情况下无关紧要,它将毁掉你的连接,因为你占据了MCU很长一段时间(这是你应该考虑在较小的碎片中打破交易的情况),如果将代码放在唤醒定时器中,回调将影响系统的醒来,因为与传感器的互动将与传感器进行间隔会影响系统唤醒过程,在App_easy方法中,设备将通过消息同步地开始事务,并且唤醒过程将是可以的,但是,如果过程足够长并延迟从服务延迟设备连接间隔,则可以松开联系。

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

如上所述,是的,您可以向中央发送请求,如果它要接受外围设备所示的参数,以及SDK将需要一些时间以发送请求(约10秒)。

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

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

谢谢mt_dialog.

丹尼尔59.
离线
最后一次露面:1年7个月前
加入:2016-01-08 04:34
嗨mt_dialog,

嗨mt_dialog,

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

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

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

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

丹尼尔59.
离线
最后一次露面: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.

丹尼尔59.
离线
最后一次露面: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(void)
{
A ++;
返回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运行的事实也比app_on_ble_powered运行更多的时间,它是因为第一个只要BLE核心处于活动状态,核心需要一段时间即可运行,对于user_resume_from_sleep(),它只能在唤醒时立即运行一次。如果您想知道为什么每个广告活动中有更多的交互而不是连接事件是因为广告活动持续时间长于连接事件。

谢谢mt_dialog.

丹尼尔59.
离线
最后一次露面: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.

丹尼尔59.
离线
最后一次露面: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.

丹尼尔59.
离线
最后一次露面: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时执行数据并在第一次引起的设备引起的时我提到的原因)。由于连接并通知数据时意味着设备在代码中的某个位置被粘在代码中,因此您必须调试才能检查设备困扰的位置。

谢谢mt_dialog.

丹尼尔59.
离线
最后一次露面:1年7个月前
加入:2016-01-08 04:34
嗨mt_dialog,

嗨mt_dialog,

我试了三种方法,

1.无需disable_sleep_mode(),只需在蜂鸣器打开时disable_sleep_mode()与传感器交互并在轻松的唤醒回调中读取数据。
2.与传感器交互,并使用禁用唤醒呼叫中的读取数据删除→sleep_mode()。
3.与传感器和读取数据相互作用,在user_on_system_powered()中读取数据,只读取传感器状态并在Easy Wakeup回调中设置标志,并在蜂​​鸣器打开时使用disable_sleep_mode()。

他们都失败了。

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

最好的问候,
丹尼尔

mt_dialog.
离线
最后一次露面:4个月2天前
工作人员
加入:2015-06-08 11:34
嗨daniel59,

嗨daniel59,

对不起,但是,通过您提供的信息,我无法弄清楚设备摊位的位置,您必须在不同的情况下测试这一点,以便给我更多的线索来弄清楚什么可能出错。如果在设备从User_on_System_Powered()唤醒时读取传感器,并且您返回Keep_Power后,才能让设备在阅读时保持清醒,然后我不认为您错过了任何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.

丹尼尔59.
离线
最后一次露面: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.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 INFO:选择“Cortex-M0”所选的。

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信息:romtbl 0 [1]:fff02000,cid:b105e00d,pid:000bb00a dwt
* jlink信息:romtbl 0 [2]:fff03000,cid:b105e00d,pid:000bb00b fpb
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 kHz

没有找到:20000000H - 2000009FH的算法
没有找到:20000160H - 20000323H的算法
没有找到算法:20000340H - 200003E3H
没有找到算法:20000440H - 20005803H
擦除跳过!
错误:Flash下载失败 - “Cortex-M0”
闪存负荷在15:40:09完成

最好的问候,
丹尼尔

mt_dialog.
离线
最后一次露面:4个月2天前
工作人员
加入:2015-06-08 11:34
嗨daniel59,

嗨daniel59,

如果您使用的是使用最新的SDK16(sys_ctrl_reg,debugger_enable,0),则在上面提到的方向上提到。完成后,SDK5.0.4当设备睡眠时不会禁用调试器模块(SDK的旧版本)。关于您所看到的错误是因为您尚未在Keil中指定,您将在“目标选项”中的“实用程序”选项卡中“使用Flash编程”中的“使用外部工具”。

谢谢mt_dialog.