在过去的三个月里,我断断续续地在这个问题上苦苦挣扎,我花了几百个小时盯着我的电脑屏幕,尝试一些东西,记录结果,尝试其他东西(重复)。我在互联网上进行了大量的挖掘工作,但几乎没有发现任何构成该主题的权威资源。话虽这么说,这就是我发现的工作。需要注意的是,这些指令基于 ESP32 硬件。请注意,这仍然是一个正在进行的工作,因为还有一些清理工作要做。另请注意,这避免了必须执行手动/命令行任务,例如“makefile”。如果您来自使用 Arduino IDE 环境,您可能会喜欢这一点。
首先,关于开发环境的一些细节:
- 安装 MS Visual Studio 社区版(免费)。我安装了“使用 C++ 选项进行桌面开发”(Visual Studio link)
- 请注意,我正在为 ESP32 模块开发代码。有许多不同的模块可供选择,它们成本低(一个分线板上约 7 美元),功能非常强大(与 Arduino 硬件相比)并且嵌入了蓝牙和 WiFi。如果您使用的是其他硬件,那么剩余的一些步骤可能不适用/需要更改。
- 安装驱动程序(使用这些驱动程序以便 ESP32 自动分配一个 COM 端口)(Silabs link)
- 为 MSVS 安装 VisualGDB (download link),如以下链接所述:(VisualGDB tutorial) 请注意,如链接中所述下载 ESP32 工具链需要很长时间(一个小时?),请耐心等待。
- 注意文件夹 \SysGCC\esp32 在您的计算机上的位置(很可能在 C 驱动器的根目录中)。这是您在上一步中安装的 ESP32 工具链。
- 作为 VisualGDB 教程中描述的 VisualGDB 安装步骤的一部分,您必须更改“路径映射”。此时安装提示我从 VisualGDB 下载 CMake.exe。在“绝对路径(以 / 开头)”字段中,您需要输入我上面描述的 SysGCC 的路径(我的是 C:\SysGCC\esp32)
- 此时您应该能够将 ESP32 模块连接到您的计算机并使用 VisualGDB 中的“新建嵌入式项目”向导创建一个简单的项目。我一般选择“LEDBlink”。请注意,我使用的大多数 ESP32 板在 GPIO 2 上都有内置 LED,而不是 GPIO 5(这是向导中的默认设置)。
到目前为止,一切都很好。确认您可以闪烁 LED。拍拍你的手,高兴地大喊,喝杯啤酒,或者做任何你想庆祝的事情。在这一点上,我们并没有真正帮助导入 Arduino 代码,所以这里才是真正有趣的地方。
- 记下 LEDBlink 项目文件夹在硬盘上的位置。
- 从Espressif on Github 下载 ESP32 的 Arduino 内核。
- 将下载的 Arduino Core 中的所有 *.h、*.c 和 *.cpp 文件复制到 Blink 项目文件夹中,“variants”文件夹中的文件除外。我最终复制了 77 个文件。事实上,我首先创建了一个名为“批量库”的新文件夹,将所有源文件和头文件复制到其中,以便更轻松地为每个项目执行此步骤。
- “variants”文件夹包含大量子文件夹,每个子文件夹都包含一个名为“pins_arduino.h”的文件。您必须找到特定 ESP32 模块的文件夹,并将特定的“pins_arduino.h”文件放入您的项目文件夹中。
-
在您的项目源代码中,添加以下行:
#include "Arduino.h"
构建项目,您应该不会收到任何错误。
请注意,在项目的 MSVS 解决方案资源管理器窗口中,在外部依赖项下,您将看到复制到项目文件夹中的所有 *.h 文件的列表。这不会立即发生,但是在 MSVS 应用程序的左下角,您会看到后台发生了一堆事情,解析文件等,然后会出现外部依赖项。
现在在 app_main() 中添加以下行:
initArduino();
Serial.begin(115200);
如果您重建项目,您将在链接过程中遇到一些错误,因为对 *.cpp 文件的所有文件引用都没有(尚未)包含在您的项目中。
- 在解决方案资源管理器中,右键单击“源文件”和“添加现有项”,然后将所有 *.c 和 *.cpp 文件(不是 *.h 文件)添加到您的项目中
重建您的项目。您很可能会收到一些“(something).h: no such file or directory”的错误。这是因为在撰写本文时,乐鑫提供的 Arduino 内核还不完整。在错误列表中,记下错误的文件位置,然后从解决方案资源管理器的项目中删除此文件。例如,我有以下错误:
“vfs_api.h:没有这样的文件或目录”,错误位于文件 SD.cpp 中。所以我从项目中删除了 SD.cpp。一次一个文件地迭代这一步,直到你得到一个没有错误的构建。删除文件时记笔记(不要删除它们),以便在出错时将它们添加回来。根据您添加到项目中的源文件,您可能需要在此处进行一些额外的调试。在查看重建期间生成的错误列表时,请耐心等待并期待一些尝试和错误。当你的项目编译没有错误时,再喝一杯(或两杯)庆祝一下。
-
在您的项目源代码中,添加以下行:
Serial.println("Hello World!");
我把它放在了 blink-task 函数的 while(1) 循环中。每次 LED 闪烁时,这行代码将写入串行端口一次。由于 Serial.println 是一个 Arduino 函数,您可以放心,至少 这个 Arduino 库已启动并正在运行。我相信您应该能够在您的项目中添加更多#include(例如 Wire.h)并以相同的方式继续(但现在请稍等)。
- 重建并上传到 ESP32。打开串行端口监视器(MSVS 窗口顶部附近的按钮,COM 端口下拉列表的右侧)并确认您正在获得“Hello World!” LED 闪烁时显示消息。
现在,在您对将所有库、头文件和源文件“转储”到我的项目文件夹中感到悲伤之前,我意识到这不是最佳做法。如果您按照我的建议创建了“批量库”文件夹,您应该能够更好地组织您的项目。这留给读者一个简单的步骤。
由于此解决方案依赖于 ESP32 硬件和 VisualGDB,因此并不适合所有人。然而,它可以让您摆脱 Arduino IDE 幕后发生的“谜团”,并让您为更好的源代码控制和项目开发奠定基础。相关讨论见this link on sysprogs.com。