ESP32学习二:HelloWord编译及烧写
阅读原文时间:2021年04月20日阅读:1

ESP32学习二:HelloWord编译及烧写

认识HelloWorld

环境搭建好后,打开了ESP_IDF中的示例代码中的hello world,它的目录结构如下:

  • .vscode (VSCode 项目配置目录
    • c_cpp_properties.json (C/C++项目配置
    • settings.json (工程配置
  • build (编译后的文件目录
  • main (工程主代码目录
    • CMakeLists.txt(main的CMake配置文件
    • component.mkmain组件的配置文件
    • hello_world_main.c(hello world代码
  • CmakeLists.txt (CMake配置文件
  • Makefile (make配置文件
  • REAADME.md
  • sdkconfig (make menuconfig生成的配置文件
  • sdkconfig.old(make menuconfig生成的备份配置文件

Makefile

make命令加载的配置文件, 这里面简单的,一个工程名helo-world,并include了ESP_IDF下的project.mk,这个文件内容很多,这里我没有详细的去看了

CMakeLists.txt

CMake加载的配置文件,内容同makefile一致,一个工程名helo-world,并include了ESP_IDF下的project.cmake.之里还定义了cmake的最小版本:

main

说到main目录,这里先学习了一下ESP-IDF 项目结构:这里引用一下官方文档里的一些概念:

一个 ESP-IDF 项目可以看作是许多不同组件的集合,例如对于一个展示当前湿度的网站服务器来说,它可能会包含如下一些组件:
1.ESP32 基础库(libc,rom bindings 等)
2.WiFi 驱动库
3.TCP/IP 协议栈
4.FreeRTOS 操作系统
5.网站服务器
6.湿度传感器的驱动
7.将上述组件组织在一起的主代码
ESP-IDF 可以显式地指定和配置每个组件。在构建项目的时候,编译系统会查找 ESP-IDF 目录、项目目录和用户自定义目录(可选)中所有的组件,然后使用基于文本的菜单系统让用户配置 ESP-IDF 项目中需要的每个组件。在配置结束后,编译系统开始编译整个项目
概念
项目: 特指一个目录,其中包含了构建可执行文件的所有源文件和配置,还有其他的支持型输出文件,比如分区表、数据/文件系统分区和引导程序。
项目配置: 保存在项目根目录下名为 sdkconfig 的文件中,它可以通过 make menuconfig 进行修改,且一个项目只能包含一个项目配置。
应用程序: 是由 ESP-IDF 构建得到的可执行文件。一个项目通常会构建两个应用程序:项目应用程序(主可执行文件,即用户自定义的固件)和引导程序(启动并初始化项目应用程序的引导程序)。
组件: 是模块化的、独立的代码,它们被编译成静态库(.a 文件)后再链接成应用程序,有些组件是 ESP-IDF 官方提供的,有些则可能来自其它项目。

main目录这里就可以看成一个特殊的组件,在这个HelloWorld并没有包含其它的组件。
main目录中的CMakeLists.txt
Cmake编译main组件的配置,可以看到其中设置源码的位置,并册了组件

main目录中的component.mk
make编译main组件的配置,这里是个空文件,会默认编译该目录下的所有代码。

hello_world_main.c

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"

void app_main()
{
    printf("Eric, Hello world!\n");

    /* Print chip information */
    esp_chip_info_t chip_info;
    esp_chip_info(&chip_info); //获取芯片信息
    printf("This is Eric's ESP32 chip with %d CPU cores, WiFi%s%s, ",
            chip_info.cores,
            (chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "",
            (chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : "");

    printf("silicon revision %d, ", chip_info.revision);
    printf("%dMB %s flash\n", spi_flash_get_chip_size() / (1024 * 1024),
            (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");

    for (int i = 10; i >= 0; i--) {
        printf("Restarting in %d seconds...\n", i);
        vTaskDelay(1000 / portTICK_PERIOD_MS); //延时1秒
    }
    printf("Restarting now.\n");
    fflush(stdout); //冲洗标准输出
    esp_restart(); //重启
}

编译

查看开发板端口

在编译前,先把开发板连过USB连接到电脑上,电脑会自动安装所需要的驱动,在我的设备中查看对应的端口号,这里我的端口号是COM5:

如果安装驱动不成功可以手动下载安装:
CP210x USB to UART Bridge VCP Drivers

配置

打开mingw32窗口,进入到项目目录下,输入命令:

make menuconfig

这里修改了两个配置: Serial flasher config —>
Default serial port: COM5
Flash size: 4MB

编译

这里第一次编译使用 make all,也可以使用 make flash同样也会编译,完成后开始烧写。

$ make all
Toolchain path: /opt/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc
Toolchain version: crosstool-ng-1.22.0-80-g6c4433a5
Compiler version: 5.2.0
Python requirements from F:/msys32/home/wx/esp/esp-idf/requirements.txt are satisfied.
Project is not inside a git repository, will not use 'git describe' to determine PROJECT_VER.
... ...
App "hello-world" version: 1
To flash all build output, run 'make flash' or:
python /home/wx/esp/esp-idf/components/esptool_py/esptool/esptool.py --chip esp32 --port COM5 --baud 115200 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 /home/wx/esp/hello_world/build/bootloader/bootloader.bin 0x10000 /home/wx/esp/hello_world/build/hello-world.bin 0x8000 /home/wx/esp/hello_world/build/partitions_singleapp.bin

这里归纳了一些命令:

     • make menuconfig – 运行配置菜单,做过kernel开发的会非常熟悉.
    • make defconfig - 为所有的配置项设置默认值
    • make all – 编译所有代码.
    • make flash – 把编译后的Bin文件烧写到ESP32中.
    • make clean – 清除编译产生的文件.
    • make monitor – 连接ESP32串口,并且输出ESP32的打印信息.
    • make erase_flash – 擦除ESP32上的整个Flash.
    • make size - 显示Bin文件中各个部分的大小
    • make size-components -, size-files - 每个模块所占内存的大小,这个在项目代码膨胀后还是比较有用的。
    • make app – 编译app.bin
    • make app-flash – 烧写app.bin
    其他的几个也可以顾名思义:
    • make app-clean –
    • make bootloader –
    • make bootloader-flash –
    • make bootloader-clean –
    • make partition-table –

烧写到开发板

使用make flash开始烧写到开发板

$ make flash
Toolchain path: /opt/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc
Toolchain version: crosstool-ng-1.22.0-80-g6c4433a5
Compiler version: 5.2.0
Python requirements from F:/msys32/home/wx/esp/esp-idf/requirements.txt are satisfied.
Project is not inside a git repository, will not use 'git describe' to determine PROJECT_VER.
App "hello-world" version: 1
Flashing binaries to serial port COM5 (app at offset 0x10000)...
esptool.py v2.6-beta1
Serial port COM5
Connecting........_
Chip is ESP32D0WDQ5 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
MAC: 30:ae:a4:d3:9f:60
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 24144 bytes to 14464...
Wrote 24144 bytes (14464 compressed) at 0x00001000 in 1.3 seconds (effective 146.1 kbit/s)...
Hash of data verified.
Compressed 146272 bytes to 70381...
Wrote 146272 bytes (70381 compressed) at 0x00010000 in 6.4 seconds (effective 181.4 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 103...
Wrote 3072 bytes (103 compressed) at 0x00008000 in 0.1 seconds (effective 431.5 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

刚开始烧写的时候遇到:
A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header
找了好久没找到具体原因,最后终于查到在烧写时候,在开始烧写的时候出现:
Connecting……_____…
这时需要按住开发板的Boot按钮, 到:
Chip is ESP32D0WDQ5 (revision 1)
出现的时候就可以松开了。

查看日志

烧写完成后,来看看有没有成功运行,我使用Xshell来查看日志,打开Xshell新建会话:


连接成功:

这时我们按下开发板上的复位按钮(EN),可以看到相应的日志出现:

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章