深入解析ESP32C3(1) - 使用ESP-IDF

乐鑫ESP32系列芯片是性价比非常高的嵌入式平台,不仅外设接口丰富,有较多的存储空间,还支持WIFI/BT等无线连接,同时也支持加密和权限管理等安全功能,这大大拓展了芯片的应用领域;当然,最重要的是该系列芯片的价格并不贵。个人是很看好ESP32系列芯片的前景,故此准备几篇文章来解析该芯片平台的功能,并为以后的开发做技术储备。

初次接触乐鑫ESP32,是从乐鑫的ESP-IDF开发环境开始的,这也是乐鑫主推的开发套件;另外也有Arduino开发套件,暂无涉及。IDF采用CMAKE编译系统,较晦涩复杂,本文不作解析,仅从使用IDF的角度出发。

IDF编译app固件按乐鑫官网的编程指南,安装好IDF开发环境,并复制examples\get-started\blink\作为测试用例,按下述命令编译测试:
>: idf.py set-target esp32c3    #配置目标芯片
>: idf.py menuconfig               #图像化配置功能宏,这里修改宏CONFIG_BLINK_GPIO为13
>: idf.py build                          #编译blink测试用例
    以下是整个编译过程的主要日志,可以看出涉及到哪些代码,以及编译结果。

Executing action: all (aliases: build)
Running ninja in directory G:\workspace\espressif\blink\build
Executing "ninja all"...
[0/1] Re-running CMake...
-- Building ESP-IDF components for target esp32c3
Processing 2 dependencies:            #项目依赖的组件来源[1/2] espressif/led_strip (2.5.2)     #项目目录下的组件:\blink\managed_components\espressif__led_strip
[2/2] idf (5.1.2)                     #ESP-IDF目录components\下的组件######编译器添加ESP32C3内部ROM的链接资源以及相关的组件代码路径,准备编译app(blink.bin)-- Project sdkconfig file G:/workspace/espressif/blink/sdkconfig
-- App "blink" version: 1
-- Adding linker script G:/workspace/espressif/blink/build/esp-idf/esp_system/ld/memory.ld
-- Adding linker script G:/Program/Espressif/frameworks/esp-idf-v5.1.2/components/esp_system/ld/esp32c3/sections.ld.in
-- Adding linker script G:/Program/Espressif/frameworks/esp-idf-v5.1.2/components/esp_rom/esp32c3/ld/esp32c3.rom.ld
-- Adding linker script G:/Program/Espressif/frameworks/esp-idf-v5.1.2/components/esp_rom/esp32c3/ld/esp32c3.rom.api.ld
-- Adding linker script G:/Program/Espressif/frameworks/esp-idf-v5.1.2/components/esp_rom/esp32c3/ld/esp32c3.rom.libgcc.ld
-- Adding linker script G:/Program/Espressif/frameworks/esp-idf-v5.1.2/components/esp_rom/esp32c3/ld/esp32c3.rom.newlib.ld
-- Adding linker script G:/Program/Espressif/frameworks/esp-idf-v5.1.2/components/esp_rom/esp32c3/ld/esp32c3.rom.version.ld
-- Adding linker script G:/Program/Espressif/frameworks/esp-idf-v5.1.2/components/esp_rom/esp32c3/ld/esp32c3.rom.eco3.ld
-- Adding linker script G:/Program/Espressif/frameworks/esp-idf-v5.1.2/components/soc/esp32c3/ld/esp32c3.peripherals.ld
-- Components: app_trace app_update bootloader bootloader_support bt cmock console cxx driver efuse esp-tls esp_adc esp_app_format esp_coex esp_common esp_eth esp_event esp_gdbstub esp_hid esp_http_client esp_http_server esp_https_ota esp_https_server esp_hw_support esp_lcd esp_local_ctrl esp_mm esp_netif esp_netif_stack esp_partition esp_phy esp_pm esp_psram esp_ringbuf esp_rom esp_system esp_timer esp_wifi espcoredump espressif__led_strip esptool_py fatfs freertos hal heap http_parser idf_test ieee802154 json log lwip main mbedtls mqtt newlib nvs_flash openthread partition_table protobuf-c protocomm pthread riscv sdmmc soc spi_flash spiffs tcp_transport ulp unity usb vfs wear_levelling wifi_provisioning wpa_supplicant
-- Component paths:  #上面的组件列表不止来源于ESP-IDF组件目录,还包含了项目目录(..../blink/)下的组件... ... ... (略)
[1/875] Generating project_elf_src_esp32c3.c[2/875] Generating ../../partition_table/partition-table.bin  #生成分区表镜像文件partition-table.bin 
Partition table binary generated. Contents:
*******************************************************************************
# ESP-IDF Partition Table
# Name,   Type, SubType, Offset,  Size, Flagsnvs,     data, nvs,     0x9000,  24K,       #非易失性存储,储存工厂校准数据和配置数据phy_init,data, phy,     0xf000,  4K,        #以太网PHY初始化数据factory, app,  factory, 0x10000, 1M,        #系统分区,例如工厂的生产固件,默认运行分区
*******************************************************************************
[3/875] Generating memory.ld linker script...... ... ... (略)  #编译组件的代码######编译器添加ESP32C3内部ROM的链接资源以及相关的组件代码路径,准备编译bootloader.bin-- Adding linker script G:/Program/Espressif/frameworks/esp-idf-v5.1.2/components/soc/esp32c3/ld/esp32c3.peripherals.ld
-- App "bootloader" version: 1
-- Adding linker script G:/Program/Espressif/frameworks/esp-idf-v5.1.2/components/esp_rom/esp32c3/ld/esp32c3.rom.ld
-- Adding linker script G:/Program/Espressif/frameworks/esp-idf-v5.1.2/components/esp_rom/esp32c3/ld/esp32c3.rom.api.ld
-- Adding linker script G:/Program/Espressif/frameworks/esp-idf-v5.1.2/components/esp_rom/esp32c3/ld/esp32c3.rom.libgcc.ld
-- Adding linker script G:/Program/Espressif/frameworks/esp-idf-v5.1.2/components/esp_rom/esp32c3/ld/esp32c3.rom.newlib.ld
-- Adding linker script G:/Program/Espressif/frameworks/esp-idf-v5.1.2/components/bootloader/subproject/main/ld/esp32c3/bootloader.ld
-- Adding linker script G:/Program/Espressif/frameworks/esp-idf-v5.1.2/components/bootloader/subproject/main/ld/esp32c3/bootloader.rom.ld
-- Components: bootloader bootloader_support efuse esp_app_format esp_common esp_hw_support esp_rom esp_system esptool_py freertos hal log main micro-ecc newlib partition_table riscv soc spi_flash
-- Component paths: ... ... ...
[668/875] Performing build step for 'bootloader'... ... ... (略) #编译bootloader组件的代码
Successfully created esp32c3 image.Generated G:/workspace/espressif/blink/build/bootloader/bootloader.bin  #生成引导镜像文件bootloader.bin
[96/96] cmd.exe /C "cd /D G:\workspace\espressif\blink\build\bootloader\esp-idf\esptool_py && G:\Program\Espressif\python_env\idf5.1_py3.11_env\Scripts\python.exe G:/Program/Espressif/frameworks/esp-idf-v5.1.2/components/partition_table/check_sizes.py --offset 0x8000 bootloader 0x0 G:/workspace/espressif/blink/build/bootloader/bootloader.bin"Bootloader binary size 0x5070 bytes. 0x2f90 bytes (37%) free.
[669/875] No install step for 'bootloader'
[670/875] Completed 'bootloader'[671/875] Generating x509_crt_bundle                     
[672/875] Generating ../../x509_crt_bundle.S... ... ... (略)#继续编译app的关联代码
[873/875] Linking CXX executable blink.elf
[874/875] Generating binary image from built executableesptool.py v4.7.0
Creating esp32c3 image...
Merged 1 ELF section
Successfully created esp32c3 image.Generated G:/workspace/espressif/blink/build/blink.bin  #生成APP镜像文件blink.bin
[875/875] cmd.exe /C "cd /D G:\workspace\espressif\blink\build\esp-idf\esptool_py && G:\Program\Espressif\python_env\idf5.1_py3.11_env\Scripts\python.exe G:/Program/Espressif/frameworks/esp-idf-v5.1.2/components/partition_table/check_sizes.py --offset 0x8000 partition --type app G:/workspace/espressif/blink/build/partition_table/partition-table.bin G:/workspace/espressif/blink/build/blink.bin"blink.bin binary size 0x2ec20 bytes. Smallest app partition is 0x100000 bytes. 0xd13e0 bytes (82%) free. 
######编译完成Project build complete. To flash, run this command:     #下载命令行:烧录所有镜像到ESP32C3开发板
G:\Program\Espressif\python_env\idf5.1_py3.11_env\Scripts\python.exe ..\..\..\Program\Espressif\frameworks\esp-idf-v5.1.2\components\esptool_py\esptool\esptool.py -p (PORT) -b 460800 --before default_reset --after hard_reset --chip esp32c3  write_flash --flash_mode dio --flash_size 2MB --flash_freq 80m 0x0 build\bootloader\bootloader.bin 0x8000 build\partition_table\partition-table.bin 0x10000 build\blink.bin
or run 'idf.py -p (PORT) flash'

 从代码的组成部分来看,一个测试用例,会涉及4个方面:

  • 测试用例本身,一般包含子目录main/等。
  • 测试用例的本地依赖组件,存放在子目录managed_components/下,比如blink\managed_components\espressif__led_strip。(可选项,可以没有)
  • IDF的平台组件,见IDF安装子目录 frameworks/esp-idf-v5.1.2/components
  • 芯片IROM的固件。不参与实际编译,作用于编译链接阶段,类似于一个动态链接库。固件的相关资源定义,见目录 frameworks/esp-idf-v5.1.2/components/esp_rom/esp32c3/ld/

从编译结果来看,测试固件分3个部分:

  • partition-table.bin  分区表镜像,定义各个分区的位置和大小
  • bootloader.bin  引导镜像,用于引导并加载应用镜像
  • blink.bin     APP应用镜像,含实际测试用例

最后的下载命令行用于烧录固件到ESP32C3开发板:

>: idf.py -p COM5  flash  #板子串口COM5
上述命令会烧录全部的固件,烧录地址和镜像文件的关系,如下
        0x00000 build\bootloader\bootloader.bin
        0x08000 build\partition_table\partition-table.bin
        0x10000 build\blink.bin
注意,烧录位置,并不在ESP32C3内部,而是SPI接口的外部flash存储芯片,下一小节讲述芯片的存储结构。
烧录地址并不是固定的,与分区表相关;分区表允许修改或重新指定配置文件,具体见IDF组件目录:components\partition_table\,默认分区表为partitions_singleapp.csv,分区信息见上面的编译日志。
当前的Flash分区存储结构如下:
 Bootloader     - 起始必须是0x00000,大小等于CONFIG_PARTITION_TABLE_OFFSET 
 PartitionTable - 起始为CONFIG_PARTITION_TABLE_OFFSET (0x8000),固定大小4KB
 nvs数据分区   - 紧挨上个分区结尾并4KB对齐:0x9000,大小24KB
 phy数据分区   - 紧挨上个分区结尾并4KB对齐:0xF000,大小4KB
 factory            - 紧挨上个分区结尾并4KB对齐:0x10000,大小1024KB

另,其他编译和烧录命令:

idf.py app   #单独编译APP,比如blink.bin
idf.py size  #查看APP占用RAM+ROM的情况
idf.py app-flash  #单独烧录app分区,比如将blink.bin烧录到默认app分区:factory
idf.py encrypted-app-flash #加密并烧录APP
idf.py bootloader #单独编译引导镜像
idf.py bootloader-flash #单独烧录引导镜像
idf.py partition-table #单独生成分区表镜像
idf.py partition-table-flash #单独烧录分区表镜像
idf.py erase-flash #擦除整块FLASH芯片,慎重!请先备份工厂的数据分区
idf.py erase-otadata #擦除OTA数据分区
idf.py read-otadata #读取OTA数据分区分区工具parttool.py的用法举例:
# 擦除名为'storage' 的分区
parttool.py --port "/dev/ttyUSB1" erase_partition --partition-name=storage
# 读取类型为'data'、子类型为'spiffs' 的分区, 保存到'spiffs.bin' 文件
parttool.py --port "/dev/ttyUSB1" read_partition --partition-type=data --partition-subtype=spiffs --output "spiffs.bin"
# 将'factory.bin' 文件中的内容写入到'factory' 分区
parttool.py --port "/dev/ttyUSB1" write_partition --partition-name=factory --input "factory.bin"
# 打印默认启动分区的大小
parttool.py --port "/dev/ttyUSB1" get_partition_info --partition-boot-default --info size
# 显示子命令的描述
parttool.py [subcommand] --help

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/635937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python使用pyechart分析疫情确诊人数图(2024)

import json from pyecharts.charts import Map from pyecharts import options as opts# 首先打开文件获取数据 f open("/Desktop/python/Project/数据可视化/疫情.txt", "r", encoding"UTF-8") data f.read()# 字符串转化成json数据 data_js…

Java多线程--创建多线程的基本方式一:继承Thread类

文章目录 一、创建和启动线程(1)概述(2)方式1:继承Thread类1、使用步骤2、举例2.1 案例12.2 案例22.3 案例3 3、两个问题3.1 问题13.2 问题2 4、代码及总结 二、练习(1)方式一(2&…

索引的概述和性能分析

索引index,是一种有序的数据结构,可以高效的获取数据,在数据库中维护着满足查找特定算法的数据结构,就是索引 无索引的情况,查询数据时会全表扫描,效率极低 索引结构 (1)二叉树&…

python解决求二叉树的最长同值路径问题

对于给定的一颗二叉树,需要找到最长的路径,并且该路径上的每个节点具有相同的值的问题,对于寻找到的这条路径可以经过根节点也可以不经过根节点,两个节点之间的路径长度是由他们的变数来表示的,给定如下图的二叉树 添加…

【 Qt 快速上手】-②- Qt 环境搭建

文章目录 1. Qt 开发工具概述1.1 Qt Creator 介绍1.2 Visual Studio 介绍1.3 Eclipse 介绍 2. Qt SDK 的下载与安装2.1 Qt SDK 的下载2.2 Qt SDK 的安装2.3 验证 Qt SDK 安装是否成功2.4 Qt 环境变量配置 1. Qt 开发工具概述 Qt 开发环境需要安装三个部分: C编译器…

小伙频繁发朋友圈引发分手,拼命“晒“生活是否成为一种病态行为?

根据《西湖之声》1月19日的报道,一个小伙子因为一天发十几条朋友圈而引起了他女友的不满,女友甚至提出了分手。现如今,朋友圈已经成为每个人自我形象展示的平台,认真发朋友圈不仅是表达自己的一种方式,也是一种自我释放…

redis缓存和本地缓存的应用设计

数据查询顺序 一级缓存:本地缓存 -》二级缓存:redis缓存 -》数据库 本地缓存和分布式缓存 本地缓存:基于jvm, 意思是程序放在哪,数据就存储在哪,不需要网络请求,特别快,但是需要占用jvm的内存…

Python利用Excel读取和存储测试数据完成接口自动化教程

http_request2.py用于发起http请求 #读取多条测试用例#1、导入requests模块import requests#从 class_12_19.do_excel1导入read_data函数from do_excel2 import read_datafrom do_excel2 import write_datafrom do_excel2 import count_case#定义http请求函数COOKIENonedef ht…

Unity之四元数计算

四元数相乘 #region 四元数相乘 Quaternion q Quaternion.AngleAxis(20, Vector3.up); this.transform.rotation * q; #endregion 四元数乘向量 Vector3 v Vector3.forward; print(v); //四元数乘向量的顺序不能改变,也就是说不能用向量去乘四元数,…

Spring Boot Aop 执行顺序

Spring Boot Aop 执行顺序 1. 概述 在 spring boot 项目中,使用 aop 增强,不仅可以很优雅地扩展功能,还可以让一写多用,避免写重复代码,例如:记录接口耗时,记录接口日志,接口权限&…

C# byte转int:大小端读取

参考:byte[]数组和int之间的转换 文章目录 Byte转为INT小端存储方式转int大端存储方式转int 大端模式和小端模式是计算机存储多字节数据时的两种方式。内存地址从小往大增长。 大端模式:最高有效(最高位)的字节存放在最小地址上&…

python 自动化模块 - pyautogui初探

python 自动化模块 - pyautogui 引言一、安装测试二、简单使用三、常用函数总结 引言 在画图软件中使用pyautogui拖动鼠标,画一个螺旋式的正方形 - (源码在下面) PyAutoGUI允许Python脚本控制鼠标和键盘,以自动化与其他应用程序的交互。API的设计非常简…

限流算法之流量控制的平滑之道:滑动时间窗算法

文章目录 引言简介优点缺点样例样例图样例代码 应用场景结论 引言 在互联网应用中,流量控制是一个重要的组件,用于防止系统过载和保护核心资源。常见的限流算法包括固定窗口算法和滑动时间窗算法。本文将重点介绍滑动时间窗算法,并分析其优缺…

【设计模式 行为型】策略模式

它允许在运行时根据需要选择算法的行为。该模式通过将算法封装成独立的类,使得它们可以相互替换,而不影响使用算法的客户端代码。 策略模式主要包含以下角色: 环境(Context):环境对象持有一个策略对象的引…

基于Abaqus的三种钢筋混凝土梁数值模拟对比研究

混凝土结构抗压强度高,而抗拉强度大约只有其十分之一,在受到竖向荷载(包括自重)作用下,梁下部会产生拉应力,上部产生压应力,而由于其抗拉强度低,因此很小的荷载即可导致梁下部开裂&a…

pytorch学习(二)、网络的构建和卷积层

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、nn.Module(网络的构建)二、torch.nn.functional.conv2d(卷积运算)三、神经网络--卷积层(一层卷积…

Mysql中的日志系统

文章目录 1. 慢查询日志(Slow Query Log)1.1 是否开启慢查询日志1.2 开启慢查询日志,设置时间阈值1.2.1 修改文件my.ini1.2.2 重启mysql后配置生效 1.3 查看慢查询日志1.3.1 直接用文本编辑器打开1.3.2 使用mysqldumpslow进行分析 2. InnoDB …

C语言从入门到实战——文件操作

文件操作 前言一、 为什么使用文件二、 什么是文件2.1 程序文件2.2 数据文件2.3 文件名 三、 二进制文件和文本文件四、 文件的打开和关闭4.1 流和标准流4.1.1 流4.1.2 标准流 4.2 文件指针4.3 文件的打开和关闭4.4 文件的路径 五、 文件的顺序读写5.1 顺序读写函数介绍fgetcfp…

【音视频原理】图像相关概念 ③ ( RGB 色彩简介 | RGB 排列 | YUV 色彩简介 | YUV 编码好处 )

文章目录 一、RGB 色彩1、RGB 色彩简介2、RGB 排列 二、YUV 色彩1、YUV 色彩简介2、YUV 编码好处 一、RGB 色彩 1、RGB 色彩简介 RGB 是 计算机 中的 颜色编码方法 , 红 ( R ) / 绿 ( G ) / 蓝 ( B ) 三个颜色通道 可以设置不同的值 , 每个 通道 的 颜色值都可以取值 0 ~ 255 ,…

【已解决】namespace “Ui“没有成员 xxx

先说笔者遇到的问题,我创建一个QWidget ui文件,然后编辑的七七八八后,想要用.h与.cpp调用其,编译通过,结果报了这个错误,本方法不是普适性,但是确实解决了这个鸟问题。 问题来源 搭建ui后&…