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

如果在wif()之前在主循环中执行global_int_stop(),则禁用所有中断,主处理器如何由WIF()与中断退出?

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

设备:
MT_dialog
离线
最后看到:6个月3个星期前
职员
加入:2015-06-08 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

朱塞佩
离线
最后看到: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个月3个星期前
职员
加入:2015-06-08 34
嗨guiseppe,

嗨guiseppe,

当您在配置文件中设置睡眠时,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 msgs,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 ();

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;
如果(! app_ble_ext_wakeup_get ()) {
如果(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 34
嗨Giuseppe,

嗨Giuseppe,

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

由于MT_dialog

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

我看不到SmartSnippet,因为我使用USB加密狗进行调试。我希望该设备保持永久延长睡眠状态。检查我发布的代码。在此连续之后> = 60个设备仍然在延长睡眠中,因为唤醒指令不再执行。所以app_sync_proc()不能再发送到远程设备beacuse app_ble_ext_wakeup_get()返回true。
但是,它显然继续发送通知,因为app_ble_ext_wakeup_get返回false(dafault模式)。为什么?

如果(! 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个月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_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 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_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 ();
return(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();

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 34
嗨Giuseppe,

嗨Giuseppe,

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

由于MT_dialog

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

我重写了所有的代码。
cfg_ext_sleep是deined。
当我打开电源时,广告已正确启动。电流消耗约为250A。
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个月3个星期前
职员
加入:2015-06-08 34
嗨Giuseppe,

嗨Giuseppe,

您正在使用DEV套件或定制板?您可以检查您的设备是否正在使用智能片段睡眠?您可以使用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个月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

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

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

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

嗨guiseppe,

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

由于MT_dialog