嗨,每个人,
我正在阅读UM-B-006在我的项目中实现睡眠功能。
我希望应用程序修改Diname上睡眠模式,因此根据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)
我需要发送或启动什么消息或函数来设置正确的sleep_mode?
和也……在文件BLE定时器可以用来唤醒设备。因此,如果app_timer_set()设置了计时器,那么当计时器结束时将发送消息时,将自动发送中断?那么主处理器退出WIF()?
如果无线电和BLE被关闭,BLE定时器如何发送一个中断?
如果GLOBAL_INT_STOP()在WIF()之前在主循环中执行,因此所有中断都被禁用,那么WIF()如何通过一个中断退出主处理器?
睡眠模式也与调试器正常工作?我如何配置代码,以启用睡眠与调试器?
设备:
嗨,朱塞佩,
检查文档UM-B-006在第7章应用程序编程接口,有了API,你可以动态地改变你的应用程序的睡眠模式app_set_extended_sleep和app_set_deep_sleep。同样,软件定时器也可以用来唤醒设备,在timer_set之后,设备将会唤醒并执行特定定时器的注册处理程序。在检察官进入睡眠之前,它会安排下一次起床时间,低功率时钟会一直计数到那时。当中断停止时,意味着isr不执行,中断挂起,在WFI之后,如果有一个挂起的中断,处理器将继续执行。不,当da处于睡眠模式时,你不能调试你的程序,当处理器休眠时,强制调试器分离,没有办法克服这个问题。
由于MT_dialog
对不起,我有点糊涂了。
在UM-B-006中,我通过睡眠操作之前和之后的Sync异步的挂钩主循环架构,因此如果我在配置文件中定义exthending睡眠模式,我假设处理器执行一个循环的主循环,执行所有操作,最后执行所有操作进入睡眠状态(关闭无线电和外围设备,并与WFI指令停止)。这是对吗?
在主循环中,这些指令按顺序执行:
global_int_stop():“在系统中禁用全局中断。”
WFI(): "调用处理器的等待中断过程"
GLOBAL_INT_START(): "在系统中全局启用中断。"
所以主循环首先运行GLOBAL_INT_STOP,然后在WFI之后,现在中断被禁用,处理器被停止并等待中断。这是对吗?
现在要让处理器脱离暂停状态(代码中的WFI()行),我该怎么做?除了被禁用的中断之外,还有哪些事件允许处理器退出WFI?
嗨guiseppe,
当您在配置文件中设置睡眠时,da没有挂起的操作,它会根据您在配置文件中定义的模式休眠,并等待中断发生,以便唤醒。是的,处理器正在等待中断,如果有任何挂起的中断,处理器将唤醒并继续。只有中断才能唤醒处理器以退出WFI。
由于MT_dialog
请检查这个代码:
上电处理程序。功能唤醒设备,如果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()之后保持睡眠模式?
嗨,朱塞佩,
它不睡觉是什么意思?Ýou想要你的设备断开与中央和进入永久睡眠?或者你可以从智能短片中看到,它不会在每一个神圣的事件中入睡和醒来?
由于MT_dialog
我不能从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;
}
嗨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 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 msgs,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在接收到新事件时自动唤醒?
嗨,朱塞佩,
如果da已连接,将忽略app_ble_wakeup_on(),并将调度到下一个连接间隔中唤醒。如果你断开连接(你可以从你的外设发出一个断开连接的命令),那么你的设备就会进入永久睡眠状态。只要您是连接将继续调度BLE事件。
由于MT_dialog
我重写了所有的代码。
CFG_EXT_SLEEP戴恩。
当我打开电源,广告开始正确。目前消耗约250uA。
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_extendend_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
所以如果你想关闭长时间睡眠,然后再激活它,我必须更改sleep_md。好的。
嗨guiseppe,
这个想法不是要搞乱sleep_md,而是要恢复以前的配置。如果您调用app_force_active_mode(),那么您应该调用app_restore_sleep_mode()以获得扩展睡眠。
由于MT_dialog