从冬眠和瑞克重置设备唤醒

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
2个帖子/ 0新
最后一篇
Dsandbue.
离线
最后一次露面:2年1个月前
加入:2017-02-15 14:09
从冬眠和瑞克重置设备唤醒

你好呀,

如果你能帮助我有与冬眠和醒来有关的问题会很棒。:-)

因此,我们正在构建基于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模块是关于我理解的计时器?

提前非常感谢,
菲利普

设备:
PM_DIALOG.
离线
最后一次露面:2天7小时前
职员
加入:2018-02-08 11:03
嗨dsandbue,

嗨dsandbue,

我为延迟道歉。我检查了代码片段,您可以在下面找到我的建议:

  • 我建议您将睡眠模式扩展到system_init()中,原因是当系统从休眠状态唤醒时,系统会从一开始就复位并运行。这不是软件重置,就像硬件复位一样,因此系统将从开始时运行代码,并且系统将再次执行(每次680从休眠中唤醒)
  • PM_STAY_ALIVE()不需要进入SYSTEM_INIT(),因为设置系统始终处于活动状态,并且它不是一个有效的方式。此外,不需要pm_resume_sleep()。
  • PINS配置完全正确,因为680可以通过唤醒控制器从休眠唤醒,因此您应该将P3_0配置为唤醒中断。您的实现是正确的。
  • 正如我能够看到你的代码片段,你禁用中断和软件重置发生。不建议手动进行软件重置,因为正如我在第一个评论中提到的,当设备从休眠状态中醒来时,代码将在硬件重置发生时从头开始运行。

我的推荐和可能的解决方案可能是将延长睡眠模式设置为System_Init()的设备,使用计时器和其过期后使用PM_SET_SLEEP_MODE()API来设置休眠状态。通过连接到P3_0的按钮的唤醒过程似乎是正确的。此外,如果您在申请表中的其他情况下配置p3_0,请澄清您吗?

谢谢,PM_DIALOG.