关于UM-B-006的问题(睡眠模式配置)

17个帖子/ 0新
最后一篇
Giuseppe.
离线
最后一次露面:4年8月前
专家
加入:2015-03-25 13:34
关于UM-B-006的问题(睡眠模式配置)

大家好,
我正在阅读UM-B-006,用于在我的项目上实施睡眠功能。
我希望应用程序修改Diname上睡眠模式,因此根据Doc,Da1458_config.h是:

/ *睡眠模式* /
#undef cfg_ext_sleep.
#define cfg_deep_sleep.

当应用程序首次启动时,睡眠模式必须设置为扩展,所以在app_set_dev_config_complete_func我填写以下:
app_set_extended_sleep();
我读取关于处理睡眠主循环结构的段落,但现在我完成了配置后,我不明白我如何将设备放在睡眠中。在ARCH_MAIN.c文件上我看到了此检查:

if(sleep_mode == mode_ext_sleep || sleep_mode == mode_deep_sleep)

我需要发送或开始设置的邮件或功能是正确的leep_mode?

而且....在Doc BLE定时器上可用于唤醒设备。因此,如果通过app_timer_set()设置计时器,则在计时器结束时发送消息时会自动发送中断?所以主处理器退出wif()?

如果关闭电台和BLE,则BLE定时器如何发送中断?

如果在wif()之前在主循环中执行global_int_stop(),则禁用所有中断,主处理器如何由WIF()与中断退出?

睡眠模式也适用于调试器?如何使用调试器配置代码以使休眠睡眠?

设备:
mt_dialog.
离线
最后一次露面:1个月2周前
职员
加入:2015-06-08 11:34
嗨Giuseppe,

嗨Giuseppe,

在第7章应用程序编程界面中检查文档UM-B-006,API可以动态地更改应用程序App_set_extended_sleep和app_set_deep_sleep的睡眠模式。也是肯定的软件定时器可用于唤醒设备,在Timer_set您的设备将唤醒并为特定计时器执行注册处理程序。在DA跌入睡眠之前,它将安排下一个唤醒,并且低功率时钟直到那样。当中断停止时,它意味着在WFI存在挂起中断之后,在WFI之后,处理器继续执行,中断待处理的ISR。不,当DA处于睡眠模式时,您无法调试程序,当处理器睡眠强制调试器时,无法抵制,并且无法克服此操作。

谢谢mt_dialog.

Giuseppe.
离线
最后一次露面:4年8月前
专家
加入:2015-03-25 13:34
对不起,但我有点困惑。

对不起,但我有点困惑。
在UM-B-006中,我通过睡眠操作之前和之后的Sync异步的挂钩主循环架构,因此如果我在配置文件中定义exthending睡眠模式,我假设处理器执行一个循环的主循环,执行所有操作,最后执行所有操作进入睡眠状态(关闭无线电和外围设备,并与WFI指令停止)。这是正确的?
在主周期中,此说明按顺序执行:

global_int_stop():“在系统中禁用全局中断。”
WFI():“调用”处理器的中断过程“。
global_int_start():“在系统中全局启用中断。”

所以主循环首次运行global_int_stop和wfi之后,现在中断被禁用,处理器停止并等待中断。这是正确的?

现在要从Halt状态(代码中的WFI()行)释放处理器我能做的方式?除禁用中断外,还有哪些事件,允许处理器退出WFI?

mt_dialog.
离线
最后一次露面:1个月2周前
职员
加入:2015-06-08 11:34
嗨guiseppe,

嗨guiseppe,

当您在配置文件中设置睡眠时,DA没有待处理操作,根据配置文件中定义的模式休眠,并等待中断以唤醒。是的,处理器正在等待中断,如果有任何挂起的中断,处理器将唤醒并继续。只有中断可以唤醒处理器以退出WFI。

谢谢mt_dialog.

Giuseppe.
离线
最后一次露面:4年8月前
专家
加入:2015-03-25 13:34
请查看此代码:

请查看此代码:

电源处理程序。功能唤醒设备如果CONT <60,设置读取标志= 1,请在300ms后呼叫并激活延长睡眠。

int myproject_power_on_handler(ke_msg_id_t const msgs,const void * param,ke_task_id_t const dest_id,ke_task_id_t const src_id)
{
if(app_env.cont <60){
app_force_active_mode();
app_ble_force_wakeup();
app_ble_ext_wakeup_off();
}
app_env.read = 1;
app_timer_set(trelettra_power_on,task_app,30);
app_set_extended_sleep();

return(ke_msg_consumed);
}

读处理器。当app_env.read == 1时调用,它递增连续并将通知发送到远程设备。

int myproject_read_handler(ke_msg_id_t const msgs,const void * param,ke_task_id_t const dest_id,ke_task_id_t const src_id)
{
app_env.cont ++;

发送通知代码.....

return(ke_msg_consumed);
}

app_asynch_proc。由主循环调用。当app_env_read == 1以及BLE核不处于睡眠模式时,它允许MyProject_Read_Handler。

静态内联bool app_asynch_proc(void)
{
bool ret = false;
if(!app_ble_ext_wakeup_get()){
if(app_env.read == 1){
ke_msg_send_basic(myproject_read,task_app,task_app);
app_env.read = 0;

}
}

返回Ret;
}

有了这个代码,系统将在18秒内且在18秒(CONT> 60; 60 * 0.3ms = 18s之后的时间间隔向远程设备通知远程设备,它不应再发送通知。但是它总是发送通知。为什么App_set_extendended_sleep()后BLE Core No仍然存在于睡眠模式中?

mt_dialog.
离线
最后一次露面:1个月2周前
职员
加入:2015-06-08 11:34
嗨Giuseppe,

嗨Giuseppe,

你的意思是什么不睡觉?ý你希望你的设备脱离Cenral和落入永久睡眠状态?或者你可以从智能人那里看到,这不会睡觉,并在每个BLE活动中醒来?

谢谢mt_dialog.

Giuseppe.
离线
最后一次露面:4年8月前
专家
加入:2015-03-25 13:34
我看不到

我看不到SmartSnippet,因为我使用USB加密狗进行调试。我希望该设备保持永久延长睡眠状态。检查我发布的代码。在此连续之后> = 60个设备仍然在延长睡眠中,因为唤醒指令不再执行。所以app_sync_proc()不能再发送到远程设备beacuse app_ble_ext_wakeup_get()返回true。
但是,它显然继续发送通知,因为app_ble_ext_wakeup_get返回false(dafault模式)。为什么?

if(!app_ble_ext_wakeup_get()){
if(app_env.read == 1){
ke_msg_send_basic(myproject_read,task_app,task_app);
app_env.read = 0;
}

mt_dialog.
离线
最后一次露面:1个月2周前
职员
加入:2015-06-08 11:34
嗨guiseppe,

嗨guiseppe,

app_ble_ext_wakeup_get()返回false,因为您不会在永久睡眠中设置设备(您不调用函数app_ble_ext_wakeup_on(),至少我无法在您的代码中看到它)。检查第12页的UM-B-006.PDF。“调用app_ble_ext_wakeup_on()以便将ble放入永久睡眠中等待强制唤醒“。 这app_ble_ext_wakeup_on()函数在app_adv_timer_handler的最后ears中调用smarttag ref设计中。

谢谢mt_dialog.

Giuseppe.
离线
最后一次露面:4年8月前
专家
加入:2015-03-25 13:34
我修改了代码

我修改了代码,如下所示:

int myproject_read_handler(ke_msg_id_t const msgs,const void * param,ke_task_id_t const dest_id,ke_task_id_t const src_id)
{

....发送.Notifications代码....

app_timer_set(myproject_power_off,task_app,0);
// app_timer_set(myproject_power_on,task_app,30);//禁用
app_timer_set(myproject_read,task_app,31);

return(ke_msg_consumed);
}
int myproject_power_on_handler(ke_msg_id_t const msgs,const void * param,ke_task_id_t const dest_id,ke_task_id_t const src_id)
{
app_force_active_mode();
app_ble_force_wakeup();
return(ke_msg_consumed);
}
int myproject_power_off_handler(ke_msg_id_t const msgs,const void * param,ke_task_id_t const dest_id,ke_task_id_t const src_id)
{
app_set_extended_sleep();
app_ble_ext_wakeup_on();

return(ke_msg_consumed);
}

我删除了app_ble_ext_wakeup_get()测试。现在在启动时,app_set_dev_config_complete_func调用读取函数。
读取功能将通知发送到远程设备,最后设置扩展睡眠模式,并通过调用MyProject_Power_Off_Handler将BLE放入永久睡眠状态。上面的代码中评论了对power_on_handler的调用,因此下一个读取功能的调用无法发送通知,因为BLE无法详细说明需要更新特征的消息。但它确实如此!为什么?收到新活动时会自动唤醒吗?

mt_dialog.
离线
最后一次露面:1个月2周前
职员
加入:2015-06-08 11:34
嗨Giuseppe,

嗨Giuseppe,

如果DA已连接将忽略App_ble_wakeup_on(),并将安排在下一个连接间隔中唤醒。如果断开连接(您可以从外设发出断开连接命令)那么您的设备将落在永久性睡眠中。只要您所连接,将继续调度BLE事件。

谢谢mt_dialog.

Giuseppe.
离线
最后一次露面:4年8月前
专家
加入:2015-03-25 13:34
我重写所有代码。

我重写所有代码。
cfg_ext_sleep是deined。
当我打开电源时,广告已正确启动。电流消耗约为250A。
6秒后,App_Force_Active_Mode()被执行,当前Consumpiton大约为700A。da发出广告。
10秒后,App_set_extended_sleep()执行,但电流消耗仍然留到700ua(无线电仍然保持在!?)

为什么当App_set_extended_sleep()启动系统和700ua时,当前为250ua?在代码操作期间,我如何在延长睡眠中拨出/普及设备?

Giuseppe.
离线
最后一次露面:4年8月前
专家
加入:2015-03-25 13:34
如果我使用app_restore_sleep

如果我使用app_restore_sleep_mode当前返回250ua。为什么带有app_set_extendend_sleep的系统不会返回相同的当前消耗?

mt_dialog.
离线
最后一次露面:1个月2周前
职员
加入:2015-06-08 11:34
嗨Giuseppe,

嗨Giuseppe,

您正在使用DEV套件或定制板?您可以检查您的设备是否正在使用智能片段睡眠?您可以使用app_set_extended_sleep()函数执行代码时更改睡眠模式。也许你的代码中的东西正在禁用您的设置,以便扩展睡眠,这是您的设备无法睡眠的为什么。

谢谢mt_dialog.

Giuseppe.
离线
最后一次露面:4年8月前
专家
加入:2015-03-25 13:34
定制董事会。

定制董事会。
当我打开电源时,广告可以正确启动,电流消耗约为250UA(没有J-Link的1UA)。当执行app_force_active_mode()时,电源消耗变为700ua(没有j-link连接的500ua)。现在,当我执行app_restore_sleep_mode时,当前消耗返回到250ua / 1ua,如果我执行app_set_extended_sleep,则当前剩余至700ua / 500ua。为什么?可能是什么问题呢?

mt_dialog.
离线
最后一次露面:1个月2周前
职员
加入:2015-06-08 11:34
嗨guiseppe,

嗨guiseppe,

app_force_active_mode()禁用睡眠并记住最后一个睡眠配置,您不会使用app_set_extended_sleep将设备设置为睡眠模式。当APP_FORCE_ACTIVE_MODE称为SEEP_MD变量时,呼叫APP_SET_EXTENDEND SEEPEL时,设备才会休眠才能休眠,仅在leep_md == 0时才能休眠。这是为了避免任何模块,以避免在指示保持设备时设置设备睡眠。

谢谢mt_dialog.

Giuseppe.
离线
最后一次露面:4年8月前
专家
加入:2015-03-25 13:34
所以,如果你想关闭

因此,如果要关闭延长睡眠,然后再次重新激活它,我必须更改Sleep_md。好的。

mt_dialog.
离线
最后一次露面:1个月2周前
职员
加入:2015-06-08 11:34
嗨guiseppe,

嗨guiseppe,

这个想法不是用leep_md混淆,而是恢复以前的配置。如果您调用app_force_active_mode()则应调用app_restore_sleep_mode()以便扩展睡眠状态。

谢谢mt_dialog.