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

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

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

/ * * /睡眠模式
# undef CFG_EXT_SLEEP
#定义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)

我需要发送或启动什么信息或功能来正确设置睡眠模式?

和也……在doc上的BLE定时器可用于唤醒设备。所以如果定时器是由app_timer_set()设置的,当定时器结束时,当消息发送时,将自动发送一个中断?所以主处理器退出WIF()?

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

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

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

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

嗨,朱塞佩,

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

由于MT_dialog

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

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

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

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

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

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

嗨guiseppe,

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

由于MT_dialog

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

请检查以下代码:

上电处理程序。命令功能:cont<60唤醒设备,设置read flag=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时调用。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;
如果(! 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秒之后向远程设备发送通知(conte >60;60*0.3ms=18s)它将不再发送通知。然而,它总是发送通知。为什么BLE core no在app_set_extended_sleep()之后仍处于睡眠模式?

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

嗨,朱塞佩,

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

由于MT_dialog

朱塞佩
离线
最后看到:5年2个月前
专家
加入: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
离线
最后看到:6个月,4个星期前
工作人员
加入: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_ble_ext_wakeup_on()函数在SmartTag引用设计中app_adv_timer_handler的最后一个else中被调用。

由于MT_dialog

朱塞佩
离线
最后看到:5年2个月前
专家
加入: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()测试。现在在启动时,read函数被app_set_dev_config_complete_func调用。
Read函数通过调用myproject_power_off_handler将通知发送到远程设备,并最终设置扩展休眠模式,并将BLE设置为永久休眠。上面的代码注释了对power_on_handler的调用,因此下一个对read function的调用不能发送通知,因为BLE不能详细说明需要更新特征的消息。但它确实如此!为什么?BLE在收到新事件时自动唤醒?

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

嗨,朱塞佩,

如果da已连接,则将忽略app_ble_wakeup_on(),并计划在下一个连接间隔中唤醒。如果你断开连接(你可以从外围设备发出断开连接的命令),那么你的设备将进入永久休眠状态。只要您连接将继续安排BLE事件。

由于MT_dialog

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

我重写了所有的代码。
CFG_EXT_SLEEP戴恩。
当我打开电源,广告开始正确。当前功耗约为250uA。
6秒后执行app_force_active_mode(),当前消费约为700uA。Da发送广告。
10秒后app_set_extended_sleep()被执行,但当前的消耗仍然是700uA(收音机始终是打开的!?)

为什么当前是250uA时启动系统和700uA后app_set_extended_sleep() ?在代码操作期间,我如何在延长睡眠状态下熄灭/普京设备?

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

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

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

嗨,朱塞佩,

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

由于MT_dialog

朱塞佩
离线
最后看到:5年2个月前
专家
加入: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
离线
最后看到:6个月,4个星期前
工作人员
加入: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

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

所以如果你想关闭extended sleep,然后再激活它,我必须改变sleep_md。好的。

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

嗨guiseppe,

这样做不是为了扰乱sleep_md,而是为了恢复以前的配置。如果您调用app_force_active_mode(),那么您应该调用app_restore_sleep_mode()以获得扩展睡眠。

由于MT_dialog