模拟电路把物理世界变成电信号,数字电路把它变成 0 和 1,接下来要运算、控制、通信——这就是嵌入式。这篇从全局讲嵌入式开发的整体轮廓:单片机 vs 嵌入式 Linux、STM32 是什么、开发流程、常见外设,以及为什么它和纯软件不一样。
一、嵌入式在解决什么问题
普通软件跑在通用电脑上(CPU + 操作系统 + 无限内存)。嵌入式不一样:
- 专用:一个芯片只为特定任务(采集温度、控制电机、蓝牙通信)
- 资源受限:几 KB 到几 MB 内存、几十 MHz 主频
- 实时/硬实时:传感器中断来了必须立刻响应(毫秒级)
- 直接碰硬件:程序要读写寄存器控制 GPIO 引脚
简单说:嵌入式 = 让芯片上的软件直接控制物理世界。你的《模拟电路》和《数字电路》知识在这里汇合。
二、两个世界:单片机 vs 嵌入式 Linux
| 维度 | 单片机(MCU) | 嵌入式 Linux(MPU) |
|---|---|---|
| 代表 | STM32、ESP32、AVR | Raspberry Pi、全志/瑞芯微 |
| 内核 | Cortex-M(无 MMU) | Cortex-A(有 MMU,跑 Linux) |
| 操作系统 | 裸机 / FreeRTOS(实时) | Linux(非实时,可用 RT 补丁) |
| 资源 | KB 级 RAM、几十 MHz | MB 级 RAM、GHz 级 |
| 应用 | 家电、仪表、电机、传感器节点 | 路由器、网关、机器人、工业平板 |
| 开发 | 交叉编译 + 烧录(ST-Link) | 交叉编译 + SD 卡/镜像刷写 |
你已经有《树莓派实践》——树莓派就是典型的嵌入式 Linux。本篇讲的是另一侧:单片机(STM32),更贴近硬件、更能理解"软件怎么控制硬件"。
三、STM32 是什么
STM32 是意法半导体(STMicroelectronics)的 32 位微控制器系列,基于 ARM Cortex-M 内核。为什么它几乎是入门标准:
- 生态最完整:官方 STM32CubeMX(图形化配置引脚/时钟)+ STM32CubeIDE(集成开发环境)+ HAL 库
- 型号覆盖广:从 F1(入门)到 F4(高性能)到 H7(旗舰),同一套开发方式
- 外设齐全:GPIO、ADC、UART、I2C、SPI、TIM(定时器)、DMA、USB、CAN
- 资料多:中文社区、教程、开发板(正点原子/野火)极多
STM32 芯片内部(粗略):
┌─────────────────────────────┐
│ ARM Cortex-M 内核(算力) │ ← 上一篇的逻辑门/触发器构成
│ Flash(存程序)+ RAM(跑数据) │
│ 外设:GPIO / ADC / UART ... │ ← 和物理世界打交道
└─────────────────────────────┘四、开发流程:一套完整的上手路径
- 硬件准备:STM32 开发板(如 STM32F103C8T6 最小系统板,几十元)+ ST-Link 烧录器
- 工程生成:STM32CubeMX 选芯片 → 勾选外设(如 ADC + UART)→ 配置时钟 → 生成初始化代码
- 写业务逻辑:在
main.c里用 HAL 库函数写应用(HAL_ADC_Start()、HAL_UART_Transmit()) - 编译烧录:STM32CubeIDE 编译 → ST-Link 烧录到 Flash
- 调试:SWD 调试器断点/变量观察 + 串口打印日志
从零到点灯(GPIO 控制 LED)大概半天;到 ADC 采样 + 串口输出,一天内能跑通——门槛比想象低,关键是要有一块开发板。
五、常见外设(从软到硬的理解)
| 外设 | 干什么 | 和你的知识呼应 |
|---|---|---|
| GPIO | 通用输入输出:读按键、控制 LED/继电器 | 逻辑门的物理出口 |
| ADC | 模拟转数字:采样电压 | 《模拟电路》:运放放大 + RC 滤波 → ADC |
| UART | 串口通信:调试日志、对接模块 | 最常用的"printf"通道 |
| I2C | 双线总线:接传感器(温湿度/加速度) | 地址寻址、时序 |
| SPI | 高速四线总线:接屏幕/Flash | 速率更高的总线 |
| TIM/PWM | 定时器/脉宽调制:控制舵机、LED 亮度 | 时间维度控制 |
最值得第一个打通的外设是 ADC——它把《模拟电路》的两篇文章串起来:传感器 → 运放放大 → RC 滤波 → STM32 的 ADC 引脚采样 → 串口输出数值。这条链路就是"模拟世界数字化"的完整演示。
六、软件工程师学嵌入式的优势与坑
优势:你会写代码、懂状态机、懂数据结构——嵌入式应用层开发(采集逻辑、协议解析、状态机)对你很自然。
坑(纯软件背景最容易踩):
- 交叉编译:代码在本机编译,运行在芯片上——工具链(arm-none-eabi-gcc)和链接脚本(.ld 文件)和普通程序完全不同
- 没有内存保护:指针写错直接死机(没有 OS 兜底),要养成"寄存器/缓冲区边界"意识
- 中断思维:主循环 + 中断回调,并发问题比多线程更难查
- 查错靠硬件:串口日志、逻辑分析仪、示波器——不是 printf 就能解决一切
小结
- 嵌入式 = 让芯片上的软件直接控制物理世界,分单片机(STM32/裸机/FreeRTOS)和嵌入式 Linux(树莓派)两路
- STM32 = ARM Cortex-M + ST 生态(CubeMX 图形化配置 + CubeIDE + HAL 库),开发门槛低、资料多
- 技术栈分层:应用 → RTOS → HAL 库 → 寄存器 → 芯片
- 第一条实战链路建议:传感器 → 运放 → RC 滤波 → ADC 采样 → 串口输出(把模电两篇全部用上)
- 需要开发板实跑;本文静态核对标注:无硬件,未实跑
接下来可以看《数字电路》(触发器和 CPU 的记忆)、《模拟电路》(ADC 前级)、《树莓派实践》(嵌入式 Linux 实例)。
