ESP32:在 ULP(深度睡眠期间)和主程序之间共享 ADC

问题描述 投票:0回答:1

我有一个程序在主程序期间从 ADC 引脚读取值,在深度睡眠模式下运行的 ULP 程序中使用相同的 ADC 引脚来决定何时唤醒主处理器。它是使用 arduino for esp32 框架编写的。

ULP 程序有一个计数器,可以让我看到它在另一个计时器的中断之间运行了多少次。奇怪的是,ULP 上的第一次运行按预期工作,它运行了正确的次数,并且如果我在 ADC 引脚上提供适当的值,它将被唤醒。然而,下次系统休眠时,它只会增加计数器一次,看起来 ULP 程序冻结了。我知道这在某种程度上与我在主程序中读取 ADC 的事实有关。如果我注释掉主程序中从 ADC 读取的行,那么我会得到预期的行为,并且 ULP 程序在每个睡眠周期上都能正确运行。当我启用主程序中从 ADC 读取的一行时,ULP 仅适用于第一次运行。

有什么建议吗?

在设置中,我加载 ULP 脚本并使用以下方法设置 ADC:

adc1_config_channel_atten(ADC1_CHANNEL_6, ADC_ATTEN_DB_11);
adc1_config_width(ADC_WIDTH_BIT_12);

在主程序中,我使用以下方法从 ADC 读取数据:

adc1_get_raw(ADC1_CHANNEL_6)

在进入深度睡眠之前,我设置了 ULP 周期,为 ULP 启用 ADC 并运行 ULP 程序:

ulp_set_wakeup_period(0, 500000);
adc1_ulp_enable();
ulp_run((&ulp_entry - RTC_SLOW_MEM) / sizeof(uint32_t));

编辑:似乎也与定时器中断有一些联系。如果我禁用计时器,每次都会正确中断 ULP 功能。只有在睡眠定时器唤醒引起的唤醒之后,ULP 才会按预期停止工作。

esp32 arduino-esp32
1个回答
0
投票

我也在开发一个 ulp 程序,这种错误令人难以置信地令人沮丧。

每次唤醒时未将wake_on_ulp 设置为True 时,我会得到相同的行为

© www.soinside.com 2019 - 2024. All rights reserved.