聊聊嵌入式的历史与生态

聊聊嵌入式的历史与生态
星野暗涌聊聊嵌入式的历史与生态
学习嵌入式,很多人一上来就想点灯、配串口、看寄存器、写驱动。这些当然重要,但如果没有宏观认知,很容易把 GPIO、RCC、USART、I2C 看成一堆孤立知识点。
这篇文章先不急着写代码,而是先回答一个更底层的问题: 嵌入式系统从哪里来,它为什么会长成今天这个样子?
提示: 嵌入式不是单纯的“单片机编程”。它是计算机、半导体、控制系统、软件工程和产业供应链共同演化出来的一类工程体系。
01. 先把全局地图展开
mindmap
root((嵌入式宏观认知))
历史动力
军事计算
冷战科技竞争
军转民
摩尔定律
系统本质
专用计算机
软硬件结合
实时性
资源受限
技术方向
MCU
应用处理器
FPGA
DSP
产业生态
ARM/RISC-V
芯片厂商
开发板厂商
产品公司
工程能力
读文档
用工具链
调试系统
做产品
嵌入式学习的难点,不在于某一个外设真的有多玄,而在于它横跨了太多层次:底层有 CPU、寄存器、总线和电路,上层有业务逻辑、通信协议和产品场景,中间还有编译、链接、烧录、调试、文档、工具链。
所以第一步不是背知识点,而是先建立一张地图。地图有了,后面学每个模块时,才知道它在整个系统中处于什么位置。
02. 计算机为什么会诞生
早期计算机不是为了打游戏、写文档、刷网页而出现的。它首先服务的是军事、科研和国家级工程需求。
1946 年,ENIAC 问世。它常被视为现代电子计算机的重要开端之一,早期用途就包括弹道计算。第二次世界大战之后,世界进入冷战阶段,国家竞争进一步推动了计算机、互联网、GPS、集成电路和航天技术的发展。
timeline
title 计算机与嵌入式演进
1940s : 电子计算机 : 军事、科研
1950s-1970s : 半导体 : 晶体管、集成电路、微处理器
1970s-1980s : 嵌入式 : 导弹、飞机、工业设备
1990s-2010s : MCU 与物联网 : ARM、STM32、ESP32
今天 : 边缘智能 : 联网、交互、AI 推理
极限需求推动技术突破,国家投入完成早期研发,民用市场完成规模化扩散。
这就是很多现代技术背后的共同路径:先在高成本、高风险、高价值场景中诞生,再通过产业化进入普通人的生活。
03. 摩尔定律改变了计算机的形态
1965 年,Gordon Moore 观察到集成电路上的晶体管数 量会随时间快速增长。后来业界通常将其概括为:晶体管数量大约每 18 到 24 个月翻一倍。
它带来的不只是“芯片越来越快”,更重要的是计算能力开始不断下沉。
flowchart LR
A["大型机<br/>集中计算"] --> B["服务器<br/>企业科研"]
B --> C["个人电脑<br/>进入桌面"]
C --> D["智能手机<br/>进入口袋"]
D --> E["嵌入式<br/>进入万物"]
E --> F["边缘智能<br/>端侧决策"]
classDef compute fill:#eef6ff,stroke:#3b82f6,color:#1f2937,stroke-width:1.5px;
classDef embedded fill:#ecfdf5,stroke:#10b981,color:#064e3b,stroke-width:1.5px;
class A,B,C,D compute;
class E,F embedded;
当计算能力足够便宜、足够小、足够省电,它就不再只属于机房和电脑,而是进入汽车、空调、耳机、手表、传感器、机器人和医疗设备。
嵌入式系统就是在这个趋势中长出来的。
04. 通用计算机 vs 专用计算机
计算机并不只等于我们桌上的 PC。根据目标不同,它可以分成几种形态。
| 类型 | 代表设备 | 核心目标 | 典型特点 |
|---|---|---|---|
| 通用计算机 | PC、服务器、手机 | 一台机器做很多事 | 功能由软件生态决定 |
| 高性能计算机 | 超算、AI 训练集群 | 解决超大规模计算 | 追求算力、吞吐和并行 |
| 专用计算机 | 空调、ECU、飞控、手表 | 稳定完成特定任务 | 低成本、低功耗、强实时 |
核心结论: 通用计算机追求“我什么都能干”,嵌入式系统追求“我把这件事稳定、便宜、低功耗地干好”。
空调里的控制板不需要运行 Photoshop,电饭煲里的 MCU 不需要剪视频,汽车刹车系统也不需要打开浏览器。它们需要的是在确定时间内稳定完成特定动作。
这就是嵌入式系统的根本定位:专用计算机。
05. 什么是嵌入式系统
flowchart LR
Product["产品设备<br/>汽车 / 空调 / 无人机"] --> Embedded["嵌入式系统<br/>内部控制核心"]
Embedded --> HW["硬件<br/>MCU / 传感器 / 电源"]
Embedded --> SW["软件<br/>驱动 / RTOS / 协议"]
Embedded --> Rule["约束<br/>成本 / 功耗 / 实时性"]
Embedded --> Task["任务<br/>采集 / 控制 / 通信"]
嵌入式系统不是一个单独摆在桌面上的“电脑”,而是嵌入到更大设备里的计算系统。用户买的是汽车、空调、手表、无人机,不是“嵌入式系统”本身。
它通常有几个核心特征。
| 特征 | 说明 |
|---|---|
| 嵌入产品内部 | 它是产品的一部分,用户通常看不见它,但产品的智能化和自动控制都依赖它。 |
| 面向特定任务 | 微波炉控制加热,BMS 管理电池,无人机飞控控制姿态,每个系统都有明确使命。 |
| 资源天然受限 | Flash、RAM、算力、功耗、体积和成本都有限,不能像 PC 一样随意堆配置。 |
| 强调实时可靠 | 刹车、电机、医疗报警、工业控制不能“卡一下”,很多动作必须在确定时间内完成。 |
06. 嵌入式的四条主线
嵌入式不是只有 STM32,也不是只有单片机。按核心计算架构看,常见方向可以这样理解:
flowchart LR
E((嵌入式技术方向))
E --> MCU["MCU<br/>低功耗 / 实时控制"]
E --> MPU["应用处理器<br/>Linux / 多媒体"]
E --> FPGA["FPGA<br/>并行 / 低延迟"]
E --> DSP["DSP<br/>信号 / 音频 / 电机"]
MCU --> M1[STM32 / GD32 / ESP32 / AVR]
MPU --> P1[i.MX / RK3568 / RK3588 / 树莓派]
FPGA --> F1[Xilinx / Intel FPGA / 高云 / 安路]
DSP --> D1[TI C2000 / SHARC / DSP IP]
| 方向 | 关键词 | 典型场景 | 初学建议 |
|---|---|---|---|
| MCU | 控制、实时、低功耗 | 家电、传感器、电机、汽车节点 | 适合作为入门主线 |
| 应用处理器 | Linux、图形、多媒体 | 智能屏、网关、视觉设备 | 有 MCU 基础后更容易理解 |
| FPGA | 并行、低延迟、硬件逻辑 | 通信、雷达、视频、高速采集 | 更偏数字电路与硬件设计 |
| DSP | 信号处理、乘加、滤波 | 音频、通信、电机控制 | 独立芯片减少,能力常集成到 SoC/MCU |
真实产品往往不是单一方向,而是多种技术的组合。例如一个机器人可能同时包含 MCU、应用处理器、传感器、驱动器、通信模块和 AI 模型。
07. ARM、STM32 与产业分工
很多初学者会把 ARM、STM32、单片机混在一起。其实它们处在产业链的不同位置。
flowchart LR
ARM["ARM<br/>架构与内核 IP"] --> ST["芯片厂商<br/>集成外设与存储"]
RISC["RISC-V<br/>开放指令集"] --> Chip["芯片厂商<br/>自研 MCU / SoC"]
ST --> STM32["STM32 MCU<br/>可购买芯片"]
Chip --> OtherMCU["其他 MCU<br/>GD32 / ESP32"]
STM32 --> Board["开发板<br/>核心板 / 最小系统"]
OtherMCU --> Board
Board --> Engineer["工程师<br/>写驱动 / 调系统"]
Engineer --> Product["终端产品<br/>汽车 / 工业 / 医疗"]
ARM 通常不直接卖 STM32 这样的 MCU。它更像是提供 CPU 内核和架构授权的公司。ST、NXP、TI、Microchip 等芯片厂商基于这些内核,再集成自己的外设、电源、存储和封装,最终做出具体芯片。
STM32 就是 ST 基于 ARM Cortex-M 生态推出的一大类 MCU 产品。
注意: 学习 STM32 时,不要只记“这是一个单片机”。更重要的是理解:STM32 是 ARM 内核、ST 外设设计、芯片文档、开发工具和社区生态共同组成的产品体系。
08. 文档是嵌入式世界的通用语言
嵌入式产业建立在分工之上。有人设计 CPU,有人制造 MCU,有人画 PCB,有人写驱动,有人做产品。分工越细,越需要文档来协作。
flowchart LR
Need["开发功能"] --> Q1{"查什么文档"}
Q1 --> DS["Datasheet<br/>型号 / 引脚 / 电气"]
Q1 --> RM["Reference Manual<br/>外设 / 寄存器 / 时钟"]
Q1 --> SCH["原理图<br/>引脚连接"]
Q1 --> AN["Application Note<br/>专题案例"]
Q1 --> ES["Errata<br/>已知问题"]
DS --> HW[硬件选型与画板]
RM --> Driver[软件驱动开发]
SCH --> BoardUse[开发板功能定位]
AN --> Practice[功能实现参考]
ES --> Debug[疑难问题排查]
| 文档 | 你可以把它理解成 | 主要回答的问题 |
|---|---|---|
| Datasheet | 芯片体检表 | 这颗芯片有什么资源,怎么供电,哪些引脚能用 |
| Reference Manual | 外设说明书 | GPIO、USART、I2C、Timer、ADC 等外设怎么工作 |
| Programming Manual | 内核编程手册 | CPU 内核、中断、异常、Flash 编程等底层机制 |
| Errata | 官方避坑清单 | 芯片有哪些已知问题,如何规避 |
| Application Note | 官方实战教程 | 某个具体功能如何设计和实现 |
| 原理图 | 板级连接地图 | MCU 引脚和 LED、按键、传感器、接口如何连接 |
数据手册告诉你芯片是什么,参考手册告诉你芯片怎么用,原理图告诉你芯片和板子怎么连。
所以,读文档不是额外负担,而是嵌入式工程师真正进入工业世界的基本能力。
09. STM32 工具链到底在做什么
写 C 代码只是开始。代码要真正跑到芯片里,需要经过一整条工具链。
sequenceDiagram
participant Dev as 开发者
participant Editor as VS Code / Keil
participant Cube as STM32CubeMX
participant Compiler as 编译器与链接器
participant Probe as ST-Link
participant MCU as STM32 MCU
Dev->>Cube: 配置引脚、时钟、外设
Cube-->>Editor: 生成初始化代码
Dev->>Editor: 编写业务逻辑与驱动代码
Editor->>Compiler: 编译、链接
Compiler-->>Editor: 生成 ELF / HEX / BIN
Editor->>Probe: 下载与调试
Probe->>MCU: 写入 Flash、控制断点、读取寄存器
MCU-->>Dev: 在真实硬件上运行和反馈
| 工具 | 作用 |
|---|---|
| Keil MDK | 负责编译、链接、下载、调试,是企业中仍然常见的 ARM MCU 开发环境。 |
| VS Code | 负责提供更现代的代码编辑体验,适合阅读源码、写业务逻辑和管理项目。 |
| STM32CubeMX | 负责图形化配置引脚、时钟和外设,并生成初始化代码。 |
| HAL 库 | 提供硬件抽象层 API,降低直接操作寄存器的入门门槛。 |
不要误解: HAL 可以帮你生成配置代码,但不能替你理解时钟树、中断、寄存器和外设工作原理。正确姿势是:先跑通,再读源码,再回到参考手册。
10. 嵌入式软件的分层结构
嵌入式代码不是一坨函数堆在一起。成熟工程一般会形成分层。
flowchart LR
App["应用层<br/>业务 / 状态 / 协议"]
Mid["中间层<br/>RTOS / 文件 / 网络 / GUI"]
Drv["驱动层<br/>GPIO / USART / I2C / SPI"]
Hal["抽象层<br/>BSP / HAL / LL"]
Hw["硬件层<br/>CPU / 寄存器 / 时钟 / 中断"]
App --> Mid --> Drv --> Hal --> Hw
classDef app fill:#1f2a44,stroke:#7aa2ff,color:#f4f7ff,stroke-width:1px
classDef mid fill:#22354a,stroke:#5ec9a7,color:#f4f7ff,stroke-width:1px
classDef drv fill:#2a3148,stroke:#ffd166,color:#f4f7ff,stroke-width:1px
classDef hal fill:#2f2d46,stroke:#c792ea,color:#f4f7ff,stroke-width:1px
classDef hw fill:#342f3f,stroke:#ff8f70,color:#f4f7ff,stroke-width:1px
class App app
class Mid mid
class Drv drv
class Hal hal
class Hw hw
只看应用层,会不理解硬件为什么这样响应。只看寄存器,又容易缺少工程组织能力。真正成熟的嵌入式开发,需要能在不同层之间来回切换。
11. 裸机、RTOS 与 Linux 的选择
不同复杂度的嵌入式系统,会选择不同软件形态。
flowchart LR
Simple["简单控制<br/>灯 / 按键 / 串口"] --> Bare["裸机<br/>直接跑在 MCU 上"]
Multi["多任务<br/>采集 / 显示 / 通信"] --> RTOS["RTOS<br/>FreeRTOS / RT-Thread"]
Complex["复杂系统<br/>摄像头 / AI / GUI"] --> Linux["嵌入式 Linux<br/>驱动 / 内核 / 应用"]
| 软件形态 | 适合场景 |
|---|---|
| 裸机 | 适合打基础,理解芯片、外设、中断和时钟。 |
| RTOS | 适合多任务系统,解决调度、同步和资源管理。 |
| Linux | 适合复杂设备,处理网络、多媒体、文件系统和图形界面。 |
STM32 入门通常从裸机开始。等外设、中断、时钟和调试能力稳定后,再进入 RTOS,会顺很多。
12. 嵌入式行业应用版图
mindmap
root((嵌入式应用))
消费电子
耳机
手表
智能音箱
小家电
工业控制
PLC
电机驱动
传感采集
工业网关
汽车电子
ECU
BMS
车身控制
智能座舱
物联网
智能门锁
环境监测
无线模组
边缘网关
医疗设备
血糖仪
血氧仪
监护仪
便携检测
机器人与无人机
飞控
电机控制
传感器融合
视觉感知
边缘AI
语音唤醒
图像识别
缺陷检测
本地推理
嵌入式几乎存在于所有“设备智能化”的场景中。它不是一个窄方向,而是一组横跨行业的底层能力。
13. 从 STM32 入门的学习路线
与其把学习路线写成一长串清单,不如把它看成一条能力升级路径。
flowchart LR
A["硬件直觉<br/>LED / 按键 / 原理图"] --> B["基础外设<br/>GPIO / RCC / USART"]
B --> C["通信采集<br/>I2C / SPI / ADC / DMA"]
C --> D["系统机制<br/>中断 / 启动 / 内存"]
D --> E["工程能力<br/>封装 / 调试 / 文档"]
E --> F["RTOS<br/>任务 / 队列 / 锁"]
F --> G["方向深化<br/>IoT / Linux / AI"]
这个路线的关键不是“学完多少外设”,而是每学一个外设,都要补齐三件事:
| 能力 | 具体表现 |
|---|---|
| 看得懂硬件 | 知道外设接在哪个引脚,电平如何变化,原理图中对应哪一部分。 |
| 查得懂文档 | 能从参考手册中找到寄存器、时钟、中断和工作模式的依据。 |
| 调得动系统 | 能用串口、断点、寄存器窗口、逻辑分析仪等方法定位问题。 |
14. 最后,把这张图记住
flowchart LR
History["历史动力<br/>战争 / 科研 / 竞争"] --> Chip["半导体进步<br/>集成电路 / 微处理器"]
Chip --> Computer["计算形态<br/>通用 / 高性能 / 专用"]
Computer --> Embedded["嵌入式系统<br/>产品内部计算机"]
Embedded --> Ecosystem["产业生态<br/>ARM / ST / 工具链"]
Ecosystem --> Engineer["工程师能力<br/>软硬结合 / 调试"]
Engineer --> Product["真实产品<br/>工业 / 汽车 / IoT"]
嵌入式系统不是从某一颗芯片开始的,而是从计算机发展、半导体进步、产业分工和真实场景需求中生长出来的。
它的本质是专用计算机系统。它的目标不是“什么都能做”,而是在具体产品中稳定、实时、低成本、低功耗地完成特定任务。
等这张地图建立起来,再回头看 GPIO、RCC、USART、I2C、HAL、寄存器,就会发现它们不再是零散知识点,而是嵌入式世界里一块块可以拼起来的系统组件。
参考资料
| 资料 | 链接 |
|---|---|
| Arm 官方历史 | Arm official history |
| Arm Cortex-M 处理器家族 | Arm Cortex-M |
| STM32CubeMX 官方介绍 | STM32CubeMX |
| STM32CubeIDE 官方介绍 | STM32CubeIDE |
| FreeRTOS 官方网站 | FreeRTOS |
| Zephyr Project 官方网站 | Zephyr Project |
| RISC-V International | RISC-V |






