嗨,每个人,
我正在阅读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文件中,我看到这个检查:
如果(睡眠模式==模式外睡眠| |睡眠模式==模式深睡眠)
我需要发送或启动什么信息或功能来正确设置睡眠模式?
和也……在doc上的BLE定时器可用于唤醒设备。所以如果定时器是由app_timer_set()设置的,当定时器结束时,当消息发送时,将自动发送一个中断?所以主处理器退出WIF()?
如果收音机和BLE关闭,BLE定时器如何发送中断?
如果全局_INT_STOP()在WIF()之前的主循环中执行,因此所有中断都被禁用,那么WIF()如何通过中断退出主处理器?
睡眠模式与调试器是否也能正常工作?我如何配置代码启用睡眠与调试器?
设备:
嗨,朱塞佩,
查看第7章“应用程序编程接口”中的文档UM-B-006,使用API,您可以动态更改应用程序的“应用程序设置”睡眠和“应用程序设置”睡眠的睡眠模式。同样是的,软件定时器可用于唤醒设备,在定时器设置完成后,您的设备将唤醒并执行特定定时器的注册处理程序。在da进入睡眠状态之前,它会安排下一次唤醒,低功耗时钟会一直计数,直到那时。中断停止时,意味着不执行ISR,中断处于挂起状态,在WFI之后,如果存在挂起的中断,处理器将继续执行。不,当da处于睡眠模式时,您无法调试程序,当处理器睡眠时,将强制调试器去触摸,并且没有办法克服这一问题。
由于MT_dialog
对不起,我有点困惑。
嗯- b - 006我看到主循环结构用钩子的同步异步睡眠前后操作,所以如果我在配置文件中定义exthended睡眠模式假设处理器执行一个循环的主循环,执行所有操作,最后进入睡眠(关机广播和外围设备,在停止注射用水指令)。这是对吗?
在主循环中,这些指令按顺序执行:
GLOBAL_INT_STOP():“在系统中全局禁用中断。”
WFI():“调用处理器的等待中断过程。”
GLOBAL_INT_START():“在系统中全局启用中断。”
因此,主循环首先运行GLOBAL_INT_STOP,在WFI之后,中断被禁用,处理器停止并等待中断。这是对吗?
现在让处理器从暂停状态(代码中的WFI()行)退出,我该怎么办?除了禁用的中断之外,允许处理器退出WFI的事件有哪些?
嗨guiseppe,
当您在配置文件中设置睡眠且da没有挂起的操作时,它将根据您在配置文件中定义的模式睡眠,并等待发生中断以唤醒。是的,处理器正在等待中断,如果有任何挂起的中断,处理器将唤醒并继续。只有中断才能唤醒处理器以退出WFI。
由于MT_dialog
请检查以下代码:
上电处理程序。命令功能:cont<60唤醒设备,设置read flag=1, 300ms后呼叫自己,激活延长睡眠。
int myproject\u power\u on_handler(ke_msg\u id\t const msgid,const void*param,ke_task\u id\t const dest\u id,ke_task\u id\t const src\u 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 ();
返回(已消耗的热量);
}
读取处理程序。当app_env.read==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 + +;
发送通知代码…
返回(已消耗的热量);
}
app_asynch_proc。由主循环调用。当app_env_read==1和BLE核心不在睡眠模式时,它允许myproject_read_handler。
静态内联bool应用程序异步程序(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;
}
使用此代码,系统以300ms的间隔向远程设备发送通知,18秒后(cont>60;60*0.3ms=18s)系统将不再发送通知。然而,它总是发送通知。为什么在app_set_extended_sleep()之后BLE core no仍处于睡眠模式?
嗨,朱塞佩,
你说它不睡觉是什么意思?Ý您想让您的设备与cenral断开连接并进入永久睡眠状态吗?或者,您可以从smartsnippets中看到,在每一个可编程事件中都不会进入睡眠和醒来?
由于MT_dialog
我无法从smartsnippets中查看,因为我使用usb加密狗进行调试。我想让那个设备保持长期睡眠。检查我发布的代码。在此之后,cont大于等于60,因为唤醒指令不再执行,所以设备仍处于延长睡眠状态。因此app_sync_proc()无法再向远程设备发送通知,因为app_ble_ext_wakeup_get()返回true。
但是,它显然会继续发送通知,因为app_ble_ext_wakeup_get return 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_ble_ext_wakeup_on()函数在SmartTag引用设计中app_adv_timer_handler的最后一个else中被调用。
由于MT_dialog
我修改代码如下:
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);
返回(已消耗的热量);
}
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 ();
返回(已消耗的热量);
}
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();
返回(已消耗的热量);
}
我删除了app_ble_ext_wakeup_get()测试。现在,在启动时,read函数由app\u set\u dev\u config\u complete\u func调用。
Read函数向远程设备发送通知,最后通过调用myproject\u power\u off\u处理程序设置扩展睡眠模式并将BLE置于永久睡眠状态。上面的代码中对power\u on\u handler的调用进行了注释,因此下一次对read函数的调用无法发送notify,因为BLE无法详细说明需要更新特征的消息。但事实确实如此!为什么?当收到新事件时,BLE是否自动唤醒?
嗨,朱塞佩,
如果da已连接,则将忽略app_ble_wakeup_on(),并计划在下一个连接间隔中唤醒。如果你断开连接(你可以从外围设备发出断开连接的命令),那么你的设备将进入永久休眠状态。只要您连接将继续安排BLE事件。
由于MT_dialog
我重写了所有的代码。
我们的睡眠被剥夺了。
当我打开电源时,广告正确启动。电流消耗约为250uA。
6秒后执行app_force_active_mode(),当前消费约为700uA。Da发送广告。
10秒后app_set_extended_sleep()被执行,但当前的消耗仍然是700uA(收音机始终是打开的!?)
为什么当前是250uA时启动系统和700uA后app_set_extended_sleep() ?在代码操作期间,我如何在延长睡眠状态下熄灭/普京设备?
如果我使用app_restore_sleep_mode当前返回250uA。为什么使用app_set_extended_sleep的系统不会返回到相同的当前消费?
嗨,朱塞佩,
您使用的是开发工具包还是自定义板?您能否使用智能代码段检查设备是否处于睡眠状态?您可以使用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
所以如果你想关闭extended sleep,然后再激活它,我必须改变sleep_md。好的。
嗨guiseppe,
这样做不是为了扰乱sleep_md,而是为了恢复以前的配置。如果您调用app_force_active_mode(),那么您应该调用app_restore_sleep_mode()以获得扩展睡眠。
由于MT_dialog