翻数据手册,发现MCU的硬件框架图中时钟系统、CPU内核、存储器、总线、外设。都有相似的地方,整体都可以用相同的思路去概括,包括其他芯片的系统框架图。

这是九齐的一款八位单片机,NY8BM84A

STM32L432xx

RA0E3
所以我对MCU的组成原理进行一个整理,从时钟系统,CPU,存储系统,内部总线结构,以及外设模块都是做什么的,让我有个清晰的认识。

时钟系统
- 时钟源有两种主流选择
最常用的是外部晶振(HSE),通过芯片的XIN/XOUT两个脚接进去,频率一般是8MHz、12MHz、16MHz或者25MHz。这种方式精度高、稳定,适合要求高的场合。还有个LSE(外部低速晶振,32.768KHz)
另一种是芯片自己带的高速内部RC振荡器(HSI)常用来应急或者低功耗场景,还有LSI(内部低速RC)
后面还有一堆分频器,把系统主时钟(SYSCLK)拆分成好几路:
-
AHB时钟:给CPU、DMA和高速总线用,最快的那条路。
-
APB1/APB2时钟:给各种中低速外设。
-
每个外设还能自己再分频,比如ADC、定时器、串口什么的。
CPU内核
ALU(算术逻辑单元)主要操作加减乘除、逻辑运算
累加器(ACC),不管是8位还是32位的MCU,大部分运算结果都先扔这里暂存。
程序计数器(PC)负责记住下一条指令在哪儿,程序跑的时候它自己往后加。
系统功能寄存器(SFR)控制CPU模式、时钟、中断、堆栈指针什么的。
堆栈用来存函数返回地址、临时变量。
存储器系统
MCU的存储器分成两大块,框图里"存储器"那个模块看得特别清楚。
- 程序存储器(非易失性)
放代码、常量表、配置参数,断电也不丢。
现在主流是Flash ROM,支持在线擦写,还能IAP(在应用编程),特别方便。还有掩膜ROM、PROM、EPROM,EEPROM
- 数据存储器(易失性)
存运行时的变量、中间结果,断电就没了。
主流是SRAM,速度快,功耗相对高一点;DRAM在MCU里几乎不用。
-
SRAM:依靠晶体管的稳态电路保持数据,只要供电就稳定存在,无需额外操作。速度快但结构复杂。
-
DRAM:依靠电容中存储的电荷表示0或1。由于电容会自然漏电,必须定期读取并重新写入(刷新)以保持数据。
内部总线结构
-
数据总线:传输CPU和存储器和外设之间的数据,决定数据传输的位宽(位宽决定了一次传输多少个数据)
-
地址总线:传输存储器和外设的地址信号,CPU通过地址总线要访问哪个模块或哪个地址的数据。
-
控制总线:传读写信号、中断请求、各种时序控制。比如定时器溢出触发中断,这个信号就是通过控制总线。
外设模块
I/O类
- GPIO:控制引脚高低电平、输入输出方向,还能复用成各种功能(串口、SPI、ADC啥的)。
定时计数类
-
定时器:按时钟脉冲计数,设置好定时频率和计数值,做延时、PWM输出、输入捕获。
-
CCP: 基于定时器,
捕获(把定时器计数值锁存到 CCR 寄存器,通过两次捕获值计算脉冲周期 / 宽度,常用于超声波测距、旋转编码器解码;)
比较(定时器计数与 CCR 寄存器值做匹配,匹配后触发电平翻转、中断,修改 CCR 值即可调整 PWM 占空比),脉宽调制
模拟接口
- ADC/DAC:ADC把传感器模拟信号转成数字,DAC反过来。
通信接口
-
USART串口:异步全双工串行总线,跟电脑、其他MCU、传感器聊天,支持硬件流控。
-
I2C和SPI:I2C两根线就能挂一堆设备,SPI更快,适合屏幕、外部Flash。
I2C:同步半双工串行,两个线进行通信,一根数据线和一根时钟线
SPI:同步全双工串行