我买了一些标有ESP 32模块的板。esptool将该版本报告为:
Chip is ESP32D0WDQ6 (revision (unknown 0xa))
Chip ID: 0xbc78e36d10fd
看上去很老。
我编写了几个ULP测试程序,所有的程序都按预期工作,除了唤醒指令,它似乎根本不起作用。我有预感这可能是一个旧的硬件限制,但我不确定。
在调用machine.deepsleep(0)之前,我确保启用了唤醒源:
mem32[ 0x3ff48038 ] = 0x200 << 10
这没什么用。我还尝试从ULP本身启用ULP唤醒:
WRITE_RTC_REG(RTC_CNTL_WAKEUP_STATE_REG, 21, 11, 0x200);
这也没用。四处搜索,似乎这个芯片可能是在ULP唤醒是稳定的之前。基于此,我认为这个模块不支持ULP上的wake,我必须将ULP的输出连接回复位引脚以使主CPU唤醒。这仍然会让我用ULP做一个更复杂的唤醒。我真正想要的是在一个合适的软件崩溃时间之后,或者在一段时间过去之后,在GPIO引脚转换上醒来。用例是一个输入,我想立即报告状态的变化,但是如果没有状态变化,我仍然希望每隔一段时间醒来一次,让接收者知道我还活着。
用引脚接回复位似乎不算太糟糕,但在我这么做之前,有人有更好的主意吗?例如,(在micropython中) machine.deepsleep(1000)工作,默认情况下使用timer 0。让ULP程序一直向后推那个计时器,直到它想要CPU唤醒为止,它会起作用吗?
发布于 2022-06-28 22:30:17
这是我做的。主要问题是在micropython方面--我使用的是v1.19.1,但我所需的更改实际上是在过去5天内完成的。在此更新之前,我认为在我设置ULP标志之后,会有什么东西在RTC_CNTL_WAKEUP_STATE_REG中删除它。我想不出原因;我把源代码追溯到一些ESP-以色列国防军代码,并发表了以下评论:
// TODO: move timer wakeup configuration into a similar function
// once rtc_sleep is opensourced.
不过,使用最新的micropython晚间版,您只需调用:
esp32.wake_on_ulp(True)
一切都如期而至。现在,在ULP中的唤醒指令之后,我得到了设置正确标志的重置:
rst:0x5 (DEEPSLEEP_RESET)
这就提供了许多有趣的、非常低功耗的可能性,甚至在micropython世界中也是如此。
我不确定我能不能解决这个问题,但微生物巨蟒团队为我找到了答案。向他们致敬。
https://stackoverflow.com/questions/72791643
复制相似问题