LV007-单片机系统组成
前两篇搞清楚了"计算机怎么组成"和"什么是单片机",这一篇把视野从芯片扩大到系统:一颗芯片自己跑不起来,一个产品里也不只有芯片。一块能真正干活的单片机系统,硬件上有什么、软件上有什么、软硬件怎么配合起来,是本篇要回答的问题。
本篇的阅读主线:先建立"系统 = 硬件 + 软件"的总框架,然后自内向外看硬件(芯片内部 → 板级最小系统 → 外部设备),再自底向上看软件(启动代码 → 驱动 → 应用 → RTOS),最后把两者合起来,完整走一遍从上电到点灯的全过程。
一、 系统 = 硬件 + 软件
任何计算机系统都由硬件系统和软件系统两部分组成,单片机系统也不例外:
- 硬件是躯体:看得见摸得着的电路和芯片;
- 软件是灵魂:运行在硬件上的程序和数据。
很多人初学时只关注硬件(接根线、点个灯),但真正决定一个产品能力强弱的是软硬件的配合。这里有一个贯穿嵌入式设计的深刻事实:软件和硬件在逻辑功能上是等价的——同一个功能,既可以用硬件电路实现(快、贵、不灵活),也可以用软件实现(慢、便宜、灵活)。比如产生一路方波信号,既可以用振荡电路做,也可以用定时器加几行代码做。工程上处处是在两者之间做取舍,这正是嵌入式设计的乐趣所在。
二、 硬件组成:芯片内部
1. 四大块
打开任何一颗 MCU 的数据手册,芯片内部都可以归纳为四大部分,它们与 LV001 讲的计算机五大部件一一对应:
| 组成 | 对应计算机的部件 | 说明 |
|---|---|---|
| 内核(CPU) | 运算器 + 控制器 | 执行指令的大脑,如 ARM Cortex-M3 |
| 程序存储器 FLASH | 主存(存程序的部分) | 掉电不丢失,存放编译好的程序和常量 |
| 数据存储器 SRAM | 主存(存数据的部分) | 掉电丢失,存放运行中的变量、堆栈 |
| 片上外设 | 输入/输出设备 | GPIO、UART、定时器、ADC、SPI、I2C、DMA…… |
2. 与经典计算机的一个结构差异
注意一个有趣的差异:单片机把"主存"拆成了 FLASH 和 SRAM 两块,程序放 FLASH、数据放 SRAM,并且内核的取指总线和数据总线是分开的——这种"程序与数据分开存储、分开访问"的结构叫哈佛结构。而 LV001 程序清单例子中"指令和数据混放在同一存储器"的原始冯·诺依曼结构,则对应 PC 的"统一内存"。
为什么单片机偏爱哈佛结构?两个好处:取指和取数据可以并行(性能);FLASH 和 SRAM 是两种工艺(FLASH 擦写慢但掉电不丢,SRAM 快但掉电丢失),天然适合分工。这个话题在 LV013-单片机的通用架构 还会展开。
3. 芯片内部的"隐形部件"
除了上面四大块,还有几个不起眼但贯穿全身的模块:
- 时钟电路:给所有部件打拍子,没有时钟,任何一步都迈不出去;
- 复位电路:让系统回到确定的初始状态,是"从混沌到有序"的开关;
- 电源系统:把外部供电转成内核和外设需要的电压,并提供低功耗模式。
三、 硬件组成:板级电路
1. 最小系统:让芯片活起来的最少电路
一颗裸芯片接到电源上是不够的,它至少需要外围电路的支撑。让单片机能正常工作的最少电路组合叫最小系统,包括五件套:
(1)电源电路——供血。把 USB 或电池的电压转成芯片要求的电压(STM32F103 一般 3.3V),并在电源引脚附近放去耦电容,滤除高频噪声。"附近"很重要:去耦电容必须紧贴电源引脚,远了就滤不干净;
(2)时钟电路——心跳。无源晶振加两颗起振电容接到 OSC_IN/OSC_OUT 引脚,为芯片提供基准时钟;也可以不用外部晶振,直接用芯片内部的 RC 振荡器(HSI),精度略低但省成本;
(3)复位电路——重启开关。上电瞬间电容充电产生一段低电平,保证芯片从确定状态启动;并联的按键提供手动复位;
(4)调试/下载电路——程序的进料口。引出 SWD(两根线:时钟 + 数据)或 JTAG 接口,连接调试器(如 ST-Link、J-Link),用于烧写程序和在线调试。没有它,程序就进不了芯片;
(5)启动选择电路——决定从哪里启动。BOOT0/BOOT1 引脚的电平组合,决定复位后芯片从主 FLASH、系统存储器(内置 Bootloader)还是 SRAM 开始执行——这是 IAP/串口下载的硬件基础。
以 STM32F103C8T6 最小系统板(俗称 BluePill)为例,整块板子上就只有:MCU 芯片、8 MHz 晶振、3.3V LDO、复位按键、BOOT 跳线、USB 座、电源指示灯和几颗阻容——仅此而已。详细的电路分析见 10-STM32基础/LV001-STM32概述。
2. 外部设备:系统的五官和四肢
最小系统之上,再根据项目需要外接各种设备,它们对应经典计算机里的"输入/输出设备":
- 输入类:按键、旋转编码器、各类传感器(温度、光照、加速度、气体浓度……)——系统的"感官";
- 输出类:LED、数码管、LCD/OLED 显示屏、蜂鸣器、继电器、电机——系统的"四肢";
- 通信类:通过 UART/SPI/I2C/CAN 或无线模块(ESP8266、蓝牙)与其他设备交换数据——系统的"嘴和耳朵"。
这些外设通过单片机的 I/O 引脚和片上外设接口与芯片相连。选型一颗 MCU 时,本质上就是在回答:需要多少个"感官"、多少个"四肢"、什么规格的"嘴和耳朵"。
四、 软件组成
硬件搭好了只是"能上电",还得有程序它才会干活。单片机的软件按层次从低到高分为四层,每层只与相邻层打交道:
1. 启动代码:第一级台阶
上电后最先执行的一小段汇编/C 代码,负责在"你的代码"运行之前把环境准备好:
- 从中断向量表取出初始栈顶地址(写入 SP);
- 把复位向量(Reset_Handler)的地址装入 PC;
- 把已初始化的全局变量从 FLASH 拷贝到 SRAM(data 段搬运);
- 把未初始化的全局变量区域清零(bss 段清零);
- 设置好时钟系统(可选),最后跳进
main函数。
它把 CPU 从"上电瞬间的混沌"带到"可以执行你的 main 函数"的有序状态。启动代码由编译器自动提供(Keil 为 STM32F103C8 这类中等密度型号提供的是 startup_stm32f10x_md.s),一般不用手写,但必须看得懂——详见 20-STM32的启动/LV001-启动文件 与 LV005-启动过程。
2. 驱动层:和硬件打交道
操作芯片寄存器的代码,把"往哪个地址写什么值"封装成"配置串口波特率""启动定时器"这样人类可读的函数。有两种风格:
(1)直接操作寄存器:查手册 + 位运算,代码量小、执行快、可控性强,但费脑子;
(2)使用库函数:ST 官方提供的 HAL 库/LL 库把寄存器操作包成了函数,开发效率高,是本站后续章节的主要风格。
两种风格本质上是一回事——库函数内部就是寄存器操作,详见 LV021-认识HAL库,寄存器的原理见 LV016-寄存器与硬件控制。
3. 应用层:业务的所在地
你写的业务逻辑都在这一层:按键扫描与消抖、状态机、菜单界面、通信协议解析、控制算法……应用层只调用驱动层提供的接口,不直接碰硬件细节,这样换一颗芯片时只需要换驱动层。
4. RTOS 层(可选):从"独幕剧"到"多幕剧"
最简单的程序是一个 while(1) 大循环(裸机程序),所有任务轮流在循环里执行。当任务变多、实时性要求变高时,引入实时操作系统(RTOS,如 FreeRTOS)把 CPU 时间切成小片分给多个任务,并提供任务间通信机制。是否需要 RTOS 是架构决策:任务少且简单时裸机反而更可靠。本站进阶篇将专门展开。
把四层软件和硬件画成一张自底向上的图:
应用层(业务逻辑)
│ 调用
驱动层(HAL 库 / 寄存器操作)
│ 读写
启动代码准备好的硬件环境:片上外设 ── 内核 ── FLASH/SRAM五、 一次完整的上电过程
把软硬件拼在一起,看一颗单片机从按下电源开关到点亮 LED 的完整旅程:
(1)上电:电源电路输出爬升到稳定电压,去耦电容充满,复位电路在电压稳定前一直把芯片按在复位状态;
(2)释放复位:复位引脚变高,内核从启动地址(STM32F1 由 BOOT 引脚选择,主 FLASH 启动时是 0x08000000)取出栈顶地址装入 SP,再取复位向量装入 PC;
(3)执行启动代码:搬运 data 段、清零 bss 段、配置时钟(如果程序里配置了),一切就绪后跳转到 main;
(4)执行 main:跑你写的初始化代码——开 GPIO 时钟、配置引脚模式、初始化串口……;
(5)进入主循环:反复执行业务逻辑,LED 被点亮;与此同时,CPU 在每一个时钟周期里依然在做着 LV001 讲的那件事——取指、分析、执行。
【注意】
第(2)步有个精妙的细节:CPU 取的第一份数据不是指令,而是栈顶地址——因为 C 程序运行必须有栈,所以向量表的前两个表项固定是"初始 SP"和"复位向量"。这个设计后面在启动文件和 IAP 章节会反复出现。
从 1945 年的 EDVAC 到你手里的 STM32,软件的层次从"裸指令"长成了"启动代码-驱动-应用-RTOS",硬件从"一屋子机柜"缩成了一颗芯片,但上电后"从固定地址开始取指执行"这件事,八十年来从未改变。
六、 小结
- 单片机系统 = 硬件 + 软件:硬件是"芯片内四大块 + 板级最小系统 + 外部设备",软件是"启动代码 + 驱动 + 应用,可选 RTOS";
- 芯片内部把主存拆成 FLASH 与 SRAM(哈佛结构的种子),板级最小系统五件套缺一不可;
- 上电全流程是一条清晰的因果链:上电 → 复位释放 → 启动代码 → main → 主循环;
- 软硬件逻辑等价,嵌入式的核心功夫是在两者之间做取舍。
下一篇我们把单片机和你桌上的 PC 放在一起对比,看看它们到底哪里一样、哪里不一样——见 LV010-单片机与计算机的异同。
本文档由 markdowncli 技能辅助生成