esp32编程

1:入口函数

ESP32:系统初始化启动过程
esp32开发程序中有且只能有一个app_main函数,该函数是用户程序的入口,相当于其它系统中的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返回的代码,继续进行启动,就好像是上电复位一样。注意,此时运行自定义代码,提供了一个深度睡眠存根机制。

对于上电复位,软件SOC复位和看门狗SOC复位
GPIO_STRAP_REG如果要求UART或SDIO下载模式,请检查寄存器。如果是这种情况,请配置UART或SDIO,并等待下载代码。否则,继续进行启动,就好像是由于软件CPU复位。

对于软件CPU复位和看门狗CPU复位
根据EFUSE值配置SPI闪存,并尝试从闪存加载代码。如果从闪存加载代码失败,将BASIC解释器解压缩到RAM中并启动它。当发生这种情况时,RTC看门狗仍然使能,因此除非解释器接收到任何输入,否则看门狗将在几百毫秒内重置SOC,重复整个过程。如果解释器从UART接收到任何输入,它将禁用看门狗。

可以看出,第一阶段主要是为了第二阶段做铺垫,应用程序二进制从地址0x1000开始从闪存加载。第一个4kB闪存扇区用于存储安全引导IV和应用程序映像的签名。

STEP2
在ESP-IDF中,闪存中位于0x1000位置的二进制映像是第二级引导加载程序。ESP-IDF的组件bootloader目录中提供了第二阶段引导加载程序源代码。这种安排并不是ESP32芯片中唯一的可能,也可以编写一个功能齐全的应用程序,当闪存到0x1000时,该应用程序将工作,ESP-IDF中使用第二阶段引导加载程序来增加闪存布局的灵活性(使用分区表),并允许发生与闪存加密,安全引导和空中更新(OTA)相关的各种流程。

当第一阶段引导加载程序完成检查和加载第二阶段引导加载程序时,它跳转到二进制映像头中找到的第二阶段引导加载程序入口点。

第二阶段引导程序读取在偏移0x8000处找到的分区表。引导加载程序找到工厂和OTA分区,并根据在OTA信息分区中找到的数据来决定哪一个进行引导。

对于所选分区,第二级引导加载程序将映射到IRAM和DRAM的数据和代码段复制到其加载地址。对于在DROM和IROM区域中具有加载地址的部分,Flash MMU配置为提供正确的映射。第二阶段引导加载程序为PRO和APP CPU配置闪存MMU,但只能为PRO CPU启用闪存MMU。这样做的原因是第二阶段引导程序代码被加载到APP CPU缓存使用的内存区域中。启用APP CPU的缓存的功能被传递给应用程序。一旦加载了代码并且设置了闪存MMU,则第二级引导加载程序将跳转到二进制映像头中的应用程序入口点。

目前,官方并不支持加载程序添加应用程序定义来自己定义应用程序分区选择逻辑。

STEP3
主函数镜像开始执行(即main_task,应用程序入口点是call_start_cpu0,可在components/esp32/cpu_start.c中找到),这个功能的两个主要作用是启用堆分配器并使APP CPU跳到其入口点call_start_cpu1。PRO CPU上的代码设置APP CPU的入口点,取消置位APP CPU复位,并等待由APP CPU上运行的代码设置的全局标志,表示已启动。一旦完成,PRO CPU跳转到start_cpu0功能,并且APP CPU将跳转到start_cpu1功能。

start_cpu0和start_cpu的功能并不是不可修改的,start_cpu0根据所做的选择启用或初始化组件默认实现,可以通过查看components/esp32/cpu_start.c观察最新的执行步骤列表,不过值得注意的是,此阶段将调用应用程序中存在的所有C++全局构造函数。一旦所有基本组件都被初始化,则创建主任务,并启动FreeRTOS调度程序。esp32是一个双核cpu,在这个过程中,当PRO CPU在start_cpu0功能中进行初始化时,APP CPU会自动start_cpu1运行功能,等待在PRO CPU上启动调度程序。一旦在PRO CPU上启动了调度程序,APP CPU上的代码也启动了调度程序。

main_task的任务是可以配置主任务堆栈大小和优先级,当然我们可以使用此任务进行初始的应用程序特定设置,例如启动其它任务。应用程序还可以使用事件循环和其它通用活动的主要任务。但是需要注意的是,如果app_main函数返回,main_task将被删除。

PS:ROM / RAM
ROM:Read_Only Memory:只读存储器;ROM中的信息一次写入后只能被读出,而不能被操作者修改或删除。一般用于存放固定的程序或数据表格等。
“只读”只是相对概念,不同类型的ROM可以用适当的方式进行擦除和改写;

–1.EPROM
–2. 闪存FLASH(PEROM):完全非易失的,可以在线写入,并且可以按页连续字节写入,读出速度快。

RAM:Random Access Memory 随机存储器(由触发器存储数据),是与CPU直接交换数据的内部存储器,也叫主存(内存);可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。
存储单元的内容可按需随意取出或存入,且存取的速度与存储单元的位置无关的存储器。这种存储器在断电时将丢失其存储内容,故主要用于存储短时间使用的程序。 按照存储单元的工作原理,随机存储器又分为静态随机存储器(英文:Static RAM,SRAM)和动态随机存储器(英文Dynamic RAM,DRAM)。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2022 / 01/ 30: 新版esptool 刷micropython固件指令不是 esptool.py cmd... 而是 esptool cmd... 即可;另外rshell 在 >= python 3.10 的时候出错解决方法可以查看:  已于2022年发布的: 第二章:修复rshell在python3.10出错 免费内容: https://edu.csdn.net/course/detail/29666 micropython语法和python3一样,编写起来非常方便。如果你快速入门单片机玩物联网而且像轻松实现各种功能,那绝力推荐使用micropython。方便易懂易学。 同时如果你懂C语音,也可以用C写好函数并编译进micropython固件里然后进入micropython调用(非必须)。 能通过WIFI联网(2.1章),也能通过sim卡使用2G/3G/4G/5G联网(4.5章)。 为实现语音控制,本教程会教大家使用tensorflow利用神经网络训练自己的语音模型并应用。为实现通过网页控制,本教程会教大家linux(debian10 nginx->uwsgi->python3->postgresql)网站前后台入门。为记录单片机传输过来的数据, 本教程会教大家入门数据库。  本教程会通过通俗易懂的比喻来讲解各种原理与思路,并手把手编写程序来实现各项功能。 本教程micropython版本是 2019年6月发布的1.11; 更多内容请看视频列表。  学习这门课程之前你需要至少掌握: 1: python3基础(变量, 循环, 函数, 常用库, 常用方法)。 本视频使用到的零件与淘宝上大致价格:     1: 超声波传感器(3)     2: MAX9814麦克风放大模块(8)     3: DHT22(15)     4: LED(0.1)     5: 8路5V低电平触发继电器(12)     6: HX1838红外接收模块(2)     7:红外发射管(0.1),HX1838红外接收板(1)     other: 电表, 排线, 面包板(2)*2,ESP32(28)  
学习ESP32编程环境,你需要掌握以下几个关键方面: 1. 安装ESP32开发环境:首先,你需要安装ESP32开发环境。你可以选择使用Arduino IDE、PlatformIO或ESP-IDF(ESP32官方开发框架)进行开发。根据你的偏好和需求选择适合的开发环境,并按照官方文档或教程进行安装。 2. 了解ESP32的基本知识:在开始编程之前,建议你先了解ESP32的基本知识。了解ESP32的硬件规格、引脚功能、内置模块(如WiFi、蓝牙、SPI、I2C等)以及其它特性,这将有助于你更好地理解和使用ESP32。 3. 学习编程语言:ESP32的主要编程语言是C/C++。如果你已经熟悉这门语言,那么你可以直接开始ESP32编程。如果你对C/C++不熟悉,建议你学习一些基本的语法和概念,如变量、函数、条件语句、循环等。 4. 掌握ESP32库的使用:ESP32支持许多库和框架,用于简化开发过程。一些常用的库包括WiFi库(用于无线通信)、Bluetooth库(用于蓝牙通信)、SPI库、I2C库等。学习如何使用这些库可以大大提高开发效率。 5. 学习示例代码和项目:为了更好地理解ESP32编程,你可以阅读官方文档中的示例代码和项目。这些示例代码和项目将帮助你了解ESP32的各种功能和用法,并为你构建自己的项目提供参考。 6. 参考文档和教程:在学习ESP32编程过程中,你可以参考官方文档、开发者社区和在线教程。官方文档提供了详细的API参考和使用指南,开发者社区是一个交流和分享经验的地方,而在线教程可以帮助你更快地上手ESP32编程。 7. 实践和调试:最重要的是,进行实践并进行调试。通过编写自己的代码并在ESP32上运行,你将获得更多实际经验和解决问题的能力。遇到问题时,学会调试并查找解决方案是非常重要的。 总的来说,学习ESP32编程环境需要一定的时间和实践。开始时可能会遇到一些挑战,但随着经验的积累,你将能够熟练地使用ESP32进行开发。不断学习、实践和尝试新的项目将帮助你不断提升编程技能。祝你学习愉快!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值