目录


一、前言

大家好,这里是 Hello_Embed

本篇文章是"AI编程"系列的第二篇,也是"全场景工业互联设备管理系统"学习笔记的总览入口。本文借助 Claude Code 辅助生成,结合项目工程源码进行梳理,旨在为后续的 AI 辅助学习与开发建立一张清晰的地图。

这个项目基于 STM32H5(中控)+ STM32F030(传感器)双平台,从 GPIO 点灯开始,逐步构建出一个完整的工业设备互联系统——包含 Modbus 协议通信、USB 虚拟串口、FreeRTOS 多任务、多传感器数据采集、以及 IAP 远程固件升级。

对于初学者来说,这个项目涉及的知识面非常广,很容易在某一阶段卡住后感到迷茫。本文的目的就是帮你建立全局视角:知道每一阶段在干什么、它和前后阶段的关系、以及你需要在哪个阶段掌握哪些前置技能。当你学不下去时,可以回到这里,重新定位自己的位置。


二、项目最终形态:我们在做什么

先看终点,再走过程。整个项目的最终成果是一套三层工业设备互联系统

┌─────────────────────────────────────────┐
│  PC 上位机 (control_center.exe)         │
│  · 配置传感器点表 · 下发读写指令        │
│  · 发起 IAP 固件升级                    │
└────────────┬────────────────────────────┘
             │ USB CDC (虚拟串口)
             │ Modbus RTU 协议
┌────────────▼────────────────────────────┐
│  中控 — STM32H5 (DShanMCU-H5)           │
│  · 运行 FreeRTOS                        │
│  · 维护"点映射表"(Point Map)            │
│  · Modbus 主机 ↔ 从机双角色            │
│  · 固件升级中转 (Bootloader)            │
│  · LCD 显示调试信息                     │
└────┬───────────────────────┬────────────┘
     │ CH1 (UART2/RS485)     │ CH2 (UART4/RS485)
     │ Modbus RTU            │ Modbus RTU
┌────▼──────────┐  ┌─────────▼───────────┐
│ 开关量传感器  │  │ 环境监测传感器      │
│ STM32F030     │  │ STM32F030           │
│ · DI/DO       │  │ · AI (光敏/可调电阻) │
│ · 按键/蜂鸣器 │  │ · DO (蜂鸣器/LED)   │
│ · Bootloader  │  │ · Bootloader         │
└───────────────┘  └─────────────────────┘
                         ┌─────────────────┐
                         │ 温湿度传感器    │
                         │ STM32F030       │
                         │ · AI (温/湿度)  │
                         │ · DO (蜂鸣/LED) │
                         │ · Bootloader    │
                         └─────────────────┘

一句话总结:PC 通过中控的"点映射表",像访问本地寄存器一样读写任意传感器;固件升级时,中控作为中转站,将 PC 下发的 .bin 文件转发给目标传感器完成烧录。


三、学习路线总览:九个阶段的递进关系

下表按学习顺序梳理每阶段的核心内容与递进逻辑:

阶段 主题 课时 核心内容 在最终项目中的作用
阶段0 项目方案介绍 1 课程目标、系统架构预览 建立全局认知
阶段1 开发环境搭建 3 CubeIDE 安装、Keil 配置、硬件验证 工具链就绪
阶段2 STM32H5 入门 7 GPIO、UART 基础、LCD 驱动、FreeRTOS 初体验 中控开发的基石
阶段3 UART 编程专题 9 查询/中断/DMA/IDLE 四种方式、RTOS 中 UART、面向对象封装 中控通信的基础通道
阶段4 USB 协议与 USBX 9 USB 协议层、描述符、USBX 移植、虚拟串口实现 PC ↔ 中控的物理通道
阶段5 Modbus 协议入门 3 Modbus 报文格式、ModbusPoll/Slave 工具 理解系统通信语言
阶段6 libmodbus 深度解析 14 源码分析、发送/接收/回应流程、移植到 STM32、主从机实验 中控协议栈的核心
阶段7 多传感器系统 16 STM32F030 编程、传感器驱动、点表设计、主控访问多传感器 传感器节点的完整实现
阶段8 Bootloader 开发 7 Flash 划分、下载协议、Bootloader 启动/下载/烧录 固件升级的基础能力
阶段9 综合集成 11 Write File Record、文件传输、映射表原理、IAP 完整流程 所有模块组装为产品

阶段间的依赖关系

阶段0-1(环境) ──► 阶段2(H5入门) ──► 阶段3(UART专项)
                                          │
                    ┌─────────────────────┤
                    ▼                     ▼
              阶段4(USB)           阶段5(Modbus入门)
                    │                     │
                    └────────┬────────────┘
                             ▼
                    阶段6(libmodbus深度)
                             │
                             ▼
                    阶段7(多传感器系统)
                             │
                             ▼
                    阶段8(Bootloader)
                             │
                             ▼
                    阶段9(综合集成+IAP)

关键提示:阶段3(UART)和阶段6(libmodbus)是两大基石——前者决定了你是否能稳定收发数据,后者决定了你是否理解系统通信的核心逻辑。这两个阶段值得反复回顾。


四、关键阶段精要

阶段3:UART 编程 — 从查询到面向对象

这是嵌入式开发的分水岭。四种编程方式各有适用场景:

方式 特点 适用场景
查询 CPU 空转等待,最简单 调试、快速验证
中断 逐字节响应,CPU 效率提升 低波特率、简单协议
DMA 硬件搬运数据,CPU 解放 大数据量、高吞吐
IDLE+DMA DMA + 空闲中断,一帧收完再处理 本项目最终采用

本章的终极产物(面向对象封装):

typedef struct UART_Device {
    char *name;
    int (*Init)(struct UART_Device *pDev, int baud, char parity, int data_bit, int stop_bit);
    int (*Send)(struct UART_Device *pDev, uint8_t *datas, uint32_t len, int timeout);
    int (*RecvByte)(struct UART_Device *pDev, uint8_t *data, int timeout);
    int (*Flush)(struct UART_Device *pDev);
    void *priv_data;
} UART_Device;

这个结构体是整个项目最核心的抽象——它将 USB 虚拟串口、板载 UART、RS485 串口统一为同一种接口,使得 libmodbus 可以无缝切换底层通信通道。

对应课程节次:《UART编程(查询方式)》至《面向对象封装UART》


阶段6:libmodbus — 协议栈的深度理解

本阶段从源码级别分析 libmodbus,是整个课程中理论最深的部分:

小节 内容 重要程度
6-1 libmodbus 概述,API 一览 了解即可
6-2 源码总体分析——核心函数、框架、数据结构 重点理解
6-3 源码情景分析——发送请求 重点理解
6-4 源码情景分析——接收请求 重点理解
6-5 源码情景分析——从机回应 重点理解
6-6~6-8 移植方法、使用 USB 串口作为后端 实操重点
6-9~6-12 主从机上机实验 必做实验

你需要记住的 libmodbus 核心数据类型

  • modbus_t — Modbus 上下文,所有操作的入口
  • modbus_mapping_t — 寄存器映射,包含 tab_bits / tab_input_bits / tab_registers / tab_input_registers 四张表
  • 四类寄存器地址:0x(线圈 DO)、1x(离散输入 DI)、3x(输入寄存器 AI)、4x(保持寄存器 AO)

对应课程节次:《libmodbus概述》至《libmodbus实验(板载串口)》


阶段7:多传感器系统 — STM32F030 的完整开发

本阶段将前面学到的所有技能复制到传感器端,同时引入关键的设计方法——点表

小节 内容 关键产出
7-1~7-4 F030 环境搭建、GPIO 熟悉 F030 平台
7-5~7-7 F030 串口 + libmodbus 移植 F030 也能跑 Modbus
7-8 传感器设计思路与点表设计 点表思维建立
7-9~7-11 三类传感器程序(开关量/环境/温湿度) 传感器固件
7-12 主控同时访问多个传感器 多通道并发
7-13 PC 上位机访问多传感器 三层链路打通
7-14~7-15 UART 封装改进 + 容错 代码健壮性

对应课程节次:《硬件资源介绍与接线》至《增加容错代码》


阶段8-9:Bootloader + IAP — 产品化的最后一公里

这是将"开发板玩具"变成"可维护产品"的关键步骤:

  1. Flash 布局规划:Bootloader 区 + APP 区 + 配置信息区
  2. 下载协议设计:利用 Modbus 的 Write File Record(功能码 20)传输文件
  3. Bootloader 逻辑:解析请求 → 接收固件块 → 烧写 Flash → 跳转 APP
  4. 升级命令寄存器:写 0x55 进入 Bootloader,写 0xAA 启动 APP
  5. 跨层级转发:PC → 中控 → 传感器,中控作为固件中转站

阶段9的核心创新——点映射表(Point Map)

typedef struct PointMap {
    char reg_type[4];           // 寄存器类型: "0x"/"1x"/"3x"/"4x"
    uint16_t reg_addr_master;   // 在中控 mb_mapping 中的地址
    uint16_t channel;           // 0=中控本地, 1=CH1, 2=CH2
    uint16_t dev_addr;          // 传感器 Modbus 地址
    uint16_t reg_addr_salve;    // 传感器端的寄存器地址
} PointMap;

PC 通过 Write File Record 将映射表下发至中控,之后中控就能自动完成"上位机 Modbus 地址 ↔ 传感器物理地址"的翻译工作。这是整个系统架构中最巧妙的设计。

对应课程节次:《程序升级的概念》至《传感器Bootloader代码和中控APP代码讲解》


五、技能图谱:每个阶段需要掌握什么

技能领域 具体内容 对应阶段 前置知识
C 语言 指针、结构体、函数指针、多文件编程 全程 C 语言基础
STM32CubeIDE 创建工程、配置外设、生成代码 阶段1-2
GPIO 输入/输出、中断、消抖 阶段2
UART 查询/中断/DMA/IDLE 四种模式 阶段3 GPIO
FreeRTOS 任务创建、优先级、栈分配、信号量 阶段2-3(分散) C 指针、栈概念
LCD 驱动 SPI 通信、字库渲染 阶段2 SPI 基础
USB 协议 描述符、端点、CDC-ACM 类 阶段4 UART
USBX 移植 Azure USBX 框架、虚拟串口实现 阶段4 USB 协议
Modbus RTU 帧格式、功能码、CRC 校验 阶段5 UART
libmodbus 源码结构、RTU 后端、移植方法 阶段6 Modbus RTU、UART 抽象
STM32F030 外设配置、与 H5 的平台差异 阶段7 STM32H5 经验
传感器驱动 ADC、I2C(DHT11/SHT30)、GPIO 开关量 阶段7 F030 基础
Flash 编程 地址映射、扇区擦除、烧写 阶段8 存储器基础
Bootloader 启动流程、固件下载协议、软复位 阶段8-9 Flash 编程、Modbus
点映射表 数据结构的抽象设计能力 阶段9 结构体、Modbus 寄存器

重点能力的三层分级

第一层(基础生存)          第二层(独立开发)          第三层(架构设计)
├── GPIO 输入输出           ├── DMA+IDLE 串口           ├── UART 设备抽象层
├── UART 查询/中断          ├── FreeRTOS 多任务         ├── 点映射表设计思想
├── 看懂 Modbus 报文        ├── libmodbus 移植/调试     ├── Bootloader 架构
├── CubeIDE 基本操作        ├── 传感器驱动编写          ├── IAP 跨层级转发
└── 认识 USB 描述符         └── Flash 扇区操作          └── 协议适配与优化

自我评估:学完阶段3应该达到第一层;学完阶段7应该达到第二层;学完全部应该理解第三层的设计思想。


六、配套资源

调试工具

工具 用途 获取方式
ModbusPoll Modbus 主机调试工具,模拟 PC 上位机收发报文 官网下载
ModbusSlave Modbus 从机模拟工具,可模拟传感器端响应 官网下载
Virtual Serial Port Tool 虚拟串口工具,在本机创建成对的虚拟串口进行联调 免费工具

参考文档

  • Modbus Application Protocol V1.1b3 — Modbus 官方协议规范,开发过程中可随时查阅
  • UM3132 — STM32H5 HAL/LL 驱动描述,ST 官方参考手册

前置知识储备

在进行本项目之前,建议具备以下基础。相关笔记可在我的 CSDN 主页找到对应系列:

知识领域 掌握程度
C 语言 指针、结构体、函数指针、多文件编程
STM32 HAL 库 GPIO、中断、定时器、UART、DMA
FreeRTOS 任务、队列、信号量、事件组
LVGL 图形界面 控件使用、事件处理(用于上位机前端)

七、学习建议

推荐的二刷路线

如果是第一次学到中途感到吃力,建议按以下路线选择性重刷

  1. 如果连工程都跑不起来 → 回阶段1-2,确认 CubeIDE 版本、Keil 配置、调试器驱动
  2. 如果看不懂 UART 代码 → 回阶段3,重点是查询方式和 RTOS 中使用 UART
  3. 如果不理解 Modbus 通信 → 先用 ModbusPoll/Slave 工具动手收发几条报文(阶段5),再回阶段6看源码
  4. 如果卡在 libmodbus 移植 → 重点看阶段6的移植方法和阶段7的 F030 移植,这两个是模板
  5. 如果不理解点映射表 → 直接看阶段9综合集成中关于映射表原理和中控代码的部分,这是最终形态

学习时的三个原则

  1. 先跑起来,再读源码:每个有源码的阶段,先编译烧录看效果,建立感性认识后再深入代码
  2. 对比学习:H5 和 F030 做的事情高度相似(UART + libmodbus + Bootloader),学完 H5 再学 F030 时重点关注差异点
  3. 善用工具:ModbusPoll 和 ModbusSlave 可以模拟通信对端,不用每次都用真实硬件调试,大幅提升效率

八、总结

  1. 本项目构建了一套完整的 PC ↔ 中控(H5) ↔ 传感器(F030) 三层工业互联系统,技术栈覆盖 GPIO → UART → USB → Modbus → FreeRTOS → Bootloader → IAP
  2. 学习路线分 9 个阶段,阶段3(UART)阶段6(libmodbus) 是两大基石,值得反复回顾
  3. 三大核心设计思想:UART 设备抽象(用函数指针统一不同串口)、点映射表(解耦 PC 地址与传感器物理地址)、Bootloader 跨层转发(中控作为固件中转站)

九、结尾

这篇文章是整个系列的地图。当你学到不知道自己在哪的时候,回来翻一翻,找到自己的位置,然后决定下一步往哪走。

嵌入式学习没有捷径,但有方法——先建立全局视角,再逐个攻克细节。结合 AI 工具的辅助,这个学习过程会比传统方式更高效。希望这篇文章能帮你在学习的道路上少一些迷茫,多一些方向感。

Hello_Embed 在 AI 辅助嵌入式的路上与你同行。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐