ESP-IDF 例程——custom_bootloader

4. custom_bootloader 目录

4.1 bootloader_hooks

字段 描述
例程名称 引导加载程序钩子示例
所在文件夹路径 examples\custom_bootloader\bootloader_hooks
核心功能说明 演示如何向第二阶段引导加载程序添加钩子函数,在引导加载程序初始化前后执行自定义代码
主要调用的内部/外部函数或模块 - bootloader_hooks.h 中定义的钩子函数接口
  • 自定义钩子函数实现(hooks.c)
  • bootloader初始化相关函数 |
    | 输入输出参数说明 | 配置参数:
  • 无特定输入参数,通过hooks.c实现钩子函数

输出结果:

  • 引导加载程序初始化前显示:”I (24) HOOK: This hook is called BEFORE bootloader initialization”
  • 引导加载程序初始化后显示:”I (60) HOOK: This hook is called AFTER bootloader initialization”
  • 应用程序启动显示:”User application is loaded and running.” |
    | 适用场景及典型应用案例 | - 需要在引导加载过程中执行自定义初始化操作
  • 引导加载程序阶段的设备状态检查
  • 自定义引导加载程序日志输出
  • 硬件初始化或检测 |

4.2 bootloader_override

字段 描述
例程名称 引导加载程序覆盖示例
所在文件夹路径 examples\custom_bootloader\bootloader_override
核心功能说明 演示如何完全覆盖ESP-IDF的第二阶段引导加载程序,实现自定义引导加载逻辑
主要调用的内部/外部函数或模块 - 自定义引导加载程序实现(bootloader_start.c)
  • KConfig配置系统
  • 链接器脚本 |
    | 输入输出参数说明 | 配置参数:
  • 通过KConfig定义自定义引导加载程序消息
  • 可通过CMake条件控制是否覆盖引导加载程序

输出结果:

  • 引导加载程序启动时显示:”[boot] Custom bootloader message defined in the KConfig file.” |
    | 适用场景及典型应用案例 | - 需要完全自定义引导加载程序逻辑
  • 实现特殊的引导加载顺序或安全检查
  • 添加自定义引导加载程序功能
  • 引导加载程序级别的设备保护 |

4.3 bootloader_multiboot

字段 描述
例程名称 多引导加载程序示例
所在文件夹路径 examples\custom_bootloader\bootloader_multiboot
核心功能说明 演示如何创建一个多引导加载程序,允许用户在启动时选择要运行的应用程序
主要调用的内部/外部函数或模块 - 自定义引导加载程序实现(bootloader_start.c)
  • 分区表管理
  • 应用程序选择界面
  • 键盘输入处理 |
    | 输入输出参数说明 | 配置参数:
  • 通过partitions.csv定义多个应用分区
  • 可配置引导菜单样式

输出结果:

  • 引导菜单显示所有可用的引导分区
  • 支持键盘选择和确认操作
  • 启动所选应用程序 |
    | 适用场景及典型应用案例 | - 开发多应用程序设备
  • 支持固件版本切换
  • 调试和测试多个应用程序
  • 实现恢复模式和主应用模式切换 |

4.4 bootloader_extra_dir

字段 描述
所在文件夹路径 examples\custom_bootloader\bootloader_extra_dir
核心功能说明 演示如何向引导加载程序构建添加自定义组件目录,实现引导加载程序功能扩展
主要调用的内部/外部函数或模块 - BOOTLOADER_EXTRA_COMPONENT_DIRS CMake属性
  • 自定义组件实现(extra_component.c)
  • 引导加载程序钩子机制 |
    | 输入输出参数说明 | 配置参数:
  • 通过CMakeLists.txt设置BOOTLOADER_EXTRA_COMPONENT_DIRS
  • 自定义组件实现

输出结果:

  • 引导加载程序显示:”I (60) EXTRA: This function is called from an extra component”
  • 应用程序正常启动 |
    | 适用场景及典型应用案例 | - 模块化扩展引导加载程序功能
  • 分离引导加载程序自定义代码
  • 实现可复用的引导加载程序组件
  • 简化复杂引导加载程序的维护 |

4.5 技术要点

  • 引导加载程序组件命名规则:
    • bootloader_components/main - 完全覆盖第二阶段引导加载程序
    • bootloader_components/any_name - 添加引导加载程序组件和钩子
  • 钩子函数类型:
    • 初始化前钩子:在引导加载程序初始化前执行
    • 初始化后钩子:在引导加载程序初始化后、加载分区前执行
  • 多引导实现:
    • 需要自定义分区表
    • 支持factory分区和多个ota_n分区
    • 应用程序名称显示为项目名而非分区名
  • 额外组件添加:
    • 通过BOOTLOADER_EXTRA_COMPONENT_DIRS CMake属性实现
    • 支持目录路径或单个组件路径

4.6 构建与运行

所有custom_bootloader例程的构建方法基本一致:

  1. 配置目标芯片:idf.py set-target esp32
  2. 构建项目:idf.py build
  3. 烧录并监控:idf.py flash monitor

4.7 应用场景总结

  • 钩子机制:适用于需要在引导过程中执行少量自定义代码的场景
  • 完全覆盖:适用于需要深度定制引导加载程序的场景
  • 多引导:适用于需要在设备上运行多个应用程序的场景
  • 额外组件:适用于需要模块化扩展引导加载程序功能的场景

这些例程展示了ESP-IDF引导加载程序的高度可定制性,允许开发者根据需求灵活扩展或修改引导加载行为。


ESP-IDF 例程——custom_bootloader
https://blog.zhaosn.top/ESP32-examples/04.custom_bootloader/
作者
Zhao SN
发布于
2026年1月21日
更新于
2026年1月21日
许可协议