嵌入式从零开始(第十三篇) :系列总结
前言:
回顾整个系列,我发现有两件事更基础、也更迫切:
- 学会阅读数据手册 —— 因为脱离教程后,你唯一的依靠就是芯片原厂的文档。
- 编写可维护的代码 —— 因为能跑的代码和能长期维护的代码,是两种完全不同的境界。
所以,这篇总结分为两大块:
- 上篇:两个核心技能 —— 读手册 + 写可维护代码
- 下篇:系列各篇精华回顾
上篇:两个让你“脱胎换骨”的核心技能
一、学会阅读数据手册 —— 工程师的“最后防线”
当你不再满足于跑通例程,而是想用自己的方式配置外设、优化功耗、调试诡异 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_ms比t好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 提供)
规则:
- 驱动层每个外设独立文件,提供
init、send、receive、callback等标准接口。 - 应用层不应该直接操作 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 clonegit add/git commit/git pushgit log/git diffgit 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 | 总结 | 读手册、写可维护代码、回顾 |
更多推荐
所有评论(0)