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

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

大家好,
我正在阅读UM-B-006,用于在我的项目上实施睡眠功能。
我希望该应用程序修改动态睡眠模式,因此根据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.
离线
最后一次露面:6个月3周前
职员
加入: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.
离线
最后一次露面:5年2个月前
专家
加入:2015-03-25 13:34
对不起,但我有点困惑。

对不起,但我有点困惑。
在UM-B-006中,我看到主循环体系结构在睡眠操作之前和之后都带有同步异步挂钩,因此如果我在配置文件中定义exthended sleep mode,我假设处理器执行主循环的一个周期,执行所有操作,最后进入睡眠状态(关闭无线电和外围设备,并使用WFI指令停止)。是吗?
在主周期中,此说明按顺序执行:

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

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

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

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

嗨guiseppe,

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

谢谢mt_dialog.

Giuseppe.
离线
最后一次露面:5年2个月前
专家
加入: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.
离线
最后一次露面:6个月3周前
职员
加入:2015-06-08 11:34
嗨Giuseppe,

嗨Giuseppe,

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

谢谢mt_dialog.

Giuseppe.
离线
最后一次露面:5年2个月前
专家
加入: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.
离线
最后一次露面:6个月3周前
职员
加入: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.
离线
最后一次露面:5年2个月前
专家
加入: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\u power\u on_handler(ke_msg\u id\t const msgid,const void*param,ke_task\u id\t const dest\u id,ke_task\u id\t const src\u 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.
离线
最后一次露面:6个月3周前
职员
加入:2015-06-08 11:34
嗨Giuseppe,

嗨Giuseppe,

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

谢谢mt_dialog.

Giuseppe.
离线
最后一次露面:5年2个月前
专家
加入: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.
离线
最后一次露面:5年2个月前
专家
加入:2015-03-25 13:34
如果我使用app_restore_sleep

如果我使用应用程序\恢复\睡眠\模式,电流将返回到250uA。为什么应用程序设置睡眠时间延长的系统不能恢复到相同的电流消耗?

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

嗨Giuseppe,

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

谢谢mt_dialog.

Giuseppe.
离线
最后一次露面:5年2个月前
专家
加入: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.
离线
最后一次露面:6个月3周前
职员
加入: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.
离线
最后一次露面:5年2个月前
专家
加入:2015-03-25 13:34
所以,如果你想关闭

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

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

嗨guiseppe,

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

谢谢mt_dialog.