1. 课程导入

各位同学好,我是你们这门课的老张。做嵌入式底层开发十几年了,踩过的坑比写过的代码还多。今天咱们开始第一讲,先把地基打牢。

很多人学MCU开发,上来就点灯、刷屏、跑RTOS。结果项目一复杂,代码乱成一锅粥。我见过太多这样的案例了——驱动和业务逻辑混在一起,换个芯片平台,整个项目几乎重写。为什么会这样?说白了,就是缺少分层架构的思想。

1.1 MCU分层架构思想概述

嵌入式软件的分层架构,不是花架子。它解决的是工程问题:可移植、可复用、可调试。

我习惯把MCU软件分成三层:

  • 硬件抽象层(HAL):直接操作寄存器,封装MCU外设的基本操作。比如GPIO的置位/清零、UART的发送/接收字节。
  • 驱动封装层(Driver):在HAL之上,封装外设的完整功能。比如初始化UART、配置波特率、发送字符串。这一层开始屏蔽硬件细节。
  • 中间件层(Middleware):与硬件无关的通用模块。比如环形缓冲区、Modbus协议栈、文件系统、命令行调试接口。

你想想看,如果这三层分得清楚,换MCU时只需要重写最底层的HAL,上面的驱动和中间件几乎不用动。我在一个工业控制项目里,从STM32F1换到GD32F3,只改了HAL层不到500行代码,上层逻辑全部复用。这就是分层架构的价值。

核心原则:上层不直接调用下层寄存器,下层不依赖上层业务逻辑。每一层只通过接口函数与相邻层通信。

下面这张图,是我每次培训必画的架构图。它清晰地展示了数据流和依赖关系。

MCU软件分层架构图 应用层(Application) 业务逻辑、任务调度、用户交互 中间件层(Middleware) 协议栈(Modbus/CANopen) | 文件系统 | 环形缓冲区 | CLI调试 与硬件无关,可跨平台复用 驱动封装层(Driver) UART驱动 | I2C驱动 | SPI驱动 | GPIO驱动 | Timer驱动 封装外设完整功能,屏蔽寄存器细节 硬件抽象层(HAL) 寄存器操作 | 外设时钟使能 | 中断向量配置 箭头方向:上层调用下层接口,下层不反向依赖上层

1.2 为什么需要驱动封装与中间件

我直接说几个真实场景,你就明白了。

场景一:换芯片
项目做到一半,老板说成本压不下来,换国产芯片。如果你驱动和业务写在一起,那恭喜你,至少一个月重构。如果分层了,改HAL层就行,一周搞定。

场景二:团队协作
A工程师写驱动,B工程师写业务逻辑。如果驱动封装得干净,B根本不需要看芯片手册。给个接口文档就能干活。我在一个车载项目里,驱动组和业务组就是这么配合的,效率翻倍。

场景三:调试与测试
中间件层可以独立测试。比如环形缓冲区,你可以在PC上编译测试,不用烧到板子上。驱动封装层也可以写单元测试,模拟寄存器返回值。这在传统嵌入式开发里很少见,但确实好用。

我的建议:从第一个项目开始就坚持分层。哪怕是个点灯程序,也把GPIO驱动封装成函数。养成习惯后,你会感谢自己的。

1.3 开发板选型与IDE安装

这门课我们以STM32系列为主,兼顾国产替代。选型上我推荐以下配置:

项目 推荐型号 说明
入门级 STM32F103C8T6(蓝色妖姬) 资源丰富,资料最多,适合初学者
进阶型 STM32F407VET6 带FPU和DSP指令,适合中间件性能测试
国产替代 GD32F303 / AT32F403 与STM32引脚兼容,体验移植过程

IDE方面,我建议你三个都装,但主力用STM32CubeIDE。为什么?

  • Keil MDK:行业老牌,很多公司还在用。编译快,调试稳定。但收费,且代码编辑体验一般。
  • IAR EWARM:优化能力强,代码密度高。适合量产项目。但界面老旧,学习曲线陡。
  • STM32CubeIDE:免费,基于Eclipse,集成了CubeMX配置工具。我个人最推荐。尤其是它的代码生成和调试视图,非常顺手。

避坑指南:我曾经在Keil里开了最高优化等级,结果一个延时函数被优化掉了,电机直接飞车。后来养成习惯:调试阶段用-O0,发布前再开优化,并且逐项验证。

安装步骤我就不啰嗦了,官网下载安装包,一路Next就行。注意一点:Keil和IAR需要破解或License,STM32CubeIDE完全免费。路径不要带中文,否则编译报错你都不知道为什么。

1.4 调试工具准备

调试器是嵌入式开发的“听诊器”。没有它,你只能靠printf猜问题。

J-Link vs ST-Link

特性 J-Link(SEGGER) ST-Link(ST官方)
速度 最高可达50 MHz(SWD) 通常4 MHz,部分版本支持更高
兼容性 支持ARM Cortex全系列,以及RISC-V 仅支持ST芯片
软件生态 J-Flash、Ozone、SystemView STM32CubeProgrammer、STM32Monitor
价格 正版较贵(教育版便宜) 开发板自带,或几十元
推荐场景 多平台开发、性能调试 ST芯片专用、入门学习

我个人习惯:桌面常备一个J-Link Plus,包里放一个ST-Link V3。J-Link的调试速度确实快,尤其是下载大程序时,差距明显。但ST-Link胜在便宜,而且STM32CubeIDE原生支持,即插即用。

小技巧:J-Link的SWD接口可以虚拟串口(VCOM),省掉一个USB转串口模块。调试时一根线搞定下载和打印,桌面清爽很多。

连接方式很简单:SWD只需要4根线——SWDIO、SWCLK、GND、VCC(可选)。注意VCC是参考电平,不是给板子供电。我曾经接错过,把调试器烧了,嗯,那是个惨痛的教训。