你好呀,
如果你能帮助我有与冬眠和醒来有关的问题会很棒。:-)
因此,我们正在构建基于PXP-Reporter示例的应用程序,因为我们需要实现的Suota功能。到目前为止工作。
现在,我想添加一个计时器,在没有BLE活动的情况下几秒钟后会关闭设备。一个按钮(P3_0上的高效高)应再次唤醒设备并宽复位。然后它再次开始。
到目前为止,代码片段是:
main.c,system_init():......
pm_set_wakeup_mode(true);
pm_set_sleep_mode(pm_mode_hibernation);
//我不希望设备自动进入睡眠状态,因为过去已经有了BLE,所以保持清醒:
pm_stay_alive();
......
pxp_reporter_task.c,button_interrupt_cb():{
hw_wkup_reset_interrupt();
OS_TASK_NOTIFY_FROM_ISR(PXP_REPORTER_TASK_HANDLE,BUTTON_WKUP,OS_NOTIFY_SET_BITS);
}
pxp_reporter_task.c,pxp_reporter_task():......
/ *初始化唤醒定时器* /
hw_wkup_init(null);
/ *将唤醒定时器配置为在P3_0 * /的下降沿上中断
hw_wkup_configure_pin(hw_gpio_port_3,hw_gpio_pin_0,1,hw_wkup_pin_state_high);
//(我想知道这是否是我用例的正确实现?)
/ *注册回调以处理GPIO * /
hw_wkup_register_interrupt(button_interrupt_cb,1);
......
为了(;;) {
//我们需要一个在秒内以秒为单位进行比较(一个真正的RTOS-Timer会更好,但这也有效)
runtime_sec = os_get_tick_count()/ configtick_rate_hz;
//在有动态活动时更新runtime_old - 没有它,在十秒钟后,设备睡眠:
if(runtime_sec - runtime_old> 10){
pm_resume_sleep();
}
//这是普通的rtos事件队列,增加了唤醒事件:
RET = OS_TASK_NOTIFY_WAIT(0,OS_TASK_NOTIFY_ALL_BITS,&NOTIF,OS_TASK_NOTIFY_FOREVER);
......
/ *从按钮唤醒通知?* /
if(notf&button_wkup){
//重置平台:__disable_irq();
REG_SETF(CRG_TOP,SYS_CTRL_REG,SW_RESET,1);
}
对不起,凌乱的代码......
所以事情是 - 它有时只能......你可以看看,看看你是否在我的代码中看到了腥味?我从一些例子中复制了HW_WKUP代码,但我不确定它是否适合这里,因为HW_WKUP模块是关于我理解的计时器?
提前非常感谢,
菲利普
嗨dsandbue,
我为延迟道歉。我检查了代码片段,您可以在下面找到我的建议:
我的推荐和可能的解决方案可能是将延长睡眠模式设置为System_Init()的设备,使用计时器和其过期后使用PM_SET_SLEEP_MODE()API来设置休眠状态。通过连接到P3_0的按钮的唤醒过程似乎是正确的。此外,如果您在申请表中的其他情况下配置p3_0,请澄清您吗?
谢谢,PM_DIALOG.