<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[从空白工程点亮一块小电台：BLUE LONG 独立硬件开发手册导读]]></title><description><![CDATA[<blockquote>
<p dir="auto">本文是《BLUE LONG 独立硬件开发手册》的导读与提炼。原手册 23 页，面向 Windows + VS Code + ESP-IDF 5.5.4，用四个例程把一台带外壳的小电台当成开发板来用。</p>
</blockquote>
<p dir="auto">先说一个前提，这是整本手册反复强调的第一句话：</p>
<p dir="auto"><strong>这台带外壳的小电台，本身也是一块可以编程的开发板。</strong> 但你要驱动它，不需要启动原产品那套消息、好友、菜单和 Mesh 系统——从<strong>一个全新的空白 ESP-IDF 工程</strong>开始就够了。手册的副标题写得很清楚："从空白工程开始，写下第一行自己的程序。"</p>
<hr />
<h2>一、为什么"新开一个工程"比自己改原系统更好</h2>
<p dir="auto">拿到一台能跑的产品设备，很多人的第一反应是"把源码改改再烧回去"。手册选择了相反的路：</p>
<ul>
<li>原产品的源码里有一整套业务：消息、好友、训练、Mesh、菜单、分区迁移。<strong>任何一行你还没读懂的业务代码，都是你第一次点亮屏幕时的噪音。</strong></li>
<li>独立工程只依赖板级硬件，编译产物小、启动路径短，出错时<strong>错误来源唯一</strong>。</li>
<li>原产品是"三槽 OTA 分区"，独立工程用的是普通开发分区。混着来的结果是：独立示例的 <code>partition-table</code> 和原版 app 拼在一起，谁也不认谁。</li>
</ul>
<p dir="auto">所以手册的目录结构就是一条最短路径：先在 Windows 上把工具链跑通 → 建空白工程 → 编译 → 再谈烧录 → 最后逐个点亮外设。</p>
<p dir="auto"><strong>注意手册自己的说法：本册没有烧录。</strong> 文中所有"上板后预期"都是需要用户自己逐项核对的预期值，不是已完成的实机记录。这个态度值得先记住，后面还会反复出现。</p>
<hr />
<h2>二、先分清三个"版本"，这是新手最容易掉的第一坑</h2>
<blockquote>
<p dir="auto">VS Code 是编辑器；ESP-IDF 扩展 2.3.0 是编辑器里的操作界面；ESP-IDF 5.5.4 是真正参与编译的 SDK 和工具链。</p>
</blockquote>
<p dir="auto">三件东西、三个版本号，互相独立：</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>东西</th>
<th>版本</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td>VS Code</td>
<td>随官方下载</td>
<td>编辑器</td>
</tr>
<tr>
<td>官方 ESP-IDF 扩展</td>
<td><strong>2.3.0</strong></td>
<td>提供 <code>ESP-IDF:</code> 开头的命令、状态栏、Build/Flash 按钮</td>
</tr>
<tr>
<td>ESP-IDF SDK</td>
<td><strong>5.5.4</strong></td>
<td>真正编译的 SDK 与 RISC-V 工具链</td>
</tr>
</tbody>
</table>
<p dir="auto"><strong>装了扩展 ≠ 装了 SDK ≠ 当前工程选中了那个 SDK。</strong> 手册里那条对仗很好记："扩展 2.3.0 不等于 SDK 2.3.0"。</p>
<p dir="auto">正确的顺序是四步：</p>
<ol>
<li>
<p dir="auto">装 VS Code，用"打开文件夹"打开一个<strong>新建的空目录</strong>（示例 <code>C:\BLUE_LONG_DEV</code>）。</p>
</li>
<li>
<p dir="auto"><code>Ctrl+Shift+X</code> 搜 <code>@id:espressif.esp-idf-extension</code>，<strong>核对发布者是 Espressif Systems</strong>，再 Install。要复现手册界面，在齿轮菜单里选 Install Another Version → 2.3.0。找不到图标时优先按 <code>F1</code> 搜命令名，而不是照抄别人的截图位置。</p>
</li>
<li>
<p dir="auto"><code>F1</code> → <code>ESP-IDF: Open ESP-IDF Installation Manager</code>，走 <strong>New Installation → Custom Installation</strong> 向导，把版本固定成 <strong>v5.5.4</strong>、芯片选 <strong>ESP32-C6</strong>、安装位置 <code>C:\Espressif</code>、勾选 IDE 集成。</p>
<p dir="auto">这里有个细节：<strong>不要用 Easy Installation</strong>，它是"装最新稳定版"。手册要固定 5.5.4，因为后面所有"编译通过"的结论都只对这个版本成立。国内网络可以直接用管理器自带的 Espressif 官方下载源。</p>
</li>
<li>
<p dir="auto">回到 VS Code：<code>F1</code> → <code>ESP-IDF: Select Current ESP-IDF Version</code> 选中 5.5.4 → <code>ESP-IDF: Doctor Command</code> 看诊断 → 最后在 <code>ESP-IDF: Open ESP-IDF Terminal</code> 里敲一句 <code>idf.py --version</code> 独立确认。</p>
</li>
</ol>
<p dir="auto">第 4 步那个 <code>idf.py --version</code> 非常重要：<strong>Doctor 说选对了不算数，命令行能跑出 <code>ESP-IDF v5.5.4</code> 才算数。</strong> 如果提示找不到 <code>idf.py</code>，说明你开的是普通 PowerShell 而不是 ESP-IDF 专用终端——环境变量根本没加载，这时候再怎么重装 SDK 都没用。</p>
<p dir="auto">还有一个很具体的坑：SDK 明明装了，但"选择版本"的列表里看不到。原因通常是扩展没读到 EIM（安装管理器）的登记文件。解法是让管理器重新识别该安装；还不行就在设置里搜 <code>idf.eimIdfJsonPath</code>，指向本机真实存在的 <code>eim_idf.json</code>。<strong>不要把版本号手填成路径，也不要照抄别人的用户目录。</strong></p>
<hr />
<h2>三、三条容易被忽略的硬约束</h2>
<h3>1. 路径必须是纯英文、短</h3>
<p dir="auto">手册把开发目录固定成 <code>C:\BLUE_LONG_DEV</code>，并且明确写了一条实测结论：</p>
<blockquote>
<p dir="auto">如果资料包解压在中文目录，先把完整 <code>examples</code> 文件夹复制到 <code>C:\BLUE_LONG_DEV\examples</code>，再从那里打开编号工程。<strong>本轮 ESP-IDF 5.5.4 在中文源码路径出现过 ccache/objdump 路径错误。</strong></p>
</blockquote>
<p dir="auto">这不是玄学。<code>ccache</code> 和工具链的路径处理在 Windows 上对非 ASCII 字符一直不太稳，<code>.bat</code> 能双击跑通，不代表官方工具链能处理同一条中文路径。<strong>能省掉的排查，就别留给运气。</strong></p>
<h3>2. 芯片要选 <code>esp32c6</code>，不是 <code>esp32c61</code></h3>
<p dir="auto"><code>ESP-IDF: Set Espressif Device Target</code> 的列表里两者相邻。手册特意给了放大图，标题就是"选择第一行 esp32c6，<strong>不是 esp32c61</strong>"。</p>
<p dir="auto">选错的后果不是"稍微有点问题"，而是整个工具链换成另一颗芯片的，后面所有错误都会是假错误。而且<strong>换 target 会重配工程</strong>，所以顺序必须是：先选 target，再写代码，最后编译。</p>
<h3>3. 4 MB Flash + 原生 USB 控制台</h3>
<p dir="auto">在 <code>SDK Configuration Editor</code> 里两处要改：</p>
<ul>
<li><code>Serial flasher config → Flash size</code> → <strong>4 MB</strong></li>
<li><code>Component config → ESP System Settings → Channel for console output</code> → <strong>USB Serial/JTAG</strong></li>
</ul>
<p dir="auto">第二项决定了你的日志从哪里出来。手册补了一句很关键的边界：<strong>GPIO12/13 就是原生 USB 的 D-/D+，不要拿去点灯、接按键或当调试方波用。</strong> 烧录成功但 Monitor 一片空白时，先查控制台选项和 COM 是不是同一台设备，<strong>不要因此去改 USB 引脚</strong>。</p>
<hr />
<h2>四、第一段代码：越短越好</h2>
<p dir="auto">空白工程创建完（<code>ESP-IDF: Create New Empty Project</code>，项目名 <code>blue_long_blank</code>，父目录 <code>C:\BLUE_LONG_DEV</code>），手册让它先只做一件事——打日志：</p>
<pre><code class="language-c">#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"

void app_main(void) {
    unsigned count = 0;
    while (1) {
        ESP_LOGI("hello", "Hello BLUE LONG %u", count++);
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}
</code></pre>
<p dir="auto">两个细节：</p>
<ul>
<li><code>app_main</code> 是应用入口，不是 <code>main</code>。</li>
<li><code>vTaskDelay</code> 是<strong>把 CPU 交还给系统</strong>，不是"睡一会儿"。用死循环空转等一秒，会把空闲任务饿死，看门狗和电源管理都会出问题。</li>
</ul>
<p dir="auto">初学阶段最容易误判的一件事：<strong>红色波浪线不等于编译失败。</strong> 先把 SDK 和 target 选对，再以 Build 输出的<strong>第一条真实错误</strong>为准。</p>
<hr />
<h2>五、引脚速查表：这张表决定了你后面所有代码</h2>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>功能</th>
<th>GPIO / 关系</th>
<th>开发时要记住</th>
</tr>
</thead>
<tbody>
<tr>
<td>OLED 与 RGB 供电使能</td>
<td><strong>GPIO4</strong>，高电平使能</td>
<td>共享电源，<strong>先拉高等 150 ms</strong> 再用</td>
</tr>
<tr>
<td>OLED I2C</td>
<td>SDA <strong>GPIO5</strong>、SCL <strong>GPIO6</strong></td>
<td>SSD1306，128×32，<strong>7 位地址 0x3C</strong></td>
</tr>
<tr>
<td>WS2812 RGB</td>
<td><strong>GPIO7</strong></td>
<td>数字单线时序，不是普通 PWM RGB</td>
</tr>
<tr>
<td>编码器 A / B</td>
<td><strong>GPIO2 / GPIO3</strong></td>
<td>两路交错相位，完整旋转要解码</td>
</tr>
<tr>
<td>编码器按下</td>
<td><strong>GPIO18</strong></td>
<td>按下为 <strong>LOW</strong>，独立事件 + 去抖</td>
</tr>
<tr>
<td>独立返回键</td>
<td><strong>GPIO19</strong></td>
<td>按下为 LOW，先处理按下沿</td>
</tr>
<tr>
<td>压电蜂鸣器</td>
<td><strong>GPIO20 / GPIO21</strong></td>
<td><strong>差分输出</strong>，静音 LOW/LOW，只做短提示</td>
</tr>
<tr>
<td>原生 USB D- / D+</td>
<td><strong>GPIO12 / GPIO13</strong></td>
<td>保留给 USB，不改普通 GPIO</td>
</tr>
<tr>
<td>GPIO0</td>
<td><strong>本轮禁止使用</strong></td>
<td>不配置、不采样、不套旧板 BOOT 接法</td>
</tr>
</tbody>
</table>
<p dir="auto">这张表里有三个设计点值得单独说：</p>
<p dir="auto"><strong>① 为什么 GPIO4 是"共享电源使能"。</strong> OLED 和 RGB 灯珠挂在同一路开关后面。所以只往 GPIO7 灌 WS2812 数据、却没开 GPIO4，屏幕不亮、灯也不亮——这不是代码错，是<strong>没通电</strong>。手册把"先 GPIO4 拉高，等 150 ms，再初始化 I2C 和发数据"写成了固定动作，150 ms 是给电源爬升和 OLED 内部复位留的余量。</p>
<p dir="auto"><strong>② 为什么蜂鸣器是差分驱动。</strong> 压电片两端接 GPIO20/21，同相 = 不振动 = 静音，反相 = 有电位差 = 发声。静音时<strong>两端都是 LOW</strong>，所以千万不要把任意一端当成固定接地——那样你只有一个推挽脚，还得额外加直流偏置。差分的好处是驱动电压翻倍、无直流偏置、音量更大。手册要求"约 80 ms、4 kHz 短提示，长按不延长"，是怕一直响把蜂鸣器烧了。</p>
<p dir="auto"><strong>③ 为什么 GPIO0 被划成禁区。</strong> 老 ESP32 教程里"进下载模式就 GPIO0 接地"是个条件反射，但这块板上 GPIO0 不用。手册专门写了一句：下载模式连不上时，<strong>不要套用旧 ESP32 教程把 GPIO0 接地</strong>；先查数据线、USB 驱动和端口占用。</p>
<p dir="auto">还有一个概念要分清，手册第 10 章专门讲了：<strong>芯片 GPIO 编号 ≠ 模组焊盘号 ≠ 现有测试点（TP）。</strong> 功能图上的彩色标签是"软件信号"，不是外壳边缘新增的排针。这套图说明的是现有硬件怎么用，<strong>不是一块新开发板的设计图</strong>。</p>
<hr />
<h2>六、四个例程：把一个系统拆成四块积木</h2>
<p dir="auto">手册最实用的部分是 <code>examples/</code> 里四个<strong>互相独立</strong>的工程——不是四个源文件，是四份各自带 <code>CMakeLists.txt</code>、<code>sdkconfig.defaults</code> 和板级组件的完整工程。<strong>不要把四份 <code>app_main</code> 塞进同一个 <code>main</code> 一起编译。</strong></p>
<h3>01_serial_hello：先看到一行自己的日志</h3>
<p dir="auto">上板预期：每秒出现 <code>HELLO BLUE LONG count=0</code>、<code>count=1</code>……</p>
<p dir="auto">这个例程不点亮屏幕、不亮灯、不发声。<strong>所以显示器黑屏是正常的，不是失败。</strong> 它的唯一目的是验证"改代码 → 编译 → 写入 → 看到变化"这条最短路径。建议第一步就是把欢迎语改成自己的名字，确认改动真的来自你当前的工程，而不是旧镜像。</p>
<h3>02_oled_hello：共享电源，然后显示文字</h3>
<p dir="auto">流程：<strong>GPIO4 拉高 → 等 150 ms → 初始化 I2C 与 SSD1306 → 写 128×32 区域</strong>。</p>
<p dir="auto">上板预期四行：</p>
<pre><code>HELLO BLUE LONG
ESP-IDF 5-5-4
128 X 32 OLED
YOUR OWN PROGRAM
</code></pre>
<p dir="auto">两个坑写进了手册：</p>
<ul>
<li>屏幕不亮，先查 GPIO4 和电源，再查 SDA/SCL。<strong>"看到 SDA5/SCL6 就以为自己在查 I2C"——漏掉共享供电这一步，查多久都没用。</strong></li>
<li>I2C 地址填 <code>0x78</code> 是把 <strong>8 位地址写法</strong>当成了 7 位参数。按例程接口应该写 <code>0x3C</code>。</li>
</ul>
<p dir="auto">另外注意字库边界：这个最小工程用的是精简字库，<strong>只支持大写英文、数字和少量符号，每行最多 21 字符</strong>。直接把一串中文丢进去，显示不出来是预期行为——中文点阵字库是另一个话题（四 MB Flash 上并不便宜）。</p>
<h3>03_input_counter：知道是哪个操作件被触发</h3>
<p dir="auto">旋钮 A/B 走 GPIO2/3，读两路<strong>交错相位</strong>判断旋转方向；旋钮按下 GPIO18、独立键 GPIO19，<strong>都是低电平有效</strong>。</p>
<p dir="auto">上板预期：屏幕显示 <code>INPUT COUNTER</code>、<code>ROT:0</code>、<code>KNOB:0</code>、<code>KEY:0</code>；转动改 ROT，短按旋钮和按独立键各自加计数。</p>
<p dir="auto">典型故障与正确解法：</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>现象</th>
<th>正确做法</th>
<th>错误做法</th>
</tr>
</thead>
<tbody>
<tr>
<td>方向反了</td>
<td>确认实际旋钮手感与代码的方向约定</td>
<td>把 A/B 电平、半步、完整卡点混成一个事件</td>
</tr>
<tr>
<td>按一次算很多次</td>
<td>查按下沿检测与去抖</td>
<td>无限加大延时</td>
</tr>
</tbody>
</table>
<p dir="auto">手册还提醒了一条硬件边界：<strong>独立键还连着硬件电源开关通路</strong>。示例只用短按验证输入，没有接管电源控制芯片；"长按关机"的行为以实板为准，软件示例不承诺改变它。</p>
<h3>04_rgb_buzzer：颜色变化与明确的短提示</h3>
<p dir="auto">RGB 数据脚 GPIO7，电源仍与 OLED 共用 GPIO4。按旋钮在 <code>OFF → RED → GREEN → BLUE</code> 之间切换；按独立键发一次 <strong>约 80 ms、4 kHz</strong> 的短提示音，然后停止；上电默认静音。</p>
<p dir="auto">两个"不要误解"：</p>
<ul>
<li>WS2812 是<strong>单线数字时序</strong>，不是三路 PWM 的模拟 RGB 灯。颜色不对先查数据格式、时序和颜色顺序，别去改 PWM 占空比。</li>
<li>没有声音时先核对<strong>按键事件和差分输出</strong>。把"响一下"改成"一直响"不是修复，是把蜂鸣器往死里推。</li>
</ul>
<hr />
<h2>七、全册最值得抄的一段：把硬件约束写成提示词</h2>
<p dir="auto">第 5 章装了 Codex（<code>@id:openai.chatgpt</code>，发布者 OpenAI），但真正有价值的是接下来这段——把硬件事实写成一段<strong>契约</strong>，整段贴给 AI：</p>
<pre><code>这是一个新的 ESP-IDF 5.5.4、ESP32-C6、4MB Flash 项目。
我要直接开发 BLUE LONG 硬件，不依赖原小电台业务系统。
先读当前 CMakeLists、main 和板级代码，再说明最小实现。
OLED 是 SSD1306 128x32，7位I2C地址0x3C。
GPIO4 是 OLED 与 RGB 的共享电源使能，先拉高并等150ms。
I2C SDA=GPIO5，SCL=GPIO6；WS2812数据=GPIO7。
旋钮A/B=GPIO2/3，按下=GPIO18；独立返回键=GPIO19。
压电蜂鸣器由GPIO20/21差分驱动，默认关闭，只短响。
GPIO0 不使用；GPIO12/13 留给原生USB，禁止重配成普通GPIO。
不复制聊天、好友、Mesh、旧菜单或原产品分区。
一次只实现一个外设；循环要让出CPU，输入要去抖。
只改本项目，说明修改文件，编译并报告真实错误。
不要自动连接串口、烧录、擦除Flash或更改eFuse。
输出是初版代码；编译通过后由我决定是否上板验证。
</code></pre>
<p dir="auto">这段提示词好在哪：</p>
<ol>
<li><strong>先给事实，再给任务。</strong> 引脚、地址、时序都是硬约束，不能让模型"看外形猜"。</li>
<li><strong>划定禁区。</strong> GPIO0 不用、GPIO12/13 不许动、不碰原产品分区——把不可逆操作显式排除。</li>
<li><strong>限定节奏。</strong> "一次只实现一个外设"，避免一次生成两百行跨模块代码。</li>
<li><strong>要求真实错误。</strong> "编译并报告真实错误"，而不是编一个"应该可以了"。</li>
<li><strong>保留决策权。</strong> "由我决定是否上板验证"——AI 不获得烧录权限。</li>
</ol>
<p dir="auto">配一条使用纪律：<strong>AI 改完先读 diff，确认没有多余功能、没有错引脚，再点 Build。</strong> 要让它修错，把<strong>第一条编译错误</strong>和对应代码给它，不要只说"还是不行"。</p>
<p dir="auto">安全上也有两句底线：只在官方认证页登录；<strong>不要把密码、验证码、API 密钥粘进项目、提示词或截图</strong>。</p>
<hr />
<h2>八、命令列表里的"第几行"，是个真问题</h2>
<p dir="auto"><code>F1</code> 弹出的命令列表里有很多长得像的命令，手册几乎每一处都标了"选第几行"：</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>要做的事</th>
<th>选这条</th>
<th>不要选</th>
</tr>
</thead>
<tbody>
<tr>
<td>完整编译</td>
<td><code>ESP-IDF: Build Your Project</code>（首行）</td>
<td>只构建 bootloader / partition table 的相近命令</td>
</tr>
<tr>
<td>选串口</td>
<td><code>ESP-IDF: Select Port to Use</code>（<strong>第二行</strong>）</td>
<td><code>Select Monitor Port to Use</code>（只改监视器端口）</td>
</tr>
<tr>
<td>烧录</td>
<td><code>ESP-IDF: Flash (UART) Your Project</code>（<strong>第三行</strong>）</td>
<td><code>Encrypt and Flash Your Project</code>（加密烧录，不是本教程）</td>
</tr>
<tr>
<td>看日志</td>
<td><code>ESP-IDF: Monitor Device</code>（<strong>第二行</strong>）</td>
<td><code>Build, Flash and Start a Monitor</code>（会顺带编译+烧录）</td>
</tr>
</tbody>
</table>
<p dir="auto">搜索结果的<strong>蓝色默认项不一定是你要的那条</strong>。以完整名称为准，别按位置背。</p>
<p dir="auto">烧录前手册还要求停下来核对三件事：<strong>芯片是 esp32c6、Flash 是 4 MB、当前示例和 build 输出是这一份</strong>，并确认你手上有能恢复原产品的配套工厂固件。烧录本身用构建生成的完整烧录命令与偏移，<strong>不要从别人帖子里手抄一个固定 app 偏移</strong>。</p>
<p dir="auto">Monitor 想退出时，常见组合是 <code>Ctrl+]</code>。</p>
<hr />
<h2>九、出错以后：用证据定位，不盲目擦除</h2>
<p dir="auto">这张表是整本手册最"老工程师"的一页：</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>现象</th>
<th>先做什么</th>
<th>不要误判</th>
</tr>
</thead>
<tbody>
<tr>
<td>列表里找不到 5.5.4</td>
<td>检查 EIM 登记与当前 SDK 选择，跑 Doctor</td>
<td>扩展 2.3.0 不等于 SDK 2.3.0</td>
</tr>
<tr>
<td><code>idf.py</code> 找不到</td>
<td>重开 ESP-IDF 专用终端</td>
<td>普通 PowerShell 没加载环境 ≠ SDK 丢了</td>
</tr>
<tr>
<td>构建到最后一步失败</td>
<td>保存<strong>第一条实质错误</strong>，查依赖与路径</td>
<td>只把最后一行 <code>ninja: build stopped</code> 交给 AI，信息不足</td>
</tr>
<tr>
<td>只有 COM1</td>
<td>换数据线、换 USB 口，看设备管理器</td>
<td>COM1 可能是电脑自带端口，只是排在列表最前</td>
</tr>
<tr>
<td>COM 拒绝打开</td>
<td>关掉占用它的监视器、网页、烧录器</td>
<td>重装 SDK 不能释放别人占着的串口</td>
</tr>
<tr>
<td>串口有日志但屏幕黑</td>
<td>先分清 01 本来就不用 OLED；02 查 GPIO4</td>
<td>USB 工作不代表屏幕电源已开</td>
</tr>
<tr>
<td>按一次算很多次</td>
<td>查按下沿与去抖</td>
<td>几十毫秒轮询不等于几十次按下</td>
</tr>
<tr>
<td>Flash 容量或芯片异常</td>
<td>保留完整工具日志，核验身份和读取步骤</td>
<td>不要关掉检查，也不要"猜"容量</td>
</tr>
<tr>
<td>原小电台菜单不见了</td>
<td>这是独立固件替换产品程序后的<strong>预期</strong></td>
<td>不是"开发程序必须含原系统才能跑"</td>
</tr>
</tbody>
</table>
<p dir="auto">左下角那句尤其重要：<strong>全擦 Flash 不是排查手段，是最后的手段。</strong> 每次"擦一下试试"，你都在丢掉现场证据。</p>
<hr />
<h2>十、手册对自己的边界说得很清楚</h2>
<p dir="auto">这部分我原样转述，因为它是这份文档最可信的地方：</p>
<ul>
<li><strong>本次没有烧录。</strong> 所有"上板后预期"都待用户核对，不是已完成的实机验收。</li>
<li><strong>四个独立示例确实做过真实交叉编译</strong>：ESP-IDF 5.5.4 / esp32c6，四例退出码均为 0，宿主输入逻辑自检通过；源码、镜像校验值和 <code>build.log</code> 都留在各自 manifest 里。但<strong>四例编译通过不等于 OLED 方向、旋钮手感、RGB 颜色和声音被验收过</strong>。</li>
<li><strong>截图只代表对应界面被采集过，不能证明设备执行了程序。</strong> 绿色框、放大①是后加的引导层，原始截图独立保留。</li>
<li><strong>功能图是学习简化图</strong>，信号关系取自现有设计，但不能代替焊接定位、维修或 PCB 制造资料；图上的彩色端口不是焊点位置。</li>
<li><strong>不承诺跨分区无损恢复。</strong> 想回到原产品，用与实际硬件匹配的原版<strong>完整工厂发布包</strong>和它自带的烧录入口（该入口可能全擦并恢复出厂状态）；恢复后名字、好友、消息、训练状态要重新核对。</li>
<li>官方示例图（比如 Codex 面板那张 macOS 布局）会明确标注来源，<strong>不代表本机账户已登录或硬件已运行</strong>。</li>
</ul>
<hr />
<h2>十一、把整本手册压成一条路线</h2>
<pre><code>装 VS Code + 官方 ESP-IDF 扩展 2.3.0
        ↓
EIM 自定义安装 → 固定 ESP-IDF 5.5.4 / ESP32-C6 / C:\Espressif
        ↓
Select Current ESP-IDF Version → Doctor → idf.py --version 独立确认
        ↓
Create New Empty Project（blue_long_blank，纯英文短路径）
        ↓
Set Target = esp32c6 · Flash = 4MB · Console = USB Serial/JTAG
        ↓
Build Your Project（先只在电脑上闭环）
        ↓
挨个过 01 → 02 → 03 → 04（每例独立编译、独立 build 目录）
        ↓
自己决定是否 Flash (UART) + Monitor Device
</code></pre>
<p dir="auto">扩展外设时，手册给的下一个练习也很"教材化"：<strong>在已经能显示、能读旋钮的工程里加一个六面骰子</strong>——短按开始，约 1 秒后显示 1 到 6，返回键中止；动画不阻塞按键，不用 IMU，不加网络和计分。</p>
<p dir="auto">这个练习的精髓不是骰子，而是：<strong>先让四个例程各自工作，再组合。</strong> 组合时如果坏了，你能确定是新加的那部分坏了。</p>
<hr />
<h2>写在最后</h2>
<p dir="auto">这份手册真正在教的，其实是三件事：</p>
<ol>
<li><strong>把"版本"和"层"分清</strong>——编辑器、扩展、SDK、target、COM、控制台，每一层都能单独坏。</li>
<li><strong>把硬件约束写成文字</strong>——引脚表、时序、禁区，写清楚给人和给 AI 都一样有用。</li>
<li><strong>把"没验证"说出来</strong>——没烧录就说没烧录，编译通过就只说编译通过。</li>
</ol>
<p dir="auto">从空白工程到点亮一块 128×32 的屏幕，中间隔着几十个可以出错的地方。手册的价值，就是把那些地方一个个标出来，让你第一次就走在正确的路上。</p>
<blockquote>
<p dir="auto">原手册：BLUE LONG 独立硬件开发手册（Windows / ESP32-C6 / ESP-IDF 5.5.4 / 2026.10，共 23 页）</p>
</blockquote>
]]></description><link>http://106.52.42.217:6080/topic/12/从空白工程点亮一块小电台-blue-long-独立硬件开发手册导读</link><generator>RSS for Node</generator><lastBuildDate>Thu, 05 Nov 2026 16:58:54 GMT</lastBuildDate><atom:link href="http://106.52.42.217:6080/topic/12.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 03 Nov 2026 14:39:46 GMT</pubDate><ttl>60</ttl></channel></rss>