为延迟道歉。我使用了附加的代码(main.c),并在DA14683 SoC和SDK1.0.14.1081上复制了您的问题。使用相同的main.c文件,使用DA14681 SOC而不是DA14683时不存在此问题。请查看SDK / CPM / SYS_POWER_MGR.C中的应用程序_WFI()函数。修订A(black_orca_ic_rev_a)适用于DA14681设备,修订版B(Black_orca_ic_rev_b)适用于DA14683设备。在sys_power_mgr.c文件的第1393号文件中,如果正在使用DA14681(Black_orca_ic_rev_a),则在休眠之前,禁用所有IRQ,除VBUS和WKUP之外,所有挂起的中断都被清除,以便系统未重置系统已经挂起的中断。这仅适用于DA14681设备。为此,在使用DA14683设备时,挂起的中断永远不会清除,因为IF-statege将始终为false。结果,系统在休眠后的系统,它会由于挂起的中断而立即唤醒。 Also, keep in mind that in ble_peripheral example of the SDK, you will have BLE activity, so the most possible reason for waking up is due to a pending BLE interrupt, in contrast with extended_sleep example. A possible workaround might be to modify the source code of sys_power_mgr.c in order to explicitly clear all the pending interrupts in case of DA14683. Please check a reference code snippet:
嗨powersquare,
按下按钮5秒钟时,您无法唤醒DA14683。请参阅wkup_ctrl_reg描述中的数据表。您可以通过使用适当值设置WKUP_DEB_VALUE位字段来配置逐个64毫秒的逐个次序时间。当系统处于主动模式时,可以实现具有5秒持续时间的“长按钮”实现,如您帖子中提到的。
谢谢,PM_DIALOG.
嗨对话小组,我们的目标如下。
1.将控制器放入Hinbernate模式后,长时间按下5秒。
2.按下按钮5秒后,唤醒控制器上的休眠模式。
当按下按钮后,控制器在秒后立即唤醒即时,这是不希望的,因为这可能是Accenteplent Press。
在按下按钮5秒后,您可以让我们知道如何从Hibernate模式实现唤醒唤醒吗?
此致,
马利
嗨powersquare,
在我之前的评论中提到,在按下按钮后从Hibernate模式下唤醒控制器5秒,不可能实现。关于您的第一个要求,如果您需要支持,或者您已经实施过它,请您告诉我吗?
谢谢,PM_DIALOG.
亲爱的对话团队,
谢谢您的支持。
有关首先要求,我们计划实施如延迟5秒,并检查是否仍按下按钮。如果它被按下,那么转到休眠状态,然后继续使用相同的状态。我们计划如下所示:
/ *设置k1按钮的唤醒控制器,如下* /
hw_wkup_set_debounce_time(63);
hw_wkup_set_pin_state(hw_gpio_port_1,hw_gpio_pin_6,true);
hw_wkup_set_pin_trigger(hw_gpio_port_1,hw_gpio_pin_6,hw_wkup_pin_state_low);
hw_wkup_register_interrupt(wkup_handler,configlary_max_syscall_interrupt_priority);
/ * wkup_handler()* /
运行循环5次// for循环
{
延迟(1000 ms)// os_delay_ms(1000);
检查按钮状态// hw_gpio_get_pin_status(hw_gpio_port_1,hw_gpio_pin_6);
如果(低){循环}
否则{设置标志并打破循环}
}
if(标志未设置)
{
pm_set_sleep_mode(pm_mode_hibernation);
}
上面的方法好吗?您是否建议了其他方法?
OS_DELAY_MS()函数在唤醒中断处理程序中工作吗?如果没有,任何其他替代解决方案。
此致
马利
嗨powersquare,
您可以使用软件实现的方法进行,通过轮询GPIO并使用计数器检查按钮5秒。请注意,如果从休眠中唤醒,设备将在5秒到期前唤醒,因此如果按下该按钮超过5秒,设备将保持在活动模式下,否则它将再次进入休眠状态。在活动模式的情况下,您必须检查计数器的值,且仅当按下该按钮5秒时,芯片将进入休眠模式。
谢谢,PM_DIALOG.
亲爱的对话团队,
谢谢您的支持。
我们实施了第一个要求,即将控制器置于Hibernate模式,它可以正常工作。
对于第二个要求,即HiberBate唤醒,因为软件方法不起作用,您是否可以建议使用硬件定时器或kernal定时器进行此功能的其他方法。您能否为此建议任何示例代码?
此致
马利
嗨powersquare,
正如我之前提到的那样,在按下按钮5秒后,不可能从休眠模式唤醒设备。该芯片将较早从5秒醒来。
谢谢,PM_DIALOG.
亲爱的对话团队,
谢谢您的支持。
对于第一个要求,(将控制器放入Hibernate模式,在按钮5秒后按下5秒),我们使用Extended_sleep项目测试了此功能,此功能正常。按下5秒的K1按钮时,系统将进入Hibernate模式。
现在我们正在BLE_PERITWEL项目上测试此功能。我们将K1按钮引脚和移植的定时器功能从Extended_sleep项目(main.c)配置为ble_peripheral项目main.c文件。我们附加了BLE_PERITELAL项目的MAIN.c文件以供参考。SDK和BLE_PERITELAL项目中没有更改。只有更改在main.c文件中只能配置按钮和定时器功能。
当我们测试此功能时(当我们按下5秒的K1按钮时),系统将触及Hibernate并立即唤醒。我们不希望系统立即醒来。我们还在main.c文件中使用此设置进行了测试,PM_SET_WAKEUP_MODE(FALSE),但问题保持不变。
您可以帮助我们解决BLE_PERITWEL项目中的此问题。
此致
马利
亲爱的对话团队,
你有什么更新吗?
此致
马利
嗨powersquare,
为延迟道歉。我使用了附加的代码(main.c),并在DA14683 SoC和SDK1.0.14.1081上复制了您的问题。使用相同的main.c文件,使用DA14681 SOC而不是DA14683时不存在此问题。请查看SDK / CPM / SYS_POWER_MGR.C中的应用程序_WFI()函数。修订A(black_orca_ic_rev_a)适用于DA14681设备,修订版B(Black_orca_ic_rev_b)适用于DA14683设备。在sys_power_mgr.c文件的第1393号文件中,如果正在使用DA14681(Black_orca_ic_rev_a),则在休眠之前,禁用所有IRQ,除VBUS和WKUP之外,所有挂起的中断都被清除,以便系统未重置系统已经挂起的中断。这仅适用于DA14681设备。为此,在使用DA14683设备时,挂起的中断永远不会清除,因为IF-statege将始终为false。结果,系统在休眠后的系统,它会由于挂起的中断而立即唤醒。 Also, keep in mind that in ble_peripheral example of the SDK, you will have BLE activity, so the most possible reason for waking up is due to a pending BLE interrupt, in contrast with extended_sleep example. A possible workaround might be to modify the source code of sys_power_mgr.c in order to explicitly clear all the pending interrupts in case of DA14683. Please check a reference code snippet:
在DA14683的情况下,除了WKUP之外,所有挂起的中断都被清除,因为芯片只能从唤醒控制器唤醒而不是来自VBUS。请注意,这只是一个可能的解决方法,这是SDK团队没有测试的。
另一个解决方法是在将芯片放入休眠模式之前停止广告并停止任何其他BLE活动。
谢谢,PM_DIALOG.
亲爱的对话团队,
谢谢您的支持。
此解决方案似乎正常工作(在sys_power_mgr.c文件的第1393号线更改)。
您能与您的SDK团队确认这些更改吗?
此致
马利
嗨米莉,
很高兴你想到了你的问题。如果您发现解决方法有用,请将以前的ASWER标记为已接受。我已经alredy让SDK团队知道这一点。
问候,pm_dialog
亲爱的对话团队,
谢谢您的支持。
我们使用的是DA14683制造的定制板。此帖子中提到的按钮按下(5秒)在此定制板上不起作用。
该按钮在该板上的端口4,PIN4上配置。当我们按下此按钮5秒时,我们观察到HW_WKUP_HANDLER()函数在HW_WKUP.c文件中调用,但未调用回呼函数(INT_CB)。调用回函数使用hw_wkup_register_interrupt()在main.c中初始化。在HW_WKUP_HANDLER()中,控制进入内部“if(inter_cb){”循环,但不调用回拨。
你能帮助我们解决,为什么这个回电没有被称为?
此致
马利
嗨powersquare,
我通过以下论坛机票推动了谈话:
https://support.dialog-semicondiondiondiondum/forums/post/dialog-smartbond-bluetooth-low-energy -%ee2%80%93-software/active-mode-hibernate-mode.
谢谢,PM_DIALOG.