IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> ESP32——UPL 唤醒 -> 正文阅读

[嵌入式]ESP32——UPL 唤醒

UPL 唤醒

ULP协处理器是RTC外设电源域的一部分,它运行存储在RTC慢速存储器中的程序。ULP协处理器可以在芯片处于休眠模式时运行,可用于轮询传感器、监控ADC或触摸传感器值,以及在检测到特定事件时唤醒芯片。如果请求此唤醒模式,则 RTC 慢速内存将在睡眠期间打开电源。在ULP协处理器开始运行程序之前,RTC外设将自动通电;一旦程序停止运行,RTC外设将再次自动断电。

esp_sleep_enable_ulp_wakeup()该函数用于启用此唤醒源。

您可以使用以下命令上传 ULP 程序:

void init_ulp_program() {
    const ulp_insn_t program[] = {
            // initiate wakeup of the SoC启动SoC唤醒
            I_WAKE(),
            // stop the ULP program停止ULP程序
            I_HALT()
    };
 
    size_t load_addr = 0;
    size_t size = sizeof(program)/sizeof(ulp_insn_t);
    ulp_process_macros_and_load(load_addr, program, &size);
 
    ulp_run(0);
}

设置 ULP 唤醒周期的命令是:

esp_err_t ulp_set_wakeup_period(size_t period_index, uint32_t period_us);

参数:
报警周期设置(0 – 4)
唤醒周期的索引,以μs为单位period_index ``period_us a

成功

回报如果 period_index超出范围ESP_OK ESP_ERR_INVALID_ARG

用于唤醒 esp32 的 ULP 命令包括:

 // initiate wakeup of the SoC
    I_WAKE(),
// stop the ULP program
    I_HALT()

这是完整的草图:

/*
 *  ESP32
 *  DEEP Sleep and ULP wake up
 *  by Mischianti Renzo <https://www.mischianti.org>
 *
 *  https://www.mischianti.org/2021/03/23/esp32-practical-power-saving-preserve-gpio-status-external-and-ulp-wake-up-5/
 *
 */
 
#include "esp32/ulp.h"
#include "soc/rtc_cntl_reg.h"
#include "driver/rtc_io.h"
 
void init_ulp_program();
 
RTC_DATA_ATTR int bootCount = 0;
 
/*
Method to print the reason by which ESP32
has been awaken from sleep方法打印ESP32从睡眠中被唤醒的原因
*/
void print_wakeup_reason(){
  esp_sleep_wakeup_cause_t wakeup_reason;
 
  wakeup_reason = esp_sleep_get_wakeup_cause();
 
  switch(wakeup_reason)
  {
    case ESP_SLEEP_WAKEUP_EXT0 : Serial2.println("Wakeup caused by external signal using RTC_IO"); break;
    case ESP_SLEEP_WAKEUP_EXT1 : Serial2.println("Wakeup caused by external signal using RTC_CNTL"); break;
    case ESP_SLEEP_WAKEUP_TIMER : Serial2.println("Wakeup caused by timer"); break;
    case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial2.println("Wakeup caused by touchpad"); break;
    case ESP_SLEEP_WAKEUP_ULP : Serial2.println("Wakeup caused by ULP program"); break;
    default : Serial2.printf("Wakeup was not caused by deep sleep: %d\n",wakeup_reason); break;
  }
}
 
void setup() {
    Serial2.begin(115200);
    while( !Serial ){}
 
    Serial2.println("Init");
 
    //Increment boot number and print it every reboot
    ++bootCount;
    Serial2.println("Boot number: " + String(bootCount));
 
    //Print the wakeup reason for ESP32
    print_wakeup_reason();
 
    esp_sleep_wakeup_cause_t cause = esp_sleep_get_wakeup_cause();
    if (cause != ESP_SLEEP_WAKEUP_ULP) {
        Serial2.println("Initializing ULP");
        init_ulp_program();
        /* Set ULP wake up period to 5s */
        /*设置ULP唤醒周期为5s */
        ulp_set_wakeup_period(0, 5 * 1000 * 1000);
    }
 
    Serial2.println("Entering deep sleep\n");
    ESP_ERROR_CHECK( esp_sleep_enable_ulp_wakeup() );
 
    esp_deep_sleep_start();
}
 
void loop(){
}
 
void init_ulp_program() {
    const ulp_insn_t program[] = {
            // initiate wakeup of the SoC
            I_WAKE(),
            // stop the ULP program
            I_HALT()
    };
 
    size_t load_addr = 0;
    size_t size = sizeof(program)/sizeof(ulp_insn_t);
    ulp_process_macros_and_load(load_addr, program, &size);
 
    ulp_run(0);
}

串行2 输出为

Init
Boot number: 1
Wakeup was not caused by deep sleep: 0
Entering deep sleep
 
Init
Boot number: 2
Wakeup caused by ULP program
ULP wakeup
Entering deep sleep
 
Init
Boot number: 3
Wakeup caused by ULP program
ULP wakeup
Entering deep sleep

结束

你能砍掉所有的鲜花,但你不能阻止春天的到来。 – 巴勃罗?聂鲁达
在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:17:11  更:2022-03-06 13:18:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:20:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码