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

17个职位/ 0个新职位
最后发表
朱塞佩
离线
最后看到:4年11个月前
专家
加入:2015-03-25 34
关于UM-B-006(睡眠模式配置)的问题

嗨,每个人,
我正在阅读UM-B-006在我的项目中实现睡眠功能。
我想要应用程序修改动态睡眠模式,所以根据doc, da1458_config.h是:

/ * * /睡眠模式
# undef CFG_EXT_SLEEP
#定义CFG_DEEP_SLEEP

当应用程序第一次启动时,睡眠模式必须设置为extended,所以在app_set_dev_config_complete_func中我放了这个:
app_set_extended_sleep ();
我读了一段关于处理休眠的主循环结构,但现在之后我已经完成配置,我不明白我怎么能把设备休眠。在arch_main.c文件中,我看到这样的检查:

If (sleep_mode == mode_ext_sleep || sleep_mode == mode_deep_sleep)

我需要发送或启动什么消息或函数来设置正确的sleep_mode?

和也……在文件BLE定时器可以用来唤醒设备。因此,如果app_timer_set()设置了计时器,那么当计时器结束时将发送消息时,将自动发送中断?那么主处理器退出WIF()?

如果无线电和BLE被关闭,BLE定时器如何发送一个中断?

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

睡眠模式也与调试器正常工作?我如何配置代码,以启用睡眠与调试器?

设备:
MT_dialog
离线
最后看到:4个月3天前
工作人员
加入:2015-06-08 34
嗨,朱塞佩,

嗨,朱塞佩,

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

由于MT_dialog

朱塞佩
离线
最后看到:4年11个月前
专家
加入:2015-03-25 34
对不起,我有点糊涂了。

对不起,我有点糊涂了。
嗯- b - 006我看到主循环结构用钩子的同步异步睡眠前后操作,所以如果我在配置文件中定义exthended睡眠模式假设处理器执行一个循环的主循环,执行所有操作,最后进入睡眠(关机广播和外围设备,在停止注射用水指令)。这是对吗?
在主循环中,这些指令按顺序执行:

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

所以主循环首先运行GLOBAL_INT_STOP,然后在WFI之后,现在中断被禁用,处理器被停止并等待中断。这是对吗?

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

MT_dialog
离线
最后看到:4个月3天前
工作人员
加入:2015-06-08 34
嗨guiseppe,

嗨guiseppe,

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

由于MT_dialog

朱塞佩
离线
最后看到:4年11个月前
专家
加入:2015-03-25 34
请检查这个代码:

请检查这个代码:

上电处理程序。功能唤醒设备,如果conte <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)

如果(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 core不在睡眠模式时,它允许myproject_read_handler。

app_asynch_proc(void)静态内联bool

Bool ret = false;
如果(! app_ble_ext_wakeup_get ()) {
如果(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 34
嗨,朱塞佩,

嗨,朱塞佩,

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

由于MT_dialog

朱塞佩
离线
最后看到:4年11个月前
专家
加入:2015-03-25 34
我看不见

我不能从smartsnippets,因为我使用usb适配器进行调试。我想让那个设备保持永久的长时间睡眠状态。检查我发布的代码。在那个cont是>=60之后,设备仍然处于长时间睡眠状态,因为唤醒指令不再被执行。所以app_sync_proc()不能再向远程设备发送通知,因为app_ble_ext_wakeup_get()返回true。
但是它仍然继续发送通知,因为app_ble_ext_wakeup_get返回false(默认模式)。为什么?

如果(! app_ble_ext_wakeup_get ()) {
如果(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 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_adv_timer_handler的最后一个else中的SmartTag ref设计中调用app_ble_ext_wakeup_on()函数。

由于MT_dialog

朱塞佩
离线
最后看到:4年11个月前
专家
加入:2015-03-25 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 msgid,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 msgid,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 34
嗨,朱塞佩,

嗨,朱塞佩,

如果da已连接,将忽略app_ble_wakeup_on(),并将调度到下一个连接间隔中唤醒。如果你断开连接(你可以从你的外设发出一个断开连接的命令),那么你的设备就会进入永久睡眠状态。只要您是连接将继续调度BLE事件。

由于MT_dialog

朱塞佩
离线
最后看到:4年11个月前
专家
加入:2015-03-25 34
我重写了所有的代码。

我重写了所有的代码。
CFG_EXT_SLEEP戴恩。
当我打开电源,广告开始正确。目前消耗约250uA。
6秒后执行app_force_active_mode(),当前耗电量约为700uA。Da发送广告。
在10秒后执行app_set_extended_sleep(),但是当前的消耗保持为700uA(无线电始终保持打开!?)

为什么启动系统时current是250uA, app_set_extended_sleep()后是700uA ?我如何可以在代码操作期间延长睡眠/普京设备?

朱塞佩
离线
最后看到:4年11个月前
专家
加入:2015-03-25 34
如果我使用app_restore_sleep

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

MT_dialog
离线
最后看到:4个月3天前
工作人员
加入:2015-06-08 34
嗨,朱塞佩,

嗨,朱塞佩,

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

由于MT_dialog

朱塞佩
离线
最后看到:4年11个月前
专家
加入:2015-03-25 34
定制的董事会。

定制的董事会。
当我打开电源时,广告正确启动,电流消耗约为250uA (1uA无j-link)。执行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 34
嗨guiseppe,

嗨guiseppe,

app_force_active_mode()禁用睡眠并记住最后的睡眠配置,你将不能使用app_set_extended_sleep将设备设置为睡眠模式。当调用app_force_active_mode时设置sleep_md变量,当调用app_set_extended sleep时,只有sleep_md == 0设备才会进入睡眠状态。这样做是为了避免任何模块设置设备睡眠时,指示保持清醒。

由于MT_dialog

朱塞佩
离线
最后看到:4年11个月前
专家
加入:2015-03-25 34
如果你想关掉

所以如果你想关闭长时间睡眠,然后再激活它,我必须更改sleep_md。好的。

MT_dialog
离线
最后看到:4个月3天前
工作人员
加入:2015-06-08 34
嗨guiseppe,

嗨guiseppe,

这个想法不是要搞乱sleep_md,而是要恢复以前的配置。如果您调用app_force_active_mode(),那么您应该调用app_restore_sleep_mode()以获得扩展睡眠。

由于MT_dialog