前言:

回顾整个系列,我发现有两件事更基础、也更迫切:

  1. 学会阅读数据手册 —— 因为脱离教程后,你唯一的依靠就是芯片原厂的文档。
  2. 编写可维护的代码 —— 因为能跑的代码和能长期维护的代码,是两种完全不同的境界。

所以,这篇总结分为两大块:

  • 上篇:两个核心技能 —— 读手册 + 写可维护代码
  • 下篇:系列各篇精华回顾

上篇:两个让你“脱胎换骨”的核心技能

一、学会阅读数据手册 —— 工程师的“最后防线”

当你不再满足于跑通例程,而是想用自己的方式配置外设、优化功耗、调试诡异 bug 时,你会发现:教程救不了你,但数据手册可以

1. 数据手册 vs 参考手册 —— 别搞混了
文档类型 英文名 主要内容 谁该读
数据手册 Datasheet 电气特性、引脚排列、封装尺寸、绝对最大额定值 硬件工程师、选型工程师
参考手册 Reference Manual 寄存器描述、外设操作时序、工作模式、代码示例 软件工程师、驱动开发者

简单判断:你想知道“这个引脚能输出多大电流?” → 查数据手册。你想知道“如何配置 USART 的波特率?” → 查参考手册。

2. 如何高效阅读参考手册(以 STM32 为例)

一本参考手册动辄上千页,千万别从头读到尾。带着问题读

  • 我要用哪个外设? → 直接跳到该外设章节(如 Chapter 27: I2C)。
  • 这个外设需要使能时钟吗? → 找 RCC 章节,看外设挂在哪个总线上(AHB/APB)。
  • 寄存器怎么配? → 找章节末尾的“Register Map”表格,每个寄存器的位定义都在那里。
  • 时序图看不懂? → 先看文字描述,再看图例。重点关注“主设备驱动”和“从设备驱动”的信号区别。
3. 读懂时序图的三步法

以 I2C 起始条件为例(SCL 高时 SDA 由高跳低):

  • 第一步:分清哪条线是时钟(SCL),哪条是数据(SDA)。
  • 第二步:找到时序图中标注的“t_SU;STA”、“t_HD;STA”等时间参数,它们决定了你的代码是否需要插入延时。
  • 第三步:用逻辑分析仪抓取实际波形,与手册时序图对比。不匹配的地方就是 bug 所在。

二、编写可维护的嵌入式代码 —— 对“屎山”说不

很多初学者写代码只有一个目标:“能跑就行”。但当代码超过 2000 行、或者需要交给同事维护时,你会为当初的随意命名、函数过长、全局变量泛滥而付出惨痛代价。

1. 命名与注释 —— 让代码自己说话

好的命名

  • uint32_t system_runtime_mst
  • HAL_GPIO_TogglePin(LED_PORT, LED_PIN)HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, !GPIO_PIN_RESET) 好(用宏封装)

注释原则

  • 解释“为什么这么做”,不是“做了什么”。
    i++; // 增加 i
    // 跳过命令字节,因为协议规定第一个字节为命令码
  • 模块头文件必须包含:功能描述、使用方法、作者、日期、已知限制。
2. 分层架构 —— 别把鸡蛋放在一个 while 里

一个清晰的项目应该至少分三层:

应用层(main.c,用户逻辑)
   ↓ 调用
中间层(协议解析、数据处理、状态机)
   ↓ 调用
驱动层(hal_uart.c,hal_i2c.c,hal_timer.c)
   ↓ 直接操作
硬件层(寄存器映射、中断向量,通常由 CMSIS 提供)

规则

  • 驱动层每个外设独立文件,提供 initsendreceivecallback 等标准接口。
  • 应用层不应该直接操作 GPIO 寄存器,而应该调用 led_on() / led_off()
  • 全局变量尽量用 static 限制在文件内,对外提供 get_xxx() / set_xxx() 函数。
3. 配置管理 —— 不要硬编码

把项目参数(如串口波特率、定时器周期、任务栈大小)集中放在 config.h 中,用宏定义。这样修改参数时只需改一处,而不是满文件搜 9600

// config.h
#define UART_BAUDRATE    115200
#define LED_BLINK_MS     500
#define TASK_STACK_SIZE  256
4. 版本控制 —— Git 是你的后悔药

即使你一个人做项目,也要用 Git。不需要记住复杂命令,只要会用:

  • git init / git clone
  • git add / git commit / git push
  • git log / git diff
  • git branch / git checkout

一个坏习惯:注释掉大段代码而不删。用 Git 管理后,删掉的代码随时可以从历史找回,别留在文件里污染视线。

下篇:系列文章精华回顾

这个系列一共 12 篇正文 + 1 篇番外,覆盖了从零基础到独立开发的核心知识点。下面按推荐阅读顺序,提炼每篇的核心思想。

第一篇:嵌入式到底是什么? —— 从一个 LED 开始

核心:嵌入式不是玄学,就是让硬件按你的代码工作。通过点灯程序,理解时钟、GPIO、主循环的基本概念。
附赠:厘清了 ARM、C51、STM32 的关系——ARM 是架构,C51 是 8 位老前辈,STM32 是 ARM 架构的具体芯片。

第二篇:串口江湖 —— UART、RS-232、RS-485

核心:UART 是“说话的方式”(异步、全双工),RS-232 和 RS-485 是“说话的电气标准”。RS-485 差分信号适合工业远距离、多节点。
实战:通过 USB 转 TTL 模块打印调试信息。

番外篇:波特率解析

核心:波特率是每秒传输的码元数,在串口中通常等于比特率。常见值(9600、115200)源于机械电传时代和晶振分频便利性。
避坑:收发双方波特率误差必须 < 5%,远距离要降速。

第三篇:两线走天下 —— I2C 总线精讲

核心:I2C 用 SDA 和 SCL 两根线,通过开漏+上拉实现“线与”和多主仲裁。协议包括起始、地址、应答、停止。
实战:用 GPIO 模拟 I2C 读写 EEPROM。

第四篇:极速先锋 —— SPI 总线精讲

核心:SPI 四线(SCLK、MOSI、MISO、CS),全双工,速度可达几十 MHz。四种模式由 CPOL 和 CPHA 组合。
对比:I2C 省引脚但慢,SPI 快但费引脚,没有应答机制。

第五篇:嵌入式大脑 —— 中断与事件驱动

核心:中断让 CPU 从“轮询”变为“事件驱动”。NVIC 管理优先级,ISR 必须快进快出。
实战:外部按键中断翻转 LED。

第六篇:时间管理大师 —— 定时器与系统滴答

核心:定时器是计数器+时钟源,可产生非阻塞延时、PWM、输入捕获、编码器接口。SysTick 是内核定时器,RTOS 的心跳。
公式:溢出时间 = (ARR+1)*(PSC+1)/定时器时钟。

第七篇:存储与地址 —— 大小端、内存映射、4GB 空间之谜

核心:STM32 拥有 4GB 寻址空间(地址总线能力),但实际物理 Flash/RAM 只有几十 KB 到几 MB。大小端指多字节数据的存储顺序——STM32 小端,网络大端。
实战:用联合体判断系统大小端。

第八篇:从裸机到 RTOS —— 任务、调度、FreeRTOS

核心:RTOS 通过优先级抢占+时间片轮转管理多任务,解决裸机 while(1) 的阻塞和耦合问题。每个任务独立栈,调度器由 SysTick 驱动。
警告:优先级反转可以通过互斥量的优先级继承缓解。

第九篇:任务间悄悄话 —— 队列、信号量、互斥量

核心:队列传数据(FIFO),二值信号量做同步,计数信号量管资源,互斥量保护共享资源(带优先级继承)。
原则:数据用队列,同步用信号量,资源保护用互斥量。

第十篇:位运算的艺术 —— &、|、^、<<、>>

核心:& 清零/取位,| 置位,^ 翻转,~ 取反,<< >> 快速乘除 2 的幂。寄存器操作和标志位管理的基石。
注意:只对无符号整数右移,1 要写成 1U,位运算表达式加括号。

第十一篇:芯片选型 —— STM32 vs ESP32

核心:STM32 强在控制(外设丰富、实时性强、可靠性高),ESP32 强在连接(内置 Wi-Fi/BT,开发快)。没有万能芯片,组合使用才是王道。
结论:需要无线+快速原型 → ESP32;需要工业级控制+复杂外设 → STM32。

第十二篇:调试与工具链 —— 从 IDE 到逻辑分析仪

核心:调试分层:printf(逻辑)→ 调试器(断点/变量)→ 逻辑分析仪(时序)。学会看波形,I2C/SPI 问题迎刃而解。
避坑:中断里不要用 printf,优化级别导致变量被优化要加 volatile。


系列全篇快速索引:

篇目 标题 核心关键词
1 嵌入式到底是什么? LED、时钟、GPIO、ARM vs C51 vs STM32
2 串口江湖 UART、RS-232、RS-485、TTL
番外 波特率解析 波特率、比特率、晶振分频
3 两线走天下 I2C、开漏、上拉、地址、应答
4 极速先锋 SPI、四线、CPOL/CPHA、全双工
5 嵌入式大脑 中断、NVIC、ISR、事件驱动
6 时间管理大师 定时器、PWM、输入捕获、SysTick
7 存储与地址 内存映射、大小端、4GB 寻址
8 从裸机到 RTOS 任务、调度、FreeRTOS、优先级
9 任务间悄悄话 队列、信号量、互斥量、IPC
10 位运算的艺术 &、
11 芯片选型 STM32 vs ESP32、选型框架
12 调试与工具链 printf、调试器、逻辑分析仪
13 总结 读手册、写可维护代码、回顾
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐