ESP32学习笔记(1)—— 搭建开发环境、编译烧录 hello world 工程(基于rtos sdk 3.3.2)

2023-11-10

前言

ESP32 是一套 Wi-Fi (2.4 GHz) 和蓝牙 (4.2) 双模解决方案。

sdk版本:v3.3.2

此次实验是在 Windows 10 系统下利用虚拟机安装 Ubuntu 16.04系统,并在此系统中进行开发编译和下载固件。

 

一、准备工作

此实验需要准备以下软件

1.Ubuntu 16.04系统:

系统搭建方法可以看我的另一篇文章 https://blog.csdn.net/m_pfly_fish/article/details/104872286

2.工具链(用于编译 ESP32 应用程序):

3.ESP-IDF:

包含 ESP32 API 和用于操作工具链的脚本。从git上克隆下来时间比较长,我这边备份了一份下载好的V3.3.2版本idf:

https://download.csdn.net/download/m_pfly_fish/12739713

4.代码编辑器,我使用的是 Source Insight 4.0。

 

二、设置工具链

2.1 安装软件包

设置工具链需要提前安装以下软件包

sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing libffi-dev libssl-dev

我因为已经安装完成了,所以显示如下:

2.2 设置工具链

下载64位的 esp32 工具链

下载完成后,将它解压到 ~/esp 目录:

mkdir -p ~/esp
cd ~/esp
tar -xzf ~/Downloads/xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz

2.3 设置环境变量

工具链将会被解压到 ~/esp/xtensa-esp32-elf/ 目录。

要使用工具链,你还需要在 ~/.profile 文件中更新环境变量 PATH。要使 xtensa-esp32-elf 在所有的终端会话中都有效,需要将下面这一行代码添加到你的 ~/.profile 文件中:

export PATH="$HOME/esp/xtensa-esp32-elf/bin:$PATH"

退出并重新登录以使 .profile 更改生效。 运行以下命令来检查 PATH 设置是否正确:

printenv PATH

设置成功应该能够找到工具链的安装路径

 

三、设置 ESP-IDF

3.1 获取 ESP-IDF

工具链(包括用于编译和构建应用程序的程序)安装完后,你还需要 ESP32 相关的 API/库。API/库在 ESP-IDF仓库 中。获取本地副本:打开终端,切换到你要存放 ESP-IDF 的工作目录,使用 git clone 命令克隆远程仓库:

cd ~/esp
git clone -b v3.3.2 --recursive https://github.com/espressif/esp-idf.git

ESP-IDF 将会被下载到 ~/esp/esp-idf 目录下。

3.2 设置 ESP-IDF 路径

在 ~/.profile 文件中加入以下指令,创建 IDF_PATH

export IDF_PATH=~/esp/esp-idf

运行以下命令以确保 IDF_PATH 已经设置好:

printenv IDF_PATH

此前在 ~/.profile 文件中输入(或者手动设置)的路径应该被打印出来。如果不想永久设置 IDF_PATH,每次重启或者注销时在终端窗口中手动输入:

export IDF_PATH=~/esp/esp-idf

3.3 安装依赖的 Python 软件包

ESP-IDF 所依赖的 Python 软件包位于 $IDF_PATH/requirements.txt 文件中,您可以通过运行以下命令来安装它们:

python2.7 -m pip install --user -r $IDF_PATH/requirements.txt

 

四、编译和烧写 hello_world 工程

4.1 创建 hello_world 工程

现在可以开始创建 ESP32 应用程序了。为了快速开始,我们这里以 IDF 的 examples 目录下的 get-started/hello_world 工程为例进行说明。

将 get-started/hello_world  拷贝到 ~/esp 目录:

cd ~/esp
cp -r $IDF_PATH/examples/get-started/hello_world

4.2 连接usb

用 USB 线将 ESP32 开发板连接到 PC,要查看 ESP32 开发板的串口设备名称,运行以下命令两次:

ls /dev/tty*

第一次先拔下开发板或适配器,第二次插入开发板或适配器之后再运行命令,第二次运行指令后出现的端口即是 ESP32 对应的串口

将自己的用户加入到dialout组获取usb权限

sudo usermod -aG dialout teashaw

teashaw改成自己的用户名,然后logout一下,就永久生效了。

4.3 工程配置

在终端窗口中,输入 cd ~/esp/hello_world 进入 hello_world 所在目录,然后启动工程配置工具 menuconfig

cd ~/esp/hello_world
make menuconfig

如果之前的步骤都正确,则会显示下面的菜单:

在菜单中,进入 Serial flasher config > Default serial port 配置串口(工程将会加载到该串口上)。输入回车确认选择,选择 < Save > 保存配置,然后选择 < Exit > 退出应用程序。

4.4 编译和烧写

执行指令:

make flash

这条命令会编译应用程序和所有的 ESP-IDF 组件,生成 bootloader、分区表和应用程序 bin 文件,并将这些 bin 文件烧写到 ESP32 板子上。

esptool.py v2.0-beta2
Flashing binaries to serial port /dev/ttyUSB0 (app at offset 0x10000)...
esptool.py v2.0-beta2
Connecting........___
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Attaching SPI flash...
Configuring flash size...
Auto-detected Flash size: 4MB
Flash params set to 0x0220
Compressed 11616 bytes to 6695...
Wrote 11616 bytes (6695 compressed) at 0x00001000 in 0.1 seconds (effective 920.5 kbit/s)...
Hash of data verified.
Compressed 408096 bytes to 171625...
Wrote 408096 bytes (171625 compressed) at 0x00010000 in 3.9 seconds (effective 847.3 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 82...
Wrote 3072 bytes (82 compressed) at 0x00008000 in 0.0 seconds (effective 8297.4 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting...

如果没有任何问题,在编译过程结束后将能看到类似上面的消息。最后,板子将会复位,应用程序 “hello_world” 开始启动。

4.5 监视器

如果要查看 “hello_world” 程序是否真的在运行,输入命令 make monitor。这个命令会启动 IDF Monitor 程序:

$ make monitor
MONITOR
--- idf_monitor on /dev/ttyUSB0 115200 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
ets Jun  8 2016 00:22:57
...

在启动消息和诊断消息后,你就能看到 “Hello world!” 程序所打印的消息:

...
Hello world!
Restarting in 10 seconds...
I (211) cpu_start: Starting scheduler on APP CPU.
Restarting in 9 seconds...
Restarting in 8 seconds...
Restarting in 7 seconds...

要退出监视器,请使用快捷键 Ctrl+]

如果串口打印的不是上面显示的消息而是类似下面的乱码:

e���)(Xn@�y.!��(�PW+)��Hn9a؅/9�!�t5��P�~�k��e�ea�5�jA
~zY��Y(1�,1�� e���)(Xn@�y.!Dr�zY(�jpi�|�+z5Ymvp

或者监视器程序启动失败,那么可能你的开发板用的是 26 MHz 晶振,而 ESP-IDF 默认的是 40 MHz 晶振。请退出监视器,回到配置,将 CONFIG_ESP32_XTAL_FREQ_SEL 改为 26 MHz,然后再次编译和烧写。请在 make menuconfig 的 Component config –> ESP32-specific –> Main XTAL frequency 中配置。

要一次性执行 make flash 和 make monitor,输入 make flash monitor。参考文档 IDF Monitor 里的快捷键和更多内容。

文档链接:https://docs.espressif.com/projects/esp-idf/zh_CN/v3.3.2/get-started/idf-monitor.html

4.6 更新 ESP-IDF

使用 ESP-IDF 一段时间后,你可能想要进行升级来获得新的性能或者对 bug 进行修复。最简单的更新方式是删除已有的 esp-idf 文件夹然后再克隆一个,即重复 获取ESP-IDF 里的操作。

然后在用户配置文件中添加 IDF_PATH,这样工具链脚本就能够知道这一版本的 ESP-IDF 的具体位置。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ESP32学习笔记(1)—— 搭建开发环境、编译烧录 hello world 工程(基于rtos sdk 3.3.2) 的相关文章

  • 手机在捕获 Wi-Fi 探测请求时不会发送所有存储的 ssid

    我使用 scapy 构建了一个脚本来捕获 monitornig wi fi 接口中的探测请求 我成功捕获了请求以及其中包含的一些 SSID 但手机中存储的大多数网络都不会被广播 对于为什么会发生这种情况 还没有一个明确的模式 有些手机根本不
  • 【ESP32接入国产大模型之文心一言】

    1 怎样接入文心一言 随着人工智能技术的不断发展 自然语言处理领域也得到了广泛的关注和应用 在这个领域中 文心一言作为一款强大的自然语言处理工具 具有许多重要的应用价值 本文将重点介绍如何通过ESP32接入国产大模型之文心一言api 以及其
  • 如何更新已创建的 Wi-Fi 配置(或“UID XXX 无权更新 [Wi-Fi] 配置错误”)?

    我正在开发一个管理 Wi Fi 连接的应用程序 我的场景如下 假设整个大楼都有一个名为 testing tls 的 Wi Fi 网络 我的应用程序应该能够仅连接到选定的接入点 基于 BSSID 或 MAC ID 我们用TLS 认证验证用户的
  • 如何使用 iPhone 使用蓝牙或 wifi 与 OBD II 通信

    我喜欢为 iOS 创建一个简单的应用程序 它通过 ODB II Wifi 蓝牙设备从汽车读取数据并显示在 iPhone 屏幕上 但我不知道从哪里开始 请有人帮助我实现以下结果 我有蓝牙和 WiFi 适配器 第 1 步 将蓝牙或 Wifi 适
  • 在监控模式下使用 libpcap 嗅探 wifi

    问题陈述 Calling pcap activate 结果是PCAP ERR RFMON NOTSUP错误 即不支持 RF 监控模式 Context 我正在编写一个小型 C 程序 其工作是在监视器模式下监听我的笔记本电脑的 wifi 卡 该
  • 我如何连接到名为“A”的受密码保护的 wifi

    如何连接到受密码保护的特定 WiFi 场景 有四个 wifi 网络 但我的应用程序需要连接到特定的网络 同时提供密码 你不能这样做 因为没有公共 API 可以做到这一点
  • 通过发送意图来启动 Android WiFi 管理器?

    我正在开发一个应用程序 我想要一个按钮 打开Android内置的WiFi菜单 我真的不想自己实现扫描和连接代码 我可以发送任何打开此菜单的意图吗 你应该使用ACTION PICK WIFI NETWORK http developer an
  • 如果未找到 Wi-Fi AP,则不会调用 NetworkCallback 的 onUnavailable() 方法

    我正在尝试将我的智能手机连接到 IOT 设备制作的 AP 我将connectivitymanager requestNetwork 与NetworkCallback 一起使用 一切正常 直到我关闭我的AP 并且显然requestNetwor
  • 我可以枚举可用的 WLAN 吗?

    我想获取我周围可用的 WLAN 的信息 例如 SSID 这可能吗 Edit 可能是 通过市场认证 的意思 不 这在当前的 API 集中不可用 而且我认为 Mango 集中也没有提到它
  • 如何使用 Objective-C 判断 iPhone 是否连接到 wifi 网络?

    在 Objective C iPhone 应用程序的上下文中 我需要能够判断 iPhone 是否已连接到 wifi 网络 并在可能的情况下侦听此状态的变化 有谁知道如何做到这一点 谢谢 加布伊 正如其他人提到的 可达性样本 https de
  • 关于 HTML 5 中的地理定位

    现在 Google 地图可以在 Firefox 的帮助下以街道精度精确定位我的位置 我知道这是 HTML 5 兼容浏览器的一项新功能 并且该位置是通过使用连接的 WiFi 网络的某种功能来获取的 我希望我没有做出任何愚蠢的假设 我想知道的是
  • 对 NEHotspotHelper.register 的调用永远不会返回

    我正在开发一个 iOS 应用程序 它需要自动连接到 WiFi 网络 我们已向 Apple 请求 NEHotspotHelper 扩展 该扩展已获得批准 现在我正在尝试自动连接到周围的WiFi网络 但是调用方法NEHotspotHelper
  • 无法理解 PcapNG 文件中的 802.11 数据帧格式

    I have PcapNG由 Wireshark 创建的文件 我尝试用它来解析python pcapng However I cannot figure out how to reconcile the output I receive f
  • ESP32 Arduino-ide如何获取唯一id

    我试图自动为每个 esp32 设置一个唯一的 id 在我使用提供该方法的 ESP IDF 框架对设备进行编程之前esp efuse mac get default 这将返回一个 8 字节值 该值在我手上的所有设备上都是唯一的 在arduin
  • 如何在 Mobile Safari 中检测 3G 与 Wifi 连接?

    我特别询问的是移动网页上的 javascript 而不是 Objective C 应用程序 是否有像 Apple Reachability for javascript 这样的东西 以便我可以知道 Edge 3G 或 Wifi 连接何时建立
  • iPhone 在个人热点模式下不发送网络广播/组播

    根据最近的实证研究结果以及网络上的各种帖子 在启用了个人热点的 iPhone 上运行的应用程序似乎无法将广播和 或多播发送到个人热点的网络上 任何人都可以阐明这个问题的原因吗 应用程序 我有一个用跨平台 C 代码构建的 IOS 应用程序 它
  • 多久轮询一次 wifi 信号强度?

    理想情况下 我希望近乎实时地监控无线网络的信号强度 比如每 100 毫秒一次 但如此高的频率可能有点过大了 我正在使用托管无线网络 http managedwifi codeplex com 库轮询 RSSI 我实例化一个WlanClien
  • 两个或多个 Android 设备之间的 WiFi 聊天

    我想开发一个聊天应用程序 使用 wifi 网络在两个或多个 Android 设备之间聊天 该应用程序应该能够相互发送或接收字符串 我有在pc和android之间使用蓝牙网络的经验 任何人都可以给我任何建议或正确的方向 提前致谢 您可以在两个
  • 从 ScanResult 构造 WifiConfiguration 或: 解释 ScanResult 的“功能”字符串

    你们中的 Android 专家知道任何开源代码来创建一个WifiConfiguration http developer android com reference android net wifi WifiConfiguration ht
  • 如何在 iOS 中通过 3G 连接创建无线热点

    如果我愿意 我将如何创建一个像这样的应用程序MyWi http intelliborn com mywi html 即 WiFi 网络共享应用程序 实现该功能需要哪些步骤 我需要使用哪些框架 库 我们的目标不是尝试将此应用程序放入应用程序商

随机推荐

  • 基于Spring-Data-Elasticsearch 优雅的实现 多字段搜索 + 高亮 + 分页 + 数据同步✨

    持续创作 加速成长 这是我参与 掘金日新计划 10 月更文挑战 的第17天 点击查看活动详情 系列说明 本系列文章基于我的开源微服务项目 校园博客 进行分析和讲解 所有源码均可在GitHub仓库上找到 系列文章地址请见我的 校园博客专栏 G
  • LinearEyeDepth 定义

    UnityCG cginc中原函数如下 Z buffer to linear 0 1 depth 0 at eye 1 at far plane inline float Linear01Depth float z return 1 0 Z
  • 重学STM32---(六)DAC+DMA+TIM

    这两天复习了DAC DMA再加上把基本定时器TIM6和TIM7看了一下 打算写一个综合点的程序 就在网上找了一些关于DAC DMA和定时器相关的程序 最终打算写了输出正弦波的程序 由于没有示波器 也就不能显示出效果了 本来是打算用软件调试看
  • linux获取ipv6公网ip,Linux 获取IPv6网关

    基于hisi3536实现的 ubuntu下只要找到对应的配置文件 ipv6 route 即可 include include include include include include include include include i
  • #ifdef #if defined #ifndef和#if !defined区别 详解-覆盖所有说明

    首先 让我们先从头文件开始 在很多头文件里 我们会看到这样的语句 ifndef MYHEADFILE H define MYHEADFILE H 语句 endif MYHEADFILE H 为了避免同一个文件被include多次 我们常使用
  • 浅谈构建iOS一个动态化页面的思路

    随着产品的不断迭代 功能的不断完善 我们的项目的中会给用户分成区域呈现出越来越多的东西 咕咚的精选给用户一种信息广场的概念 让用户可以快速的抵达我们感兴趣的点 既然如此 那么每一个项目的综合信息的页面经常会被改动 出现位置的调整 出现新的模
  • STM32中断与事件的理解

    推荐文档 事件与中断区别 目录 事件与中断区别 举例 膝跳反射 人们看见火灾之后打119 事件与中断区别 很多时候 我们经常使用到中断 但是STM32还有一个东西叫做事件 那么这个事件是什么呢 看了上面这个文档我们知道 1 中断是需要CPU
  • MyBatis的Mapper接口以及Example的实例函数及详解

    一 mapper接口中的方法解析 mapper接口中的函数及方法 方法 功能说明 int countByExample UserExample example thorws SQLException 按条件计数 int deleteByPr
  • c#中函数参数中的this(扩展方法)

    首先和大家说一下 最近参加实习了 所以更新可能比较少 而且对于大家提出的问题可能不能及时回复 希望大家理解 在我看完大佬的项目之后 感觉自己啥也不会 于是不出意外 之后再csdn上我就会更新我在项目中遇到的问题 希望对大家也有些帮助 c 函
  • Web前端vueDemo—实现简单计数器功能(一)

    系列文章目录 Web前端vueDemo 实现简单计数器功能 一 Web前端vueDemo 实现图片切换功能 二 Web前端vueDemo 实现记事本功能 三 Web前端vueDemo 实现天气预报功能 四 文章目录 系列文章目录 前言 一
  • mysql数据库登录失败次数_mysql数据库限制多次登录失败,限定用户重试时间

    前言 最近的项目开始进行安全测试 其中有一个安全问题是这样的 应该增加用户登录失败处理功能 限制非法登录次数 建议是增加mysql数据库的登陆失败的锁定功能 相信大家也都会遇到这样的问题 在这里写一下 方便大家直接使用 设置方法 登录mys
  • 封装、继承、多态 详解

    面向对象的三个基本特征 封装 继承 多态 1 封装 1 封装是实现面向对象的第一步 封装就是将数据或函数等集合在一个单元中 类 被封装的对象通常被称为抽象数据类型 2 类具有封装性 类能够把数据和算法 操作数据的函数 组合在一起 构成一个不
  • 【C++】虚函数

    2023年8月23日 周三上午 目录 虚函数 在派生类中重写虚函数 纯虚函数 示例程序 虚函数 在函数返回值前面加上关键字virtual 虚函数必须在类中声明 否则会报错 Error virtual outside class declar
  • SpringBoot整合MyBatis分页组件PageHelper

    介绍 SpringBoot整合MyBatis插件PageHelper实现业务分页逻辑 POM 添加MyBatis PageHelper FastJSON MySQL依赖
  • selenium webdriver一种解决打开chrome浏览器的过程

    1 下载59或58版本的Chrome浏览器 下载地址 http www pc6 com SoftView SoftView 22726 html 2 下载对应的驱动 驱动下载地址如下 当前我使用的版本是2 32 http npm taoba
  • Redis安装与源码调试

    linux版本 64位CentOS 6 5 Redis版本 redis 3 0 6 更新到2016年1月22日 Redis官网 http redis io Redis常用命令 http redis io commands 1 安装Redis
  • https://github.com/gfto/mptsd

    https github com gfto mptsd Tvheadend is a TV streaming server and digital video recorder It supports the following inpu
  • 理解React页面渲染原理,如何优化React性能?

    React JSX转换成真实DOM过程 当使用React编写应用程序时 可以使用JSX语法来描述用户界面的结构 JSX是一种类似于HTML的语法 但实际上它是一种JavaScript的扩展 用于定义React元素 React元素描述了我们想
  • 面对CUDA报错的种种解决办法

    面对CUDA报错的种种解决办法 1 cuda failure 4 1 cuda failure 4 检查是否被docker容器所挂载完
  • ESP32学习笔记(1)—— 搭建开发环境、编译烧录 hello world 工程(基于rtos sdk 3.3.2)

    前言 ESP32 是一套 Wi Fi 2 4 GHz 和蓝牙 4 2 双模解决方案 sdk版本 v3 3 2 此次实验是在 Windows 10 系统下利用虚拟机安装 Ubuntu 16 04系统 并在此系统中进行开发编译和下载固件 一 准