自助设计网站,汕头中英文网站推广,本周时事新闻概要10条,台州企业网站建设1. 简介 ESP32支持5种低功耗模式#xff0c;低功耗管理单元包括调压器、功耗控制器、电源开关单元、电源域隔离单元 (Isolation Cell) 等部分。
1.1 RTC单元 RTC单元是ESP32低功耗管理的核心#xff0c;可用于管理低功耗模式的进入和退出#xff0c;控制时钟源、PLL、电源开…1. 简介 ESP32支持5种低功耗模式低功耗管理单元包括调压器、功耗控制器、电源开关单元、电源域隔离单元 (Isolation Cell) 等部分。
1.1 RTC单元 RTC单元是ESP32低功耗管理的核心可用于管理低功耗模式的进入和退出控制时钟源、PLL、电源开关和隔离单元以产生电源门控、时钟门控和复位信号。 RTC单元主要包含以下几个模块
RTC主状态机记录电源状态数字和模拟电源控制器可用于为RTC的数字模块和模拟模块生成电源门控时钟门控信号睡眠和唤醒控制器可处理低功耗模式的进入和退出计时器包括RTC主计时器、ULP协处理器计时器和触摸计时器低功耗处理器和传感器控制器ULP协处理器、触摸控制器、SAR ADC控制器等保留内存RTC慢速内存绝大部分用作保留内存或存储ULP协处理器的指令和数据内存RTC快速内存绝大部分用作保留内存保留寄存器该寄存器永远开启可用于数据存储RTC IO管脚18 个“always-on”管脚通常作为唤醒源。
1.2 低功耗时钟 在低功耗模式下ESP32的40 MHz晶振和PLL通常将断电以降低功耗转而使用低功耗时钟维持工作。 RTC模块可以使用5个低功耗时钟源 外部低速晶振时钟XTL32K_CLK32.768 kHz外部高速晶振时钟XTAL_DIV_CLK2 MHz ~ 40 MHz内部RC振荡器RC_SLOW_CLK频率可调通常为150 kHz内部8MHz振荡器RC_FAST_CLK内部31.25 kHz时钟RC_FAST_DIV_CLK来自内部8MHz振荡器256分频。 以上的时钟源在RTC内部会区分成慢速时钟和快速时钟每个RTC内部模块所使用的时钟类型是不同的像RTC定时器、RTC主状态机和电源管理模块使用的是慢速时钟ULP协处理器、传感器控制器、RTC内存和RTC寄存器使用的是快速时钟。 对于数字内核无线模块则可以使用上面的4种时钟源。
1.3 低功耗模式
1. Active模式
CPU的工作时钟为XTAL_DIV_N40 MHz/26 MHz或PLL80 MHz/160 MHz/240 MHz芯片可以接收、发射或监听信号。
2. Modem-sleep模式
CPU可以工作时钟可以配置Wi-Fi蓝牙基带受时钟门限控制或关闭射频模块关闭PLL 为 80 MHz 时电流消耗≈ 30 mAXTAL 为 2 MHz 时电流消耗≈ 3 mA即刻唤醒
3. Light-sleep模式
内部 8 MHz 振荡器、40 MHz 高速晶振、PLL 及射频模块均禁用数字内核时钟受门限限制CPU暂停工作ULP 协处理器和触摸控制器可以周期性触发对传感器进行监测电流消耗≈ 800 µA唤醒延迟 1 ms
4. Deep-sleep模式
内部 8 MHz 振荡器、40 MHz 高速晶振、PLL 及射频模块均禁用数字内核断电CPU内容丢失RTC 内核的供电电压降至 0.7V8 x 32 位数据保存在通用保留寄存器中RTC 内存和快速 RTC 内存可以保持电流消耗≈ 6.5 µA唤醒延迟 1 ms。
5. 休眠模式
内部 8 MHz 振荡器、40 MHz 高速晶振、PLL 及射频模块均禁用数字内核断电CPU 内容丢失RTC 外设域断电RTC 内核的供电电压降至 0.7V8 x 32 位数据保存在通用保留寄存器中RTC 内存和快速 RTC 内存断电电流消耗≈ 4.5 µA唤醒源仅支持 RTC 计时器唤醒延迟 1 ms。
1.4 唤醒源
唤醒源Light-sleepDeep-sleep休眠EXT0YYNEXT1YYYGPIOYYNRTC定时器YYYSDIOYNNWiFiYNNUART0YNNUART1YNNTOUCHYYNULP协处理器YYN蓝牙YNN
2. 例程
2.1 RTC定时器唤醒 这个例程中配置RTC定时器使处理器在进入深度睡眠后5秒自动唤醒。
#include freertos/FreeRTOS.h
#include freertos/queue.h
#include esp_log.h
#include esp_sleep.h#include string.h#define TAG appint app_main()
{while (1) {ESP_ERROR_CHECK(esp_sleep_enable_timer_wakeup(5 * 1000000));ESP_LOGI(TAG, Enter deep sleep);esp_deep_sleep_start();ESP_LOGI(TAG, Exit deep sleep);}
}idf对低功耗的封装是比较完善的仅需两个函数就可以完成。 esp_sleep_enable_timer_wakeup配置定时器唤醒的时间单位为微秒。 默认情况下RTC定时器的时钟源选择的是RC_SLOW_CLK即内部150kHz振荡器因为该时钟源的功耗是最小的。如果需要更改时钟源需要修改CONFIG_RTC_CLK_SRC编译选项。 esp_deep_sleep_start使处理器进入深度睡眠模式当然也可以调用esp_light_sleep_start进入浅睡眠模式。 下面就是程序的系统打印log。需要注意的是因为深度睡眠下CPU会断电内部寄存器的内容丢失所以唤醒后程序是从头开始执行的。 2.2 按键唤醒 这个例程中配置处理器进入深度睡眠使用GPIO按键唤醒。 #include freertos/FreeRTOS.h
#include freertos/queue.h
#include esp_log.h
#include esp_sleep.h
#include driver/rtc_io.h#include string.h#define TAG appint app_main()
{esp_sleep_wakeup_cause_t cause esp_sleep_get_wakeup_cause();if (cause ESP_SLEEP_WAKEUP_EXT0) {ESP_LOGI(TAG, Wake up by EXT0);}while (1) {ESP_ERROR_CHECK(esp_sleep_enable_ext0_wakeup(0, 0));ESP_ERROR_CHECK(rtc_gpio_pullup_en(0)); // 内部上拉ESP_ERROR_CHECK(rtc_gpio_pulldown_dis(0));ESP_LOGI(TAG, Enter deep sleep);esp_deep_sleep_start();}
}如果要在深度睡眠模式下使用GPIO唤醒必须使用RTC GPIOESP32中只有部分GPIO可以复用为该功能。 我使用的是IO0作为唤醒脚。esp_sleep_enable_ext0_wakeup函数传入唤醒IO号和唤醒电平0就是低电平唤醒1就是高电平唤醒。 rtc_gpio_pullup/pulldown_dis/en函数配置GPIO的上下拉我设置成上拉模式。这里要注意即使板子上的IO带了硬件上下拉但是进入深度睡眠是会关闭VDD电源的所以还是需要配置。 同样使用esp_deep_sleep_start进入深度睡眠。 下面就是按键唤醒后的系统log。