嗨,每个人,
我正在阅读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定时器如何发送中断?
如果在wif()之前在主循环中执行global_int_stop(),则禁用所有中断,主处理器如何由WIF()与中断退出?
睡眠模式也与调试器正常工作?我如何配置代码,以启用睡眠与调试器?
设备:
嗨Giuseppe,
在第7章应用程序编程界面中检查文档UM-B-006,API可以动态地更改应用程序App_set_extended_sleep和app_set_deep_sleep的睡眠模式。也是肯定的软件定时器可用于唤醒设备,在Timer_set您的设备将唤醒并为特定计时器执行注册处理程序。在DA跌入睡眠之前,它将安排下一个唤醒,并且低功率时钟直到那样。当中断停止时,它意味着在WFI存在挂起中断之后,在WFI之后,处理器继续执行,中断待处理的ISR。不,当DA处于睡眠模式时,您无法调试程序,当处理器睡眠强制调试器时,无法抵制,并且无法克服此操作。
由于MT_dialog
对不起,但我有点困惑。
嗯- b - 006我看到主循环结构用钩子的同步异步睡眠前后操作,所以如果我在配置文件中定义exthended睡眠模式假设处理器执行一个循环的主循环,执行所有操作,最后进入睡眠(关机广播和外围设备,在停止注射用水指令)。这是对吗?
在主循环中,这些指令按顺序执行:
GLOBAL_INT_STOP():“在系统中全局禁用中断。”
WFI():“调用”处理器的中断过程“。
global_int_start():“在系统中全局启用中断。”
所以主循环首先运行GLOBAL_INT_STOP,然后在WFI之后,现在中断被禁用,处理器被停止并等待中断。这是对吗?
现在要从Halt状态(代码中的WFI()行)释放处理器我能做的方式?除禁用中断外,还有哪些事件,允许处理器退出WFI?
嗨guiseppe,
当您在配置文件中设置睡眠时,DA没有待处理操作,根据配置文件中定义的模式休眠,并等待中断以唤醒。是的,处理器正在等待中断,如果有任何挂起的中断,处理器将唤醒并继续。只有中断可以唤醒处理器以退出WFI。
由于MT_dialog
请检查这个代码:
上电处理程序。功能唤醒设备,如果conte <60,设置读取标志=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 core不在睡眠模式时,它允许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仍然存在于睡眠模式中?
嗨Giuseppe,
你的意思是什么不睡觉?ý你希望你的设备脱离Cenral和落入永久睡眠状态?或者你可以从智能人那里看到,这不会睡觉,并在每个BLE活动中醒来?
由于MT_dialog
我看不到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;
}
嗨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
我将代码修改如下:
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无法详细说明需要更新特征的消息。但它确实如此!为什么?收到新活动时会自动唤醒吗?
嗨Giuseppe,
如果da已连接,将忽略app_ble_wakeup_on(),并将调度到下一个连接间隔中唤醒。如果你断开连接(你可以从你的外设发出一个断开连接的命令),那么你的设备就会进入永久睡眠状态。只要您是连接将继续调度BLE事件。
由于MT_dialog
我重写了所有的代码。
cfg_ext_sleep是deined。
当我打开电源时,广告已正确启动。电流消耗约为250A。
6秒后执行app_force_active_mode(),当前耗电量约为700uA。Da发送广告。
在10秒后执行app_set_extended_sleep(),但是当前的消耗保持为700uA(无线电始终保持打开!?)
为什么启动系统时current是250uA, app_set_extended_sleep()后是700uA ?我如何可以在代码操作期间延长睡眠/普京设备?
如果我使用app_restore_sleep_mode当前返回到250uA。为什么带有app_set_extended_sleep的系统不返回相同的当前消耗?
嗨Giuseppe,
您正在使用DEV套件或定制板?您可以检查您的设备是否正在使用智能片段睡眠?您可以使用app_set_extended_sleep()函数执行代码时更改睡眠模式。也许你的代码中的东西正在禁用您的设置,以便扩展睡眠,这是您的设备无法睡眠的为什么。
由于MT_dialog
定制董事会。
当我打开电源时,广告正确启动,电流消耗约为250uA (1uA无j-link)。执行app_force_active_mode()时,功耗变为700uA(连接j-link时为500uA)。现在,当我执行app_restore_sleep_mode时,当前消费返回到250uA/1uA,而如果我执行app_set_extended_sleep,当前仍然是700uA/500uA。为什么?有什么问题吗?
嗨guiseppe,
app_force_active_mode()禁用睡眠并记住最后的睡眠配置,你将不能使用app_set_extended_sleep将设备设置为睡眠模式。当调用app_force_active_mode时设置sleep_md变量,当调用app_set_extended sleep时,只有sleep_md == 0设备才会进入睡眠状态。这样做是为了避免任何模块设置设备睡眠时,指示保持清醒。
由于MT_dialog
所以如果你想关闭长时间睡眠,然后再激活它,我必须更改sleep_md。好的。
嗨guiseppe,
这个想法不是要搞乱sleep_md,而是要恢复以前的配置。如果您调用app_force_active_mode(),那么您应该调用app_restore_sleep_mode()以获得扩展睡眠。
由于MT_dialog