1. 课程导论与开发环境搭建

各位同学好,我是你们这门课的老周。做嵌入式十几年了,踩过的坑比吃过的盐还多。今天咱们先不急着写代码,把地基打牢。选错芯片、搭错环境,后面全白干——我见过太多人在这上面浪费两周时间。

1.1 STM32选型指南:别让芯片成为瓶颈

选型这事儿,说白了就是「够用就好,留有余量」。我刚开始带项目时总喜欢堆料,结果成本压不下来,老板脸都绿了。

STM32家族很庞大,但咱们做裸机驱动和状态机,重点关注这几个系列:

系列 内核 主频 典型场景 我的建议
F0 Cortex-M0 48 MHz 简单控制、替代8位机 成本敏感项目首选
F1 Cortex-M3 72 MHz 工业控制、电机驱动 经典款,资料最多
F4 Cortex-M4 168 MHz 音频处理、复杂算法 带FPU,适合数学运算
G0/G4 Cortex-M0+/M4 64-170 MHz 新设计、低功耗 性价比高,推荐新项目
H7 Cortex-M7 480 MHz 高性能、图形界面 裸机慎用,建议上RTOS
我的经验: 如果你刚开始学,从F103或G0系列入手最稳。F103资料多到看不完,G0则是新架构,功耗和价格都香。别一上来就搞H7,裸机状态机在H7上跑,中断延迟能把人逼疯。

1.2 HAL库 vs LL库:到底选哪个?

这个问题几乎每期课程都有人问。我的回答很直接:做产品用LL库,做原型用HAL库。

为什么会这样?咱们看个对比:

维度 HAL库 LL库
代码量 大,封装层多 小,接近寄存器
执行效率 中等,有额外开销 高,几乎无开销
易用性 高,API直观 低,需要懂寄存器
调试难度 容易,有超时机制 较难,需自己处理
适合场景 快速原型、复杂外设 性能敏感、裸机驱动

我记得有一次做电机控制项目,用HAL库的PWM输出,频率一高就丢脉冲。查了两天,发现是HAL库在中断里做了太多状态检查。换成LL库,直接操作寄存器,问题秒解。从那以后,凡是时序敏感的外设,我都用LL库。

注意: 别以为LL库就是「反汇编式编程」。LL库只是薄封装,该有的抽象还在。你想想看,直接操作寄存器虽然快,但可读性差,团队协作时容易出问题。我的做法是:核心驱动用LL库,上层逻辑用HAL库的抽象接口。

1.3 裸机 vs RTOS:别被「实时系统」四个字唬住

很多新手一上来就问:「老师,是不是必须上RTOS?」我的回答是:先问自己三个问题。

  1. 任务数量: 超过5个独立任务了吗?
  2. 实时性要求: 有没有毫秒级以下的硬实时需求?
  3. 资源限制: RAM够不够?RTOS内核至少占2-4KB RAM。

如果三个答案都是「否」,那裸机完全够用。咱们这门课讲的就是裸机状态机——说白了,就是用状态机来模拟多任务调度。我做过一个智能家居网关,8个状态机轮转,跑在F103上,稳如老狗。

裸机的优势很明显:

  • 零上下文切换开销——中断响应就是纳秒级
  • 内存占用极低——几百字节RAM就能跑
  • 调试简单——没有优先级反转、死锁这些头疼问题

但裸机也有短板:任务多了代码会乱。所以咱们这门课的核心就是——用状态机把裸机代码写出RTOS的架构感。

决策树: 任务数 ≤ 5 且 实时性要求不高 → 裸机 + 状态机;任务数 > 5 或 有硬实时要求 → RTOS。中间地带?我建议先裸机,等发现不够用了再移植RTOS,反正STM32的RTOS移植也就半天功夫。

1.4 开发环境搭建:Keil / IAR / STM32CubeIDE

工具链这事儿,没有绝对的好坏,只有习惯。我三个都用过,说说真实感受。

Keil MDK

老牌工具,ARM的亲儿子。编译快,调试稳,但License贵得离谱。个人学习可以用社区版,限制32KB代码——说实话,咱们这门课的代码量,32KB够用了。

IAR Embedded Workbench

优化能力最强,同样的代码能比Keil小10%-15%。但界面丑,快捷键反人类。我当年第一次用IAR,找个「Build」按钮找了五分钟。

STM32CubeIDE

免费、开源、基于Eclipse。集成了CubeMX,图形化配置外设。缺点是比较吃内存,8GB以下的老电脑会卡。我个人建议:新项目用CubeIDE,维护老项目用Keil。

搭建步骤其实大同小异:

  1. 下载安装对应IDE(CubeIDE直接去ST官网,免费)
  2. 安装芯片支持包(Keil需要手动装Pack,CubeIDE自动下载)
  3. 配置调试器(ST-Link / J-Link / DAP-Link)
  4. 新建工程,选芯片,配时钟
  5. 写个点灯程序,验证环境
避坑指南: 我曾经在调试器配置上卡了一整天。ST-Link的驱动版本和IDE不匹配,导致一直连不上芯片。解决办法很简单:去ST官网下载最新的「ST-Link Utility」,把固件升级到最新。另外,接线要确认——SWD的SWCLK和SWDIO别接反了,GND必须共地。

1.5 调试器配置:别让硬件成为拦路虎

调试器是嵌入式开发的「眼睛」。没有它,你就是在盲写代码。我见过有人用串口打印来调试中断——嗯,也不是不行,但效率低到令人发指。

主流调试器对比:

调试器 速度 价格 兼容性 推荐指数
ST-Link/V2 4 MHz 免费(开发板自带) 仅ST芯片 ⭐⭐⭐⭐⭐
J-Link EDU 10 MHz 约300元 全ARM芯片 ⭐⭐⭐⭐
DAP-Link 2 MHz 约30元 全ARM芯片 ⭐⭐⭐

配置要点:

  • 速度别拉满: 我习惯用1MHz,稳定第一。4MHz以上容易受干扰。
  • 复位方式: 选「硬件复位」或「SYSRESETREQ」,别用「软件复位」——有时候会卡死在启动文件里。
  • Flash下载算法: 选对芯片型号,不然下载到一半报错。
曾经踩过的坑: 有一次调试时,每次全速运行就死机。查了半天,发现是调试器的SWO引脚和板子上的某个外设冲突了。解决办法:在调试器配置里关掉SWO,只用SWD的两根线。所以,如果你的板子莫名其妙出问题,先试试「最小调试配置」——只接SWCLK、SWDIO、GND三根线。

1.6 本章知识体系总览

下面这张图,把咱们第一章的核心逻辑串起来了。你想想看,选型、库选择、OS决策、环境搭建——每一步都影响后面的开发效率。

第一章知识体系结构图 第一章:课程导论与开发环境搭建 STM32裸机驱动封装与状态机设计 ① STM32选型指南 ② HAL库 vs LL库 ③ 裸机 vs RTOS ④ 环境搭建与调试 F0/F1/F4/G0/H7 成本/性能/功耗 代码量/效率/易用 产品用LL/原型用HAL 任务数/实时性/RAM 裸机+状态机方案 Keil/IAR/CubeIDE ST-Link/J-Link配置 核心目标:建立可复用的裸机驱动开发体系 选对芯片 → 选对库 → 选对架构 → 搭好环境