细化版: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.c的while(1)循环中添加HAL_GPIO_TogglePin()和HAL_Delay()。点击“Debug”按钮,亲眼看到代码下载并运行,LED 闪烁。
动作 (ESP32):
安装 VSCode + PlatformIO 插件(新手推荐,自动管理工具链)或 ESP-IDF 官方安装器(专业推荐)。
必看教程: 跟随乐鑫官方的 ESP-IDF 编程指南。
目标 (PlatformIO): 新建项目 (ESP32 DevKitC) -> 在
main.cpp的loop()中(如果是 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阶段工具与资源(细化)
硬件:
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 Mode和DMA 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_server或protocols/websockets。WebSocket 是首选,因为它允许服务器主动向网页推送数据。流程:
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。再仿照它创建一个LedTask。LedTask负责闪烁 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 中:
- 放置 ESP32-WROOM 模组(可直接搜索 LCSC 料号)
- 放置 USB-UART 芯片(CH340C 或 CP2102)
- 放置 3.3V 稳压电源(AMS1117-3.3 或 XC6206 LDO)
- 添加 去耦电容(ESP32 的 0.1uF / 4.7uF)
- 添加 EN、BOOT 启动电路、按键、下拉电阻
- 添加 USB 接口(Micro USB 或 Type-C)
- 添加 排针接口(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 文件,发给 JLCPCB 或 PCBWay 打样 (选择最便宜的 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 小时内复刻你的硬件和固件。