很抱歉耽搁了。我使用了你附上的代码(main.c),我复制了你的问题工作在DA14683 SoC和SDK1.0.14.1081。使用相同的main.c文件,当使用DA14681 SoC而不是DA14683时,这个问题不存在。请查看sdk/cpm/sys_power_mgr.c中的apply_wfi()函数。DA14681设备为A版(BLACK_ORCA_IC_REV_A), DA14683设备为B版(BLACK_ORCA_IC_REV_B)。在第1393行sys_power_mgr.c文件,如果DA14681 (BLACK_ORCA_IC_REV_A)正在使用,要冬眠之前,所有的终端请求被禁用和等待中断清除除了通风装置和WKUP,所以不重置,系统已经等待中断。仅适用于DA14681设备。为此,在使用DA14683设备时,不会清除挂起的中断,因为if语句总是为false。因此,系统进入休眠状态后,会立即因一个挂起中断而唤醒。另外,请记住,在SDK的ble_peripheral示例中,您将有BLE活动,因此唤醒的最可能的原因是BLE中断挂起,与extended_sleep示例相反。 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.按下按钮5秒后,将控制器置于休眠模式。
2.按下按钮5秒后将控制器从休眠模式唤醒。
当按下按钮后,控制器在秒后立即唤醒即时,这是不希望的,因为这可能是Accenteplent Press。
在按下按钮5秒后,您可以让我们知道如何从Hibernate模式实现唤醒唤醒吗?
最好的问候,
Malli
嗨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,真实);
hw_wkup_set_pin_trigger(hw_gpio_port_1,hw_gpio_pin_6,hw_wkup_pin_state_low);
hw_wkup_register_interrupt (wkup_handler configLIBRARY_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()函数在唤醒中断处理程序中工作吗?如果没有,任何其他替代解决方案。
最好的祝福
Malli
嗨powersquare,
你可以使用软件实现方法,通过轮询GPIO和检查柜台如果按钮被按下5秒。请注意,如果从冬眠中醒来,该设备会醒来期满前5秒,如果按钮被按下5秒以上设备将保持活跃模式,否则将再次进入休眠状态。在激活模式下,必须检查计数器的值,只有按下按钮5秒芯片才会进入休眠模式。
谢谢,PM_DIALOG.
亲爱的团队对话框,
谢谢你的支持。
我们实现了第一个要求,即将控制器设置为休眠模式,它工作得很好。
对于第二个要求,即HiberBate唤醒,因为软件方法不起作用,您是否可以建议使用硬件定时器或kernal定时器进行此功能的其他方法。您能否为此建议任何示例代码?
最好的祝福
Malli
嗨powersquare,
正如我之前提到的那样,在按下按钮5秒后,不可能从休眠模式唤醒设备。该芯片将较早从5秒醒来。
谢谢,PM_DIALOG.
亲爱的团队对话框,
谢谢你的支持。
对于第一个需求(按下按钮5秒后将控制器置于休眠模式),我们用extended_sleep项目测试了这个功能,效果很好。当K1按钮按下5秒后,系统进入休眠模式。
现在我们正在ble_peripheral项目上测试这个功能。我们配置了K1按钮引脚,并将计时器功能从extended_sleep项目(main.c)移植到ble_peripheral项目main.c文件。我们附上了ble_peripheral项目的main.c文件供您参考。在SDK和ble_peripheral项目中没有更改。只在main.c文件中进行了更改,以配置按钮和计时器功能。
当我们测试这个功能时(当我们按下K1按钮5秒),系统进入休眠并立即唤醒。我们不希望系统立即醒来。我们还在main.c文件pm_set_wakeup_mode(false)中测试了这个设置,但问题还是一样。
您可以帮助我们解决BLE_PERITWEL项目中的此问题。
最好的祝福
Malli
亲爱的团队对话框,
你有什么最新消息吗?
最好的祝福
Malli
嗨powersquare,
很抱歉耽搁了。我使用了你附上的代码(main.c),我复制了你的问题工作在DA14683 SoC和SDK1.0.14.1081。使用相同的main.c文件,当使用DA14681 SoC而不是DA14683时,这个问题不存在。请查看sdk/cpm/sys_power_mgr.c中的apply_wfi()函数。DA14681设备为A版(BLACK_ORCA_IC_REV_A), DA14683设备为B版(BLACK_ORCA_IC_REV_B)。在第1393行sys_power_mgr.c文件,如果DA14681 (BLACK_ORCA_IC_REV_A)正在使用,要冬眠之前,所有的终端请求被禁用和等待中断清除除了通风装置和WKUP,所以不重置,系统已经等待中断。仅适用于DA14681设备。为此,在使用DA14683设备时,不会清除挂起的中断,因为if语句总是为false。因此,系统进入休眠状态后,会立即因一个挂起中断而唤醒。另外,请记住,在SDK的ble_peripheral示例中,您将有BLE活动,因此唤醒的最可能的原因是BLE中断挂起,与extended_sleep示例相反。 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之外,所有挂起的中断都被清除,因为芯片只能从WAKEUP控制器中唤醒,不能从VBUS中唤醒。请注意,这只是一个可能的解决方案,没有经过SDK团队的测试。
另一个解决方法是在将芯片放入休眠模式之前停止广告并停止任何其他BLE活动。
谢谢,PM_DIALOG.
亲爱的团队对话框,
谢谢你的支持。
此解决方案似乎正常工作(在sys_power_mgr.c文件的第1393号线更改)。
您能与您的SDK团队确认这些更改吗?
最好的祝福
Malli
嗨Malli,
很高兴你想到了你的问题。如果您发现解决方法有用,请将以前的ASWER标记为已接受。我已经alredy让SDK团队知道这一点。
问候,PM_Dialog
亲爱的团队对话框,
谢谢你的支持。
我们使用的是DA14683制造的定制板。此帖子中提到的按钮按下(5秒)在此定制板上不起作用。
该按钮配置在该单板的端口4、pin4上。当我们按下这个按钮5秒时,我们观察到hw_wkup_handler()函数在hw_wkup.c文件中被调用,但是回调函数(intr_cb)没有被调用。回调函数在main.c中使用hw_wkup_register_interrupt()初始化。在hw_wkup_handler()中,控件进入“if (intr_cb){”循环,但不会调用回调函数。
你能帮助我们解决,为什么这个回电没有被称为?
最好的祝福
Malli
嗨powersquare,
我通过以下论坛机票推动了谈话:
https://support.dialog-semicondiondiondiondum/forums/post/dialog-smartbond-bluetooth-low-energy -%ee2%80%93-software/active-mode-hibernate-mode.
谢谢,PM_DIALOG.