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

17个职位/ 0个新职位
最后发表
Giuseppe.
离线
最后一次露面:4年11个月前
专家
加入: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定时器如何发送一个中断?

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

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

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

嗨,朱塞佩,

检查文档UM-B-006在第7章应用程序编程接口,有了API,你可以动态地改变你的应用程序的睡眠模式app_set_extended_sleep和app_set_deep_sleep。同样,软件定时器也可以用来唤醒设备,在timer_set之后,设备将会唤醒并执行特定定时器的注册处理程序。在检察官进入睡眠之前,它会安排下一次起床时间,低功率时钟会一直计数到那时。当中断停止时,意味着isr不执行,中断挂起,在WFI之后,如果有一个挂起的中断,处理器将继续执行。不,当da处于睡眠模式时,你不能调试你的程序,当处理器休眠时,强制调试器分离,没有办法克服这个问题。

谢谢mt_dialog.

Giuseppe.
离线
最后一次露面:4年11个月前
专家
加入:2015-03-25 13:34
对不起,我有点糊涂了。

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

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

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

现在要让处理器脱离暂停状态(代码中的WFI()行),我该怎么做?除了被禁用的中断之外,还有哪些事件允许处理器退出WFI?

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

嗨guiseppe,

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

谢谢mt_dialog.

Giuseppe.
离线
最后一次露面:4年11个月前
专家
加入: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时调用。读==1,它增加cont并发送通知到远端设备。

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。

app_asynch_proc(void)静态内联bool
{
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秒后(继续>60;60*0.3ms=18s)它应该不再发送通知。但是它总是发送通知。为什么BLE核心没有在app_set_extended_sleep()之后保持睡眠模式?

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

嗨,朱塞佩,

它不睡觉是什么意思?Ýou想要你的设备断开与中央和进入永久睡眠?或者你可以从智能短片中看到,它不会在每一个神圣的事件中入睡和醒来?

谢谢mt_dialog.

Giuseppe.
离线
最后一次露面:4年11个月前
专家
加入: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.
离线
最后一次露面:4个月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.
离线
最后一次露面:4年11个月前
专家
加入: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_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();
返回(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()测试。现在在启动时,app_set_dev_config_complete_func会调用read函数。
Read函数向远程设备发送通知,最后通过调用myproject_power_off_handler设置延长睡眠模式,并将BLE设置为永久睡眠。对power_on_handler的调用在上面的代码中进行了注释,因此下一个对read函数的调用不能发送notify,因为BLE不能详细说明需要更新特征的消息。但它确实存在!为什么?BLE在接收到新事件时自动唤醒?

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

嗨,朱塞佩,

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

谢谢mt_dialog.

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

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

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

嗨,朱塞佩,

你使用的是开发套件还是定制板?你能通过智能片段检查你的设备是否处于睡眠状态吗?可以使用app_set_extended_sleep()函数在执行代码时更改睡眠模式。也许你的代码中有什么东西禁止了你的长时间睡眠设置,这就是为什么你的设备不睡觉。

谢谢mt_dialog.

Giuseppe.
离线
最后一次露面:4年11个月前
专家
加入: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.
离线
最后一次露面:4个月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.
离线
最后一次露面:4年11个月前
专家
加入:2015-03-25 13:34
如果你想关掉

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

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

嗨guiseppe,

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

谢谢mt_dialog.