esp32 蓝牙启动流程_关于esp32的系统初始化启动过程及设计学习方法

本文详细解析了ESP32的启动流程,包括ROM中的第一级引导加载程序、第二级引导加载程序加载分区表和主应用程序,以及主应用程序执行的细节。重点介绍了如何从0x1000加载第二阶段引导加载程序,以及如何配置和启动主应用程序。此外,讨论了在开发ESP32时,结合FreeRTOS进行学习和应用的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于esp32,其开发程序中有且只能有一个app_main函数,该函数是用户程序的入口,这在没有调用FreeRTOS的系统中相当于函数main,但其实在app_main之前,系统还有一段初始化的过程,其大致可以分为以下三个过程:

ROM中的第一级引导加载程序将闪存偏移0x1000的第二级引导加载程序映像加载到RAM(IRAM和DRAM)。

第二级引导程序从闪存加载分区表和主应用程序映像。主应用程序包含RAM段和通过闪存缓存映射的只读段。

主应用程序图像执行。此时可以启动第二个CPU和RTOS调度程序。

以下将详细介绍这三个过程

STEP1:

第一阶段引导程序

系统first-stage bootload启动,对于系统的first-stage bootloader,其主要任务是负责从Flash的地址0X1000开始加载bootloader镜像到RAM中(此工程的bootloader文件由esp-idf中的component 目录下的bootloader\subproject\main\bootloader_start.c可以查看源码),在SoC复位后,PRO CPU将立即开始运行,执行复位向量代码,而APP CPU将保持复位。在启动过程中,PRO CPU执行所有初始化。call_start_cpu0应用程序启动代码功能中的APP CPU复位被取消置位。复位向量代码位于ESP32芯片掩码ROM中的地址0x40000400,不能修改。

从复位向量调用的启动代码通过检查GPIO_STRAP_REG(gpio_reg.h定义的)引导引脚状态的寄存器来确定引导模式。根据复位原因,发生以下情况:

从深度睡眠复位:如果值为RTC_CNTL_STORE6_REG非零,并且RTC存储器的CRC值RTC_CNTL_STORE7_REG有效,RTC_CNTL_STORE6_REG则将其用作入口点地址并立即跳转到其中。如果RTC_CNTL_STORE6_REG为零,或RTC_CNTL_STORE7_REG包含无效的CRC,或者一旦调用通过RTC_CNTL_STORE6_REG返回的代

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值