关于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定时器如何发送中断?

如果GLOBAL_INT_STOP()在WIF()之前在主循环中执行,那么所有的中断都被禁用了,主处理器如何通过WIF()带中断退出?

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

设备:
mt_dialog.
离线
最后一次露面:6个月3周前
工作人员
加入:2015-06-08 11:34
嗨,朱塞佩,

嗨,朱塞佩,

检查第7章应用程序编程接口中的文档UM-B-006,使用API,你可以动态更改应用程序app_set_extended_sleep和app_set_deep_sleep的睡眠模式。是的,软件计时器可以用来唤醒设备,在timer_set之后,你的设备将会唤醒并执行特定计时器的注册处理程序。在da进入睡眠之前,它会安排下一个起床时间,低功率时钟一直算到那个时候。当中断停止时,意味着isr没有执行,中断是挂起的,在WFI之后,如果有一个挂起的中断,处理器将继续执行。不,当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,

当您在配置文件中设置sleep,而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 msgid, 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();

返回(KE_MSG_CONSUMED);
}

阅读处理程序。app_env时调用。Read ==1,它增加内容并发送通知到远端设备。

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

发送通知代码。。。。。

返回(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;

}
}

返回受潮湿腐烂;
}

使用这段代码,系统以300ms的间隔和18秒之后向远程设备发送通知(conte >60;60*0.3ms=18s)它将不再发送通知。然而,它总是发送通知。为什么BLE core no在app_set_extended_sleep()之后仍处于睡眠模式?

mt_dialog.
离线
最后一次露面:6个月3周前
工作人员
加入:2015-06-08 11:34
嗨,朱塞佩,

嗨,朱塞佩,

什么叫它不睡觉?Ýou希望你的设备与中央系统断开连接,进入永久睡眠状态?或者你可以从智能片段中看到,不会在每一次幸运事件中陷入睡眠和醒来?

谢谢mt_dialog.

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

我不能从smartsnippets看到,因为我使用usb加密狗进行调试。我要那个设备保持长期休眠状态。检查我发布的代码。在cont为>=60之后,设备仍处于扩展睡眠状态,因为唤醒指令不再执行。因此app_sync_proc()不能再向远程设备发送通知,因为app_ble_ext_wakeup_get()返回true。
然而,它继续发送通知显然是因为app_ble_ext_wakeup_get返回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;
}

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 msgid,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);

返回(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();
返回(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 ();

返回(KE_MSG_CONSUMED);
}

我删除了app_ble_ext_wakeup_get()测试。现在在启动时,read函数被app_set_dev_config_complete_func调用。
Read函数通过调用myproject_power_off_handler将通知发送到远程设备,并最终设置扩展休眠模式,并将BLE设置为永久休眠。上面的代码注释了对power_on_handler的调用,因此下一个对read function的调用不能发送通知,因为BLE不能详细说明需要更新特征的消息。但它确实如此!为什么?BLE在收到新事件时自动唤醒?

mt_dialog.
离线
最后一次露面:6个月3周前
工作人员
加入:2015-06-08 11:34
嗨,朱塞佩,

嗨,朱塞佩,

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

谢谢mt_dialog.

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

我重写所有代码。
CFG_EXT_SLEEP戴恩。
当我打开电源,广告开始正确。当前功耗约为250uA。
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
嗨,朱塞佩,

嗨,朱塞佩,

你使用的是开发工具包还是自定义板?你能通过智能片段检查你的设备是否处于睡眠状态吗?可以使用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.