【ESP32-IDF】外设开发进阶:深度解析RTC_GPIO与低功耗场景应用

ESP32-GPIO & RTC GPIO 概述 ESP32芯片具有40个物理GPIO焊盘。某些GPIO焊盘无法使用或芯片封装上没有相应的引脚(请参阅技术参考手册)。每个焊盘都可以用作通用I / O或可以连接到内部外围信号。但需要注意两点: GPIO6-11通常用于SPI闪存。 GPIO34-39只能设置为输入模式,没有软件上拉或下拉功能。 还提供了单独的“ RTC GPIO”支持,这些GPIO连接到“ RTC”低功耗和模拟子系统,当芯片处于深度睡眠状态,需要运行超低功耗协处理器或使用ADC / DAC /等模拟功能时,这些GPIO便起作用。 阅读详情

1. RTC_GPIO:低功耗场景的守护者

如果你正在开发电池供电的物联网设备,那么ESP32的RTC_GPIO功能绝对是你必须掌握的利器。我在实际项目中多次使用RTC_GPIO来实现超低功耗的传感器节点,实测下来功耗可以降低到微安级别,让设备续航时间从几天延长到数月。

RTC_GPIO并不是一种新的GPIO类型,而是ESP32芯片中18个特殊引脚的低功耗工作模式。这些引脚编号为0、2、4、12-15、25-27、32-39,它们除了具备普通GPIO的功能外,还直接连接到芯片的RTC(实时时钟)子系统。这意味着即使主处理器进入深度睡眠状态,这些引脚仍然能够保持工作,实现电平保持和外部唤醒功能。

与普通GPIO通过IO_MUX和交换矩阵进行功能映射不同,RTC_GPIO由独立的RTC寄存器控制。这种架构设计使得在深度睡眠模式下,主电源域关闭后,RTC子系统仍然能够维持这些引脚的状态。我在设计智能门磁传感器时,就利用这个特性让设备在睡眠状态下持续监测门开关状态,只有当检测到状态变化时才唤醒主处理器,大大降低了整体功耗。

2. 深度睡眠模式下的电平保持技术

电平保持是RTC_GPIO最实用的功能之一。在普通GPIO模式下,当ESP32进入深度睡眠时,所有GPIO引脚都会恢复到默认状态,这可能导致外部设备断电或状态丢失。而RTC_GPIO可以在整个睡眠期间保持设定的电平状态,确保外部电路继续正常工作。

让我分享一个实际案例。我曾经开发过一个环境监测设备,需要控制一个数字传感器的工作状态。在深度睡眠期间,我需要保持传感器处于待机模式以节省功耗。使用普通GPIO时,每次睡眠唤醒后都需要重新配置传感器,而使用RTC_GPIO后,我可以在进入睡眠前设置好电平状态,整个睡眠期间都能保持这个状态。

实现电平保持需要几个关键步骤。首先需要配置引脚为RTC模式,然后使能保持功能:

#include "driver/rtc_io.h"

// 配置GPIO25为RTC输出引脚
rtc_gpio_init(GPIO_NUM_25);
rtc_gpio_set_direction(GPIO_NUM_25, RTC_GPIO_MODE_OUTPUT_ONLY);
rtc_gpio_set_level(GPIO_NUM_25, 1);  // 设置高电平

// 使能保持功能
rtc_gpio_hold_en(GPIO_NUM_25);

// 进入深度睡眠前使能全局保持
gpio_deep_sleep_hold_en();

需要注意的是,电平保持功能有一些限制。首先,只有输出模式才能有效保持电平状态,输入模式虽然也能启用保持,但实际意义不大。其次,保持的电平是进入睡眠前瞬间的电平状态,所以务必在设置好电平后再启用保持功能。我在早期项目中就犯过这个错误,先启用保持再设置电平,结果保持的是错误状态。

3. 外部唤醒机制的深度应用

外部唤醒是RTC_GPIO另一个强大的功能,它允许设备在深度睡眠状态下通过外部事件自动唤醒。ESP32支持两种主要的外部唤醒方式:电平变化唤醒和触摸传感器唤醒。这两种方式我在不同的场景中都使用过,各有其适用场景。

电平变化唤醒适用于按键检测、传感器信号触发等场景。例如在智能农业传感器中,我使用土壤湿度传感器的输出信号连接到RTC_GPIO,当湿度低于阈值时自动唤醒设备上传数据。配置电平变化唤醒相对简单:

// 配置GPIO36为唤醒源,下降沿触发
esp_sleep_enable_ext0_wakeup(GPIO_NUM_36, 0);

// 或者使用多个引脚的电平变化唤醒
#define WAKEUP_PIN_BITMASK (1ULL << GPIO_NUM_35 | 1ULL << GPIO_NUM_34)
esp_sleep_enable_ext1_wakeup(WAKEUP_PIN_BITMASK, ESP_EXT1_WAKEUP_ANY_HIGH);

触摸传感器唤醒则更适合人体接近检测、触摸控制等应用。ESP32内置了电容式触摸传感器功能,通过RTC_GPIO可以实现极低功耗的触摸检测。我在智能家居面板项目中就使用了这个功能,让设备在睡眠状态下仍然能够响应用户的触摸操作。

配置触摸唤醒需要注意一些细节。首先需要初始化触摸引脚,设置唤醒阈值:

#include "driver/touch_sensor.h"

// 初始化触摸引脚
touch_pad_init();
touch_pad_config(TOUCH_PAD_GPIO4_CHANNEL, 0);

// 设置唤醒阈值
touch_pad_set_thresh(TOUCH_PAD_GPIO4_CHANNEL, 100);

// 使能触摸唤醒
esp_sleep_enable_touchpad_wakeup();

在实际使用中,我发现触摸唤醒的灵敏度需要根据具体应用场景进行调整。阈值设置过高可能导致唤醒困难,设置过低则容易误触发。我通常会在产品测试阶段通过实验确定最佳阈值。

4. 电池供电传感器节点的实战设计

现在让我们来看一个完整的电池供电传感器节点的设计案例。这个项目是我为环境监测站开发的,要求设备能够持续工作至少一年以上。最终设计实现了平均功耗低于50μA的优异表现。

硬件设计方面,我选择了GPIO36用于模拟传感器信号输入,GPIO25控制传感器电源,GPIO32用于I2C通信。所有这些引脚都选择支持RTC功能的GPIO,确保在深度睡眠状态下能够正常工作和保持状态。

软件架构采用事件驱动设计,大部分时间设备处于深度睡眠状态,只有在外界条件满足时才短暂唤醒执行任务。以下是主循环的简化代码:

void app_main()
{
    // 初始化RTC GPIO
    setup_rtc_gpio();
    
    // 配置唤醒源
    setup_wakeup_sources();
    
    while (1) {
        // 读取传感器数据
        read_sensors();
        
        // 处理数据并判断是否需要上传
        if (need_upload()) {
            upload_data();
        }
        
        // 进入深度睡眠
        go_to_deep_sleep();
    }
}

void go_to_deep_sleep()
{
    // 保存当前状态
    save_system_state();
    
    // 设置传感器进入低功耗模式
    set_sensor_low_power();
    
    // 使能GPIO保持
    gpio_deep_sleep_hold_en();
    
    // 进入深度睡眠
    esp_deep_sleep_start();
}

在功耗优化方面,我采取了多项措施。首先是尽可能延长深度睡眠时间,只有在必要时才唤醒。其次是优化唤醒后的工作流程,尽量减少活跃时间。最后是合理配置GPIO状态,避免睡眠期间产生不必要的功耗。

我在这个项目中遇到的一个坑是GPIO内部上拉电阻的功耗问题。最初我没有注意到某些引脚使能了上拉电阻,结果在睡眠期间产生了额外的功耗。后来通过仔细检查每个引脚的配置,禁用不必要的上拉下拉电阻,成功降低了几个微安的功耗。

5. RTC_GPIO配置的注意事项和最佳实践

在使用RTC_GPIO时,有一些注意事项需要特别关注。首先不是所有GPIO都支持RTC功能,在使用前务必确认引脚的支持情况。我在项目初期就曾错误地选择了GPIO16,结果发现它不支持RTC功能,不得不重新设计电路板。

其次需要注意的是唤醒源配置的冲突问题。ESP32的ext0和ext1唤醒源有一些硬件限制,ext0只能使用一个引脚,而ext1可以使用多个引脚但有一些组合限制。在实际项目中,我建议仔细阅读技术手册中的相关章节,避免设计出无法实现的唤醒方案。

引脚状态管理也是需要注意的地方。从深度睡眠唤醒后,系统会重新初始化,之前的GPIO状态可能会丢失。如果需要保持状态,要么使用RTC_GPIO的保持功能,要么在唤醒后重新初始化状态。我通常会在系统初始化函数中处理状态恢复:

void setup_rtc_gpio()
{
    // 检查是否是深度睡眠唤醒
    if (esp_sleep_get_wakeup_cause() != ESP_SLEEP_WAKEUP_UNDEFINED) {
        // 从RTC内存恢复状态
        restore_rtc_memory();
        
        // 重新配置GPIO状态
        reconfigure_gpio_state();
    } else {
        // 冷启动初始化
        cold_start_init();
    }
}

在实际开发中,我还总结出一些最佳实践。首先是始终使用ESP-IDF提供的API来操作RTC_GPIO,避免直接操作寄存器,这样可以提高代码的可移植性和稳定性。其次是添加足够的状态监控和调试输出,特别是在开发阶段,可以帮助快速定位问题。

另外建议在正式产品中实现功耗监控功能。我通常在硬件设计中添加一个电流检测电路,通过软件记录各种状态下的功耗数据。这样不仅可以优化功耗,还能及时发现异常情况。

最后要强调的是测试的重要性。RTC_GPIO相关的功能需要经过充分的测试,特别是要模拟各种边界条件和异常情况。我通常会制定详细的测试计划,包括不同睡眠时间、不同唤醒频率、不同电源电压等多种场景的测试。

ESP32 GPIO上拉下拉电阻配置:操作指南 深入解析ESP32引脚的上拉与下拉电阻设置方法,帮助开发者精准控制电平状态。结合esp32引脚特性,提供实用配置建议与常见问题解决方案,提升电路稳定性与响应可靠性。 阅读详情

相关推荐

物联网低功耗实战:ESP32的RTC GPIO在深度睡眠中的关键作用

本文深入探讨了ESP32的RTC GPIO在物联网设备深度睡眠模式中的关键作用。通过分析RTC GPIO的架构优势和低功耗特性,详细介绍了硬件配置策略和软件实现方法,并提供了环境传感器节点的实战案例,展示了如何利用RTC GPIO实现极低功耗运行,显著延长电池续航能力。

uran的专栏 703

ESP32 学习笔记(二)GPIO & RTC GPIO

#

InfiniteYuan 1万+

ESP32 GPIO配置指南:基于引脚图的实用解析

深入解析ESP32的GPIO配置方法,结合esp32引脚图说明各引脚功能与使用注意事项,帮助开发者高效利用esp32引脚图进行项目开发,提升硬件控制精度与稳定性。

weixin_30951515的博客 359

二、ESP-IDF库函数之RTC GPIO

RTC GPIO1. 函数rtc_gpio_is_valid_gpio2. 函数rtc_gpio_init3. 函数rtc_gpio_deinit4. 函数rtc_gpio_get_level5. 函数rtc_gpio_set_level6. 函数rtc_gpio_set_direction7. 函数rtc_gpio_pullup_en8. 函数rtc_gpio_pulldown_en9. 函数rtc_gpio_pullup_dis10. 函数rtc_gpio_pulldown_dis 1. 函数rtc_g

hzy的博客 1475

ESP32 RTC原理与低功耗时间管理实战

实时时钟(RTC)是嵌入式系统实现精准计时和低功耗运行的核心组件,其本质是在主处理器休眠时仍能独立运行的硬件计时单元。RTC基于高稳定度32.768 kHz晶振或校准RC振荡器工作,通过专用电源域(VDD_RTC)和RTC内存保障掉电保持能力。技术价值体现在三方面:支持深度睡眠下的微安级功耗、提供唤醒中断源、保存关键状态数据。典型应用场景包括物联网终端周期采样、电池供电设备长期值守、多时区时间同步及NTP校准。本文以ESP32平台为载体,深入解析RTC硬件架构、Arduino-ESP32库API使用、UTC

weixin_31163455的博客 445

ESP32低功耗电子纸天气站设计与实现

电子纸(E-Paper)是一种基于微胶囊电泳技术的反射式显示器件,具备双稳态、超低功耗和类纸观感等核心特性,广泛应用于物联网终端、电子价签与环境监测设备。其工作原理依赖于带电颜料颗粒在电场作用下的定向迁移,刷新仅耗能、断电可持久驻留图像。该技术显著降低系统平均功耗,尤其适配电池供电的边缘节点。在工程实践中,结合ESP32的深度睡眠能力、BME280多参数传感与三色电子纸局刷优化,可构建续航长达百日的智能环境终端。本文以桌面级彩色天气站为载体,详解硬件选型、ESP-IDF外设初始化、RTC内存保留策略及差分渲

weixin_30600615的博客 971

ESP32 - ULP 协处理器在低功耗模式下操作 RTC GPIO

ESP32 - ULP 协处理器在低功耗模式下操作 RTC GPIO 的例子 本文目的是介绍 ESP32 如何在 ULP 协处理器中操作 RTC GPIO 1. RTC GPIO RTC GPIO 一共有 18 个 IO 口,这些 GPIO 管脚具有低功耗 RTC 性能和模拟功能,并且由 ESP32 的 RTC 子系统控制。这些功能不使用 IO_MUX 和 GPIO 交换矩阵,而是使用 R

乐鑫 Espressif 3472

ESP32远程唤醒原理与低功耗工程实践

远程唤醒是嵌入式物联网设备实现超长续航与事件响应的关键低功耗技术,其本质是在深度睡眠状态下通过硬件触发源(如RTC定时器、GPIO中断)恢复系统运行。该机制依赖于芯片级RTC子系统、电源管理单元(PMU)及唤醒源协同调度,并需配合轻量通信协议(如MQTT)完成指令接收与业务响应。在ESP32平台上,结合ESP-IDF框架的标准化API与RTC内存状态保持能力,可构建高可靠、低延迟的唤醒流程。典型应用场景涵盖智能闹钟、环境监控节点等对功耗与实时性双敏感的终端设备,本文即围绕ESP32远程唤醒的硬件约束、软件建

weixin_31486261的博客 584

ESP32-ULP协处理器低功耗模式RTC GPIO中断唤醒

​ 该示例展示了当 ULP 通过WAKE指令向 RTC 控制器发送中断信号时,主程序该如何配置中断处理函数以响应该中断信号。

晨之清风 2265

避坑指南:ESP32 Deep Sleep下GPIO状态保持,为什么你的RTC GPIO没锁住?

本文深入解析ESP32在Deep Sleep模式下GPIO状态保持的常见问题与解决方案,特别关注RTC GPIO的正确使用。通过硬件原理分析、API调用顺序优化及电源管理配置,帮助开发者避免GPIO状态丢失的陷阱,实现稳定的低功耗物联网设备设计。

weixin_42532938的博客 390

ESP32引脚上拉下拉配置:核心要点与寄存器关系

深入讲解esp32引脚的上拉与下拉配置方法,揭示其与底层寄存器的关联机制,帮助开发者精准控制esp32引脚电平状态,提升电路稳定性与响应可靠性。

weixin_42515340的博客 924

ESP32外设接口深度解析:从GPIO复用表到实际项目应用

本文深入解析ESP32的GPIO复用机制与外设接口配置,从寄存器层面揭示IO_MUX矩阵与GPIO交换矩阵的协同工作原理。通过SPI、I2C等实战案例,详细讲解如何规避引脚冲突并优化信号完整性,帮助开发者充分发挥ESP32的硬件潜力。特别针对物联网项目中常见的外设接口映射问题,提供专业级解决方案。

weixin_30693683的博客 823

告别屏幕闪烁:手把手教你用示波器抓取并分析MIPI DSI信号(以RK平台为例)

本文详细介绍了如何利用示波器抓取并分析MIPI DSI信号,以解决LCD屏幕闪烁、花屏等问题。以RK平台为例,从工具准备、示波器参数配置到信号捕获与波形解读,提供了一套完整的调试方案,帮助硬件工程师快速定位和解决显示接口信号完整性问题。

weixin_33704591的博客 656

从电容触摸到低功耗唤醒:ESP32 GPIO的跨界应用与设计哲学

本文探讨ESP32 GPIO从电容触摸到低功耗唤醒的跨界应用与设计哲学,重点分析其电容触摸传感器和RTC GPIO在深度睡眠模式下的协同工作,为物联网设备提供功能丰富且低功耗的解决方案,并通过外围电路设计实践优化性能。

neovim7hacker的博客 573

HDMI协议介绍(一)--Overview

HDMI全称(High Definition Multimedia Interface)高清多媒体接口,支持在单线缆上传输全数字高清视频和多声道音频。

SlamDunk的博客 2万+

Windows升级保留个人文件和应用灰色?改注册表版本指纹

Windows 升级安装并非简单跳过下一步,安装程序会先读取注册表中 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion 下的 EditionID、ProductName、CompositionEditionID 等版本指纹,与目标镜像 install.wim/esd 记录的版本类型做双向匹配。若当前系统被识别为 LTSC、精简版或跨版本降级,兼容性扫描会判定升级路径不可用,于是“保留个人文件和应用”变灰,只能全新安装。理解版本指纹与升级可行性表的匹配机制,可

weixin_31986143的博客 381

ESP-IDF低功耗开发终极指南:从基础配置到深度优化的完整解决方案

ESP-IDF(Espressif IoT Development Framework)是乐鑫科技官方推出的物联网开发框架,专为ESP32系列芯片打造。本指南将带你从基础配置到深度优化,全面掌握ESP-IDF的低功耗开发技巧,让你的物联网设备续航能力提升300%! ## 低功耗模式全景解析:3大核心模式对比 ESP-IDF提供三种核心低功耗模式,适用于不同应用场景: ### 1. 轻度睡眠(

gitblog_00730的博客 627

零成本接入Gemini Pro:GCP+NewAPI+OpenCode全栈方案

AI编程助手在现代开发流程中扮演着越来越重要的角色,其核心原理是通过大语言模型理解开发者意图并生成代码。以Gemini Pro为代表的顶级模型虽然能力出众,但成本控制和接入复杂度成为主要痛点。通过Google Cloud Platform的免费额度与开源工具链组合,开发者可以构建零成本的AI辅助开发环境。该方案采用Vertex AI作为基础模型服务,通过New API实现协议转换,最终与OpenCode终端工具深度集成。这种架构特别适合需要长期稳定使用AI编程助手的开发者,既能享受Gemini Pro的百万

weixin_29051245的博客 431

ESP32 GPIO与ESP-IDF工程实践:从LED到蓝牙HID开发基础

GPIO是嵌入式系统中最基础的硬件接口,其本质是处理器与物理世界的双向数字通道;理解其电气特性(如灌电流/拉电流能力)、配置模型(模式/中断/上下拉)及驱动抽象机制,是构建可靠外设控制的前提。在ESP32平台中,GPIO功能深度集成于ESP-IDF框架,依托FreeRTOS任务调度、中断管理与组件化设计,支撑起LED控制、按键消抖、低功耗唤醒等典型场景。这种软硬协同能力,进一步成为蓝牙HID等高级协议栈开发的前置基石——例如通过GPIO事件触发GATT写操作,或用LEDC硬件PWM实现状态指示。掌握GPIO

pytorch8learner的博客 815

FPGA 上的 YOLOv8 实时目标检测:从模型优化到硬件加速全解析

本文全面解析了将YOLOv8目标检测模型部署到FPGA进行硬件加速的完整流程。通过模型裁剪、混合精度量化等优化手段,结合HLS设计专用计算引擎与数据流,实现了高能效比的实时推理。文章深入探讨了软硬协同部署、性能调试与优化技巧,为追求极致实时性与低功耗的边缘AI应用提供了从算法到硬件的实战指南。

weixin_29031161的博客 609

本地服务器搭建Uptime Kuma网站监控服务

本文主要介绍如何在Linux系统中一键部署Uptime Kuma运维监控服务,并将这个服务映射至公网实现随时随地远程访问。如果您像我一样在服务器上托管了多个网站,并且没有足够的时间来手动检查每个网站的在线状态,那么当出现问题时,您可能无法及时收到通知来处理这些问题。因此,搭建一个在线监控服务是很有必要的,它可以在状态异常时提醒您,以便您能够及时处理问题,确保网站的稳定性和可用性。监控服务有很多,我最终选择了Uptime Kuma,因为Uptime Kuma是开源免费的,

Tiam_cr的博客 1826

ESP32 GPIO引脚约束与MicroPython底层控制原理

GPIO(通用输入输出)是嵌入式系统中最基础的硬件接口,其本质是一组可编程的数字电平控制单元,通过寄存器映射实现对引脚方向、电平、上下拉及中断行为的配置。理解其物理层约束(如复用功能、驱动能力、RTC域隔离)和软件抽象机制(如MicroPython的Pin类与ESP-IDF HAL映射关系),是保障系统稳定性的关键。ESP32因集成QSPI Flash、RTC子系统和双核架构,存在GPIO1/3串口冲突、GPIO6–11 Flash总线占用、GPIO34–39仅输入且无上下拉等典型硬约束。结合开漏输出、深度

ttt77的博客 1085

别再乱改grub.cfg了!手把手教你用GRUB2自定义多系统启动菜单(含UEFI/BIOS双模式配置)

本文详细介绍了如何安全、高效地使用GRUB2自定义多系统启动菜单,涵盖UEFI/BIOS双模式配置。通过避免直接编辑grub.cfg文件,采用正确的配置方法和命令,帮助用户打造稳定且美观的启动环境,特别适合Linux多系统用户和开发者。

weixin_42553471的博客 590

超越闪烁LED:ESP32 GPIO高级应用与低功耗深度睡眠实战指南

本文深入解析ESP32的GPIO高级应用与低功耗深度睡眠技术,重点介绍IO_MUX、GPIO交换矩阵和RTC IO_MUX架构,实战演示如何配置深度睡眠下的GPIO保持功能及多种唤醒机制,帮助开发者在电池供电的物联网设备中实现极致功耗优化。

grafana8visual的博客 195

Linkage Mapper 输出文件夹结构解析——LCPs(栅格廊道)、LinkagePaths(矢量廊道)、Nodes(节点)

Linkage Mapper输出文件解析摘要 Linkage Mapper是生态连通性分析的重要工具,通过最小累积阻力模型(MCR)识别物种迁移廊道。其输出包含三类核心文件: LCPs(栅格廊道):存储累积阻力值的栅格数据,直观展示低阻力路径,适用于空间分析和廊道质量评估。 LinkagePaths(矢量廊道):以矢量线状要素精确记录廊道位置和走向,便于地图可视化及连通性分析。 Nodes(节点):标记廊道关键点(起点/终点/交汇点),为保护策略制定提供依据。 典型应用场景包括: 山地物种(如大熊猫)栖息地

走向CTO的路上... 1334

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

ESP-IDF:乐鑫ESP32专用物联网开发框架深度解析

ESP-IDF是面向IoT场景深度优化的嵌入式开发框架,基于FreeRTOS实时内核与LwIP网络协议栈构建,提供硬件抽象、安全加密(mbedTLS)、无线通信(Wi-Fi/BLE/LoRaWAN)等一体化能力。其核心价值在于组件化架构与芯片级绑定设计,显著降低系统集成复杂度与兼容性风险。作为专为ESP32系列SoC定制的软件栈,它不支持STM32等通用MCU,强调从启动引导、外设驱动到OTA升级的全链路可控性。典型应用场景包括智能传感节点、工业边缘终端与低功耗广域网设备,尤其适合需要高稳定性、量产就绪与快

root9的博客 1160

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: 智能小车的“神经末梢”:深入GPIO与L298N的电气特性与安全设计
下一篇: 从零到一:OAK相机标定背后的数学原理与视觉几何解密
devops8pract
博客等级 码龄4年 533粉丝 849原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值