Skip to content

细化版:1 年嵌入式(STM32 + ESP32)全栈学习路线

您已经有了一个很好的总体节奏,我们将在此基础上,为每个”小项目”和”知识点”添加具体的”抓手”。

第1阶段(1–3 月):基础与工具链

核心目标: 让开发板”说话”(串口打印)和”闪烁”(LED),跑通 STM32 和 ESP32 的编译、下载、调试全流程。

细化的可执行任务(按周)

  • 第1-2周:环境搭建与 “Hello, World!”

    • 动作 (STM32):

      • 下载并安装 STM32CubeIDE(推荐,集成 CubeMX 和 IDE)。

      • 必看教程: 跟随 ST 官方的 STM32CubeIDE 基础教程(YouTube 或 ST 官网)。

      • 目标: 新建项目 -> 使用 CubeMX(图形界面)配置 PC13(大部分 Nucleo 板载 LED)为 GPIO_Output -> 生成代码 -> 在 main.cwhile(1) 循环中添加 HAL_GPIO_TogglePin()HAL_Delay()

      • 点击“Debug”按钮,亲眼看到代码下载并运行,LED 闪烁。

    • 动作 (ESP32):

      • 安装 VSCode + PlatformIO 插件(新手推荐,自动管理工具链)或 ESP-IDF 官方安装器(专业推荐)。

      • 必看教程: 跟随乐鑫官方的 ESP-IDF 编程指南

      • 目标 (PlatformIO): 新建项目 (ESP32 DevKitC) -> 在 main.cpploop() 中(如果是 Arduino 框架)或 app_main() 中(如果是 ESP-IDF 框架)添加 printf("Hello World!")

      • 目标 (ESP-IDF): 克隆官方 hello_world 示例,运行 idf.py set-target esp32 (如果需要) idf.py build flash monitor,看到串口输出。

  • 第3-4周:C 语言复习与 Git

    • 动作 (C 语言):

      • 重点复习: 指针(尤其是函数指针)、结构体 (struct)、联合体 (union)、位操作 ( |, &, ^, <<, >> )。

      • 嵌入式 C 重点: 理解 volatile 关键字的真正含义(告诉编译器不要优化掉对这个变量的访问)。

      • 练习: 手写一个函数,用位操作来设置、清除或翻转一个 32 位整数的任意一位(模拟寄存器操作)。

    • 动作 (Git):

      • 目标: 在 GitHub 或 Gitee 上为你的学习创建一个私有仓库。

      • 流程: git init -> git add . -> git commit -m "feat: init blinky project" -> git push

      • 关键: 学会为 PlatformIO 或 CubeIDE 项目配置一个好的 .gitignore 文件(通常工具会自动生成)。

  • 第5-6周:STM32 调试与串口 (UART)

    • 动作 (调试):

      • 必学: 在 CubeIDE 中设置断点。

      • 必学: 使用“Step Over (F6)”、"Step Into (F5)"、"Step Out (F7)"。

      • 必学: 打开“Live Expressions”窗口和“SFRs”(外设寄存器)窗口。目标: 观察 GPIOA->ODR 寄存器如何在你单步执行 HAL_GPIO_TogglePin() 时发生变化。

    • 动作 (UART):

      • 目标: 实现 printf 重定向。

      • 教程: 搜索 “STM32CubeIDE redirect printf to UART”。这通常涉及在 CubeMX 中配置一个 UART (例如 USART2),并实现 _write 函数。

      • 里程碑: 你的板子可以在启动时通过串口打印 "System Init OK!"。

  • 第7-8周:ESP32 的 Wi-Fi Scan 与 GPIO

    • 动作 (Wi-Fi):

      • 目标: 运行 ESP-IDF 中的 wifi/getting_started/scan 示例。

      • 里程碑: 在串口监视器中看到你家里的 Wi-Fi (SSID) 列表。

    • 动作 (GPIO):

      • 目标: 运行 gpio/gpio_example_main 示例。

      • 里程碑: 用跳线连接两个 GPIO,实现一个“按键”(输入)控制另一个“LED”(输出)。

  • 第9-12周:I²C/SPI 外设与小项目

    • 动作 (I²C):

      • 硬件: 连接 SSD1306 OLED 屏幕 (VCC, GND, SCL, SDA)。

      • 库: 寻找一个现成的 STM32 HAL 库版的 SSD1306 驱动(GitHub 上很多,例如 afiskon/stm32-ssd1306)。

      • 目标: 移植该库,在 CubeMX 中配置 I2C1,最终在 OLED 上显示 "Hello STM32!"。

    • 动作 (ESP32 Web):

      • 目标: 运行 ESP-IDF 中的 protocols/http_server/simple 示例。

      • 里程碑: 电脑或手机连接到 ESP32(它会自己创建一个 AP 或连接到你的路由器),在浏览器中打开 ESP32 的 IP 地址,看到 "Hello World!" 网页。

      • 进阶: 修改网页,添加一个按钮,通过 HTTP GET 请求控制 ESP32 上的 LED。

第1阶段工具与资源(细化)

  • 软件: STM32CubeIDEVSCode + PlatformIO 插件ESP-IDF 工具安装器

  • 硬件:

    • STM32: Nucleo-F446RE 或 Nucleo-F401RE(性能和外设的甜点)。

    • ESP32: ESP32-DevKitC V4 (WROOM-32 模组)。

    • 外设: SSD1306 OLED (I²C 接口)、面包板、杜邦线。

  • 文档: 《STM32F446xx Reference Manual (RM0390)》《STM32F446xx Datasheet》。你现在不需要读完它,但要下载它,并学会查阅”GPIO”和”RCC”章节。

第2阶段(4–6 月):外设驱动与通信协议

核心目标: 精通数据收发。掌握高速采样 (ADC+DMA)、时序控制 (TIM) 和总线通信 (SPI/I²C)。

细化的可执行任务(按周)

  • 第1-2周:定时器 (TIM) 与 PWM

    • 动作 (PWM):

      • 目标: 使用 TIM 输出 PWM 来控制 LED 亮度(呼吸灯)。

      • CubeMX 配置: 选择一个 TIM (如 TIM2),配置一个通道 (Channel 1) 为 PWM Generation CH1。设置 Prescaler (预分频) 和 Counter Period (ARR, 自动重载) 来决定 PWM 频率。

      • 代码: HAL_TIM_PWM_Start() 启动 PWM,然后在 while(1) 循环中,使用 __HAL_TIM_SET_COMPARE() (或 htim2.Instance->CCR1 = value) 动态修改占空比 (value),实现呼吸效果。

    • 动作 (输入捕获): (可选进阶)

      • 目标: 测量外部方波信号的频率。

      • 配置: TIM 配置为 Input Capture 模式。

      • 逻辑: 在中断中记录两次上升沿之间的时间差,计算出频率。

  • 第3-4周:ADC (单次) 与 DMA (环形缓冲)

    • 动作 (ADC 单次):

      • 硬件: 准备一个电位器(滑动变阻器),三端分别接 3.3V, GND, 和一个 ADC_IN 引脚 (如 PA0)。

      • CubeMX 配置: 配置 ADC1 的一个通道,Continuous Conversion Mode (连续转换模式) 禁用

      • 代码:while(1) 中调用 HAL_ADC_Start() -> HAL_ADC_PollForConversion() -> HAL_ADC_GetValue()

      • 里程碑: 通过串口实时打印出 0-4095 的 ADC 原始值,旋转电位器,数值随之变化。

    • 动作 (ADC + DMA): (本阶段最关键任务)

      • 目标: 实现无 CPU 干扰的连续数据采集,为示波器打基础。

      • CubeMX 配置:

        • ADC: 开启 Continuous Conversion ModeDMA Continuous Requests

        • DMA: 添加一个 DMA 请求 (ADC1),模式设置为 Circular (环形),数据宽度 Word (如果 ADC 是 12 位) 或 Half-Word (如果 ADC 是 8/10 位,注意对齐)。

      • 代码:

        • 定义一个缓冲区:uint16_t adc_buf[100];

        • 启动转换:HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buf, 100);

        • 关键: 实现 HAL_ADC_ConvCpltCallback() (转换完成一半) 和 HAL_ADC_ConvHalfCpltCallback() (转换完成) 这两个 DMA 中断回调。

      • 里程碑: 在这两个回调函数中设置标志位,在主循环中检查标志位,并将 adc_buf 的前半部分或后半部分数据通过 UART 批量发送到 PC。这是 DMA Double Buffer (双缓冲) 的雏形。

  • 第5-6周:SPI 与 SPI Flash

    • 动作 (SPI):

      • 硬件: W25Qxx SPI Flash 存储芯片模块 (非常便宜且常用)。

      • 目标: 读写 SPI Flash。

      • 关键: 阅读 W25Qxx 的 Datasheet。理解它的指令集(如 0x9F 读 JEDEC ID, 0x06 写使能, 0x02 页编程, 0x03 读数据)。

      • 代码:

        • 配置 SPI1 (MISO, MOSI, SCK) 和一个 GPIO (作为 CS 片选)。

        • 封装函数:void SPI_CS_Low(), void SPI_CS_High()

        • 封装函数:uint8_t SPI_TransmitReceive(uint8_t tx_data) (使用 HAL_SPI_TransmitReceive())。

        • 里程碑: 实现 Read_JEDEC_ID() 函数。拉低 CS -> 发送 0x9F -> 接收 3 个字节 (Manufacturer ID, Device ID) -> 拉高 CS。通过串口打印出读到的 ID (例如 0xEF 0x40 0x17 代表 W25Q64)。

  • 第7-8周:ESP32 Wi-Fi 与 Web Server (进阶)

    • 动作 (Web Server):

      • 目标: 建立一个网页,能显示 STM32 通过串口发来的数据(例如 ADC 值)。

      • ESP-IDF 示例: protocols/http_server/async_web_serverprotocols/websocketsWebSocket 是首选,因为它允许服务器主动向网页推送数据。

      • 流程:

        • ESP32 启动,建立 Wi-Fi 连接和 WebSocket 服务器。

        • ESP32 通过 UART 接收来自 STM32 的数据。

        • ESP32 将接收到的数据通过 WebSocket 推送给所有连接的网页客户端。

      • 前端 (HTML/JS): 编写一个简单的 HTML,使用 JavaScript 建立 WebSocket 连接,并在 onmessage 事件中更新页面上的一个 <span> 或图表(如使用 Chart.js)。

      • 里程碑: 在浏览器上看到一个实时跳动的数字,这个数字来自 STM32 的 ADC。

第2阶段工具与资源(细化)

  • 硬件:

    • 逻辑分析仪: (必买) 8 通道 USB 逻辑分析仪 (如基于 CY7C68013A 的 Saleae 克隆版)。

    • 软件: PulseView (开源,与上述逻辑分析仪配合使用)。

    • 外设: W25Q64 SPI Flash 模块、电位器 (10K)。

  • 资源:

    • 必看应用笔记: ST 官方的 AN4013 (STM32 and DMA) 和 AN4776 (General-purpose timer cookbook)。

    • 必读 Datasheet: W25Q64 Datasheet (学习如何看时序图)。

    • PC 串口绘图: 使用 Python ( pyserial + matplotlib ) 或现成的串口绘图工具 (如 Serial Studio) 来可视化 STM32 发来的 ADC 数据。

第3阶段(7–9 月):RTOS、低功耗与电源管理

核心目标: 从“裸机”前后台系统转向“多任务”实时系统 (RTOS),并学会如何让设备“睡着”以省电。

细化的可执行任务(按周)

  • 第1-2周:FreeRTOS 核心概念(任务与队列)

    • 动作 (STM32):

      • CubeMX 配置: 在 "Middleware" 标签页中启用 FreeRTOS,选择 CMSIS_V1 (或 V2) 接口。

      • 目标: 创建两个独立的任务 (Task)。

      • 代码: CubeMX 会自动生成 DefaultTask。再仿照它创建一个 LedTaskLedTask 负责闪烁 LED (使用 vTaskDelay(500) 而不是 HAL_Delay())。DefaultTask 负责通过串口打印信息。

      • 里程碑: 看到 LED 闪烁的同时,串口在持续输出(互不阻塞)。

    • 动作 (队列):

      • 目标: 使用队列 (Queue) 在两个任务间安全地传递数据。

      • 场景: 创建一个 AdcTask 和一个 UartTask

      • AdcTask:周期性 (如 vTaskDelay(100)) 读取 ADC 值,然后使用 xQueueSend()uint16_t 格式的 ADC 值发送到队列。

      • UartTask:使用 xQueueReceive() 阻塞地等待队列数据,一旦收到,就通过 UART 打印出来。

      • 里程碑: 任务分离,ADC 采样和 UART 打印解耦。

  • 第3-4周:FreeRTOS 同步(信号量与互斥锁)

    • 动作 (信号量):

      • 目标: 使用(二进制)信号量 (Semaphore) 来同步任务和中断。

      • 场景: 回到第1阶段的“按键中断”。

      • 中断服务程序 (ISR) (HAL_GPIO_EXTI_Callback): (ISR 中绝对不能有任何延时或复杂计算) 只做一件事:xSemaphoreGiveFromISR() 释放一个信号量。

      • ButtonTask (任务):for(;;) 循环中,使用 xSemaphoreTake() 阻塞地等待信号量。一旦获取到,就执行“按键被按下”的逻辑(例如,打印信息)。

      • 里程碑: 实现了中断的“底半部”(Bottom Half) 处理,中断处理被推迟到任务中执行,响应快速且系统稳定。

    • 动作 (互斥锁):

      • 目标: 使用互斥锁 (Mutex) 保护共享资源 (如 I2C/SPI 总线)。

      • 场景: 两个任务 (OledTask, SpiFlashTask) 都想使用 I2C/SPI 总线。

      • 代码: 在访问 I2C/SPI 总线之前,任务必须先 xSemaphoreTake(i2c_mutex),在使用完毕后,必须 xSemaphoreGive(i2c_mutex)

      • 里程碑: 防止了总线访问冲突导致的资源竞争和数据错乱。

  • 第5-6周:STM32 低功耗(Stop 模式与 RTC)

    • 动作 (Stop 模式):

      • 目标: 让 MCU 进入低功耗模式,并通过外部中断(按键)唤醒。

      • CubeMX 配置: 配置一个 GPIO (如 PA0) 为外部中断 (EXTI),上升沿或下降沿触发。

      • 代码: 在主循环中,执行数据处理后,调用 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI) (WFI: Wait For Interrupt)。

      • 里程碑: MCU "睡死",按下按键后,MCU 立即唤醒并从 HAL_PWR_EnterSTOPMode 之后开始执行。

    • 动作 (RTC 唤醒):

      • 目标: 让 MCU 睡眠 10 秒钟,然后自动唤醒。

      • CubeMX 配置: 启用 RTC,并激活其 WakeUp 功能。

      • 代码: 配置 HAL_RTCEx_SetWakeUpTimer_IT(),设置 10 秒后产生中断。然后进入 STOP 模式。

      • 里程碑: 实现周期性的低功耗数据记录器原型(睡 10 秒 -> 醒来 -> 采样 -> 睡 10 秒...)。

  • 第7-8周:电源硬件与 ESP32 低功耗

    • 动作 (硬件):

      • 目标: 在面包板上搭建一个最小供电系统。

      • 组件: 18650 电池 + 电池座 -> TP4056 充电模块 (OUT+ / OUT-) -> 你的 3.3V LDO (如 AMS1117-3.3 或更优的 MCP1700) -> STM32/ESP32 的 3.3V 和 GND。

      • 里程碑: 你的开发板可以完全脱离 USB,靠电池运行。

    • 动作 (ESP32 Deep Sleep):

      • 目标: ESP32 实现深度睡眠。ESP32 的 Deep Sleep 功耗极低 (uA 级别)。

      • 示例: 运行 ESP-IDF system/deep_sleep 示例。

      • 里程碑: 让 ESP32 启动 -> 连接 Wi-Fi -> 上传一条数据 -> 然后调用 esp_deep_sleep_start() 睡眠 30 秒 -> 30 秒后它会重启并重复此过程。这是物联网 (IoT) 设备的标准工作模式。

第3阶段工具与资源(细化)

  • 硬件:

    • 高精度万用表 或 USB 功率计: (必买) (如 Power-Z, Current Ranger 或一个能测 uA 电流的万用表)。不测量就谈低功耗都是耍流氓。

    • 电池组件: 18650 电池、TP4056 充电模块、AMS1117-3.3 (或 MCP1700/HT7333) LDO。

  • 文档:

    • 《Mastering the FreeRTOS Real Time Kernel》 (FreeRTOS 官网可免费下载 PDF,必读)。

    • ST 应用笔记 AN4713: (Low-power modes on STM32)

第4阶段(10–11 月):无线互联、UI 与复杂应用

核心目标: 将 STM32(实时控制)和 ESP32(无线连接)两个世界连接起来,并为其添加图形用户界面 (GUI)。

细化的可执行任务(按周)

  • 第1-2周:ESP32 BLE 与 Wi-Fi 配网

    • 动作 (BLE):

      • 目标: 实现一个 BLE GATT 服务器,让手机可以读写其数据。

      • ESP-IDF 示例: bluetooth/bluedroid/ble/gatt_server

      • 工具: 手机 App "nRF Connect" (BLE 调试必备)。

      • 里程碑: 在 nRF Connect 中连接到你的 ESP32,看到自定义的 Service 和 Characteristic,并能通过 App 修改一个 Characteristic 的值(例如,控制 LED)。

    • 动作 (Wi-Fi 配网):

      • 目标: 不再在代码中硬编码 Wi-Fi SSID 和密码。

      • ESP-IDF 示例: wifi/wifi_provisioning (使用 protocomm_ble)。

      • 里程碑: 设备启动时广播一个 BLE 信号,手机 App (乐鑫官方 App 或自制 App) 通过 BLE 连接上设备,把 Wi-Fi 密码发给它。ESP32 拿到密码后连接 Wi-Fi。这是所有智能家居产品的标准流程。

  • 第3-4周:GUI (LVGL) 移植

    • 动作 (LVGL):

      • 目标: 在你的 TFT 屏幕 (如 ILI9341) 上跑起 LVGL (Light and Versatile Graphics Library)。

      • 平台选择: 强烈建议先在 ESP32 上跑,因为 ESP32 性能更强,RAM 更大,且 LVGL 官方有现成的驱动示例

      • 里程碑: 在 ESP32 上成功运行 LVGL 的 demo/widgets 示例,看到各种漂亮的按钮、滑块和图表。

      • 进阶: 在 STM32 (如 F446) 上移植 LVGL。这需要你手动编写 SPI 驱动 (或使用 HAL) 来适配 LVGL 的 disp_flush_cb (刷新回调),并可能需要一个帧缓冲区 (Frame Buffer)。

  • 第5-6周:MCU 间通信(STM32 🤝 ESP32)

    • 动作 (定义协议):

      • 硬件连接: STM32 (UART) <--TX/RX--> ESP32 (UART)。

      • 目标: STM32 做数据采集(“协处理器”),ESP32 做显示和联网(“主处理器”)。

      • 协议: 不要只发送原始数据。 必须定义一个简单的帧协议。

      • 示例(KISS 协议): [帧头 0xA5] [命令ID 0x01] [数据长度 0x02] [数据1] [数据2] [校验和] [帧尾 0x5A]

      • 里程碑:

        • STM32 (FreeRTOS): AdcTask 采集数据 -> xQueueSend -> ProtocolTask 从队列接收数据 -> 按照协议打包 -> HAL_UART_Transmit_DMA 发送给 ESP32。

        • ESP32 (FreeRTOS): UartTask 接收数据 -> 解析协议帧(校验和必须通过) -> xQueueSend -> LvglTask 从队列接收数据 -> 更新 LVGL 界面上的图表或标签。

    下面是你想要的 ”更换成嘉立创 EDA 学习 PCB”版本,我完全按照你原先的结构,但把工具由 KiCad 改成 嘉立创 EDA(JLCEDA / EasyEDA Pro),内容也做了相应调整,更符合国内常见学习路线与嘉立创下单流程。

    第 7–8 周:PCB 设计入门(嘉立创 EDA)

    动作(嘉立创 EDA / EasyEDA Pro):

    1) 软件准备

    • 下载并安装 嘉立创 EDA(EasyEDA Pro 桌面版) ✔ 完全免费 ✔ 与嘉立创打样工厂无缝衔接 ✔ 有海量的元器件库(含 LCSC 料号)

    2) 必看教程

    • 嘉立创 EDA Pro 官方快速入门教程(YouTube / B 站均可找到)
    • 强烈推荐:「极客工坊 EasyEDA 教程」(系统且贴近国内 PCB 设计流程)

    目标:熟悉界面 + 画原理图 + PCB 布局 + ERC/DRC 检查

    3) 学习目标

    不要马上设计你的最终项目 PCB。

    第 7~8 周的目标是先完成一个练手工程: 画一个 “ESP32 最小系统板” 用于理解 PCB 设计全流程。

    嘉立创 EDA 有大量可直接使用的器件封装/原理图库,你可以专注于设计逻辑。

    练习项目:ESP32-WROOM 最小系统板

    (一)原理图 Schematic 内容:

    在嘉立创 EDA 中:

    1. 放置 ESP32-WROOM 模组(可直接搜索 LCSC 料号)
    2. 放置 USB-UART 芯片(CH340C 或 CP2102)
    3. 放置 3.3V 稳压电源(AMS1117-3.3 或 XC6206 LDO)
    4. 添加 去耦电容(ESP32 的 0.1uF / 4.7uF)
    5. 添加 EN、BOOT 启动电路、按键、下拉电阻
    6. 添加 USB 接口(Micro USB 或 Type-C)
    7. 添加 排针接口(GPIO 扩展)

    (二)PCB 布局 Layout:

    嘉立创 EDA Pro 对于初学者非常友好:

    关键 1:去耦电容的放置

    • 必须紧贴在 ESP32 的 3.3V 供电引脚旁
    • 电容–引脚距离越短越好(几毫米以内)
    • 使用 100nF + 4.7uF 组合

    这是你学习 PCB 的第一个审美要求:

    电源滤波电容永远靠近芯片

    关键 2:铺铜(GND Plane)

    • 在顶层或底层创建 GND 铜皮(Copper Area)
    • 设置为 “Pour to GND”
    • 记得开启 “自动重铺铜”(Auto Re-pour)

    使用接地平面可以显著降低噪声和 EMI。

    关键 3:差分线 / USB D+ D- 布线(若使用 Type-C + 原生 USB-UART)

    你需要学习:

    • USB D+/D- 应保持同长度
    • 平行布线
    • 走线尽量短

    嘉立创 EDA 有 “差分布线模式”,很直观好用。

    里程碑成果(必须完成):

    1)原理图设计(Schematic 完成)

    • 通过 ERC 检查(Electrical Rule Check)
    • 所有电源、GND、未连接点都清晰标注

    2)PCB 布局(Layout 完成)

    • 对 EMI 敏感的元件靠近芯片(如去耦电容)
    • USB、LDO、电源入口布局合理
    • 走线清晰、避免 90 度直角(嘉立创自动已有圆角)

    通过 DRC 检查(Design Rule Check)

    3)可下单文件导出(Gerber)

    嘉立创 EDA 只需点击「生成 Gerber」即可, 还能直接 一键下单 PCB 打样

    你最终输出的文件包括:

    • Gerber(顶层、底层、阻焊、丝印等)
    • Drill(钻孔文件)
    • Pick&Place(贴片文件,可选)

第5阶段(12 月):最终项目冲刺

核心目标: 交付一个完整的、有外壳的、有文档的个人项目 (例如,迷你示波器)。

细化的可执行任务(按周)

  • 周 1-2 (47-48周):项目定义与 PCB 冲刺

    • 动作 (定义规格):

      • 迷你示波器: 采样率?(例如 1Msps)。带宽?(例如 100kHz)。单通道/双通道?电源?(USB/电池)。

      • 选择核心 ADC: 使用 STM32 内部 ADC (F446 可达 2Msps) 还是外部高速 ADC (如 AD9280,SPI 接口)?建议: V1.0 先用内部 ADC,把流程跑通。

      • 前端: 如何实现 +/- 电压输入和量程切换?(剧透: 这是示波器最难的部分。V1.0 可以先只做一个 0-3.3V 的示波器,用一个电位器分压作为输入信号)。

    • 动作 (PCB 设计):

      • 在 KiCad 中完成 V1.0 的原理图和 PCB 布局。

      • 布局关键: 模拟信号 (ADC 输入) 走线要短,远离数字信号 (SPI, UART) 和时钟 (晶振)。

      • 下单: 导出 Gerber 文件,发给 JLCPCBPCBWay 打样 (选择最便宜的 5-10 片)。同时,在立创商城 (LCSC) 或 Mouser/DigiKey 上订购所有元器件 (BOM)。

  • 周 3-4 (49-50周):固件开发与等待 PCB

    • 动作:

      • PCB 正在生产 (约 3-7 天)。BOM 正在路上 (约 1-3 天)。

      • 不要干等!

      • 在你的 Nucleo + ESP32 开发板(“飞行模拟器”)上,编写 90% 的固件。

      • 固件架构:

        • STM32 (FreeRTOS): AdcTask (DMA 采集), TriggerTask (实现触发逻辑), CommTask (打包数据发给 ESP32)。

        • ESP32 (FreeRTOS): CommTask (接收 STM32 数据), LvglTask (驱动 LVGL 绘制波形), ButtonTask (处理按键,用于调节时基、触发电平等)。

  • 周 5-6 (51-52周):焊接、调试与“点亮”

    • 动作 (焊接):

      • 工具: 电烙铁、焊锡丝、镊子、助焊膏 (Flux) (必备!)。如果有 SMT 元件,需要热风枪或加热台。

      • 流程: 先焊接最小系统:电源 (LDO) -> MCU (STM32/ESP32) -> 晶振 -> 调试接口 (SWD/UART)。

    • 动作 (“冒烟测试”):

      • 关键: 焊接完成后,先不要插电! 用万用表二极管档检查 3.3V 和 GND 是否短路。

      • 上电: 确认无短路后,上电(最好使用带限流的直流电源,限制在 50mA)。

      • 测量: 测量 3.3V 电压是否正常。

    • 动作 (“点亮”):

      • 连接 ST-LINK/ESP-Flasher,看是否能识别到芯片。

      • 烧录最简单的“Blinky”程序。

      • 里程碑: 你自己画的 PCB 上的 LED 闪烁了!这是最有成就感的时刻。

      • 调试: 逐个模块调试(ADC, SPI, I2C, 屏幕...),把完整固件刷入。

  • 周 7-8 (53-54周):外壳、文档与收尾

    • 动作 (外壳):

      • 软件: Tinkercad (入门) 或 Fusion 360 (进阶)。

      • 目标: 设计一个简单的 3D 打印外壳,把 PCB 和屏幕固定住。

      • 制造: 如果你没有 3D 打印机,可以使用本地的 3D 打印服务或在线服务。

    • 动作 (文档):

      • 这是项目的一部分,不是事后工作!

      • GitHub README.md:

        • 封面图/视频: 展示你的最终成品。

        • 特性: 规格列表。

        • 如何构建 (Hardware): 上传你的 KiCad 源文件、Gerber 文件和 BOM 清单。

        • 如何使用 (Firmware): 上传你的固件源码 (STM32 + ESP32),并提供编译和烧录指南。

        • 已知问题/未来计划。

最终交付与”精通”标准(细化)

  • 数据手册驱动: 你不再主要依赖 CSDN 或 Google 搜索,而是首先打开 Reference Manual (RMxxx.pdf)Datasheet.pdf。你能看懂 I²C 的时序图,并知道如何配置 RCC (时钟树)。

  • 调试器依赖: 你遇到 Bug 的第一反应是打开逻辑分析仪示波器来查看信号,或者打开 CubeIDE Debugger 来查看内存和寄存器,而不是 printf

  • 抽象与封装: 你写的驱动(例如,一个 ad9280_driver.c)是可移植的。它只依赖于底层的 spi_send_byte()spi_read_byte() 函数指针,而不是 HAL_SPI_...

  • 功耗感知: 你在设计 while(1) 循环时,会下意识地使用 vTaskDelay()xQueueReceive() (带阻塞),而不是空转,因为你知道空转会烧掉 CPU 和电量。

  • 文档即代码: 你的 GitHub 项目是完整的。一个陌生人仅凭你的 README,就能在 1 小时内复刻你的硬件和固件。

Built with VitePress