1. 课程导入
各位同学好,我是你们这门课的老张。做嵌入式底层开发十几年了,踩过的坑比写过的代码还多。今天咱们开始第一讲,先把地基打牢。
很多人学MCU开发,上来就点灯、刷屏、跑RTOS。结果项目一复杂,代码乱成一锅粥。我见过太多这样的案例了——驱动和业务逻辑混在一起,换个芯片平台,整个项目几乎重写。为什么会这样?说白了,就是缺少分层架构的思想。
1.1 MCU分层架构思想概述
嵌入式软件的分层架构,不是花架子。它解决的是工程问题:可移植、可复用、可调试。
我习惯把MCU软件分成三层:
- 硬件抽象层(HAL):直接操作寄存器,封装MCU外设的基本操作。比如GPIO的置位/清零、UART的发送/接收字节。
- 驱动封装层(Driver):在HAL之上,封装外设的完整功能。比如初始化UART、配置波特率、发送字符串。这一层开始屏蔽硬件细节。
- 中间件层(Middleware):与硬件无关的通用模块。比如环形缓冲区、Modbus协议栈、文件系统、命令行调试接口。
你想想看,如果这三层分得清楚,换MCU时只需要重写最底层的HAL,上面的驱动和中间件几乎不用动。我在一个工业控制项目里,从STM32F1换到GD32F3,只改了HAL层不到500行代码,上层逻辑全部复用。这就是分层架构的价值。
核心原则:上层不直接调用下层寄存器,下层不依赖上层业务逻辑。每一层只通过接口函数与相邻层通信。
下面这张图,是我每次培训必画的架构图。它清晰地展示了数据流和依赖关系。
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是参考电平,不是给板子供电。我曾经接错过,把调试器烧了,嗯,那是个惨痛的教训。