STM32与传统单片机51--时钟周期、机器周期、指令周期
本篇文章为大家讲解一下51与32机器周期与时钟周期以及指令周期的不同与相似点
在单片机系统中,“时钟周期”“机器周期”“指令周期” 是描述时间特性的核心概念,它们直接决定了单片机的运行速度、指令执行效率和外设时序控制能力。由于架构设计的差异,传统 8051 单片机与现代 STM32 单片机在这些概念的定义、计算和应用上存在显著区别。以下从 “基本概念” 入手,分别针对 51 单片机和 STM32 单片机展开详细阐述,并进行对比总结。
一、核心概念统一简要定义
| 周期类型 | 定义 | 本质 | 单位 |
|---|---|---|---|
| 时钟周期(Clock Cycle) | 单片机时钟信号的最小振荡周期,由时钟源(晶振或内部 RC)直接决定。 | 单片机的 “最小时间单位”,相当于 “心跳间隔”。 | ns(纳秒)、μs(微秒) |
| 机器周期(Machine Cycle) | 单片机完成一次 “基本操作”(如取指令、读写内存)所需的固定时间。 | 若干个时钟周期的叠加,是 “基本操作的时间单位”。 | μs、ms(毫秒) |
| 指令周期(Instruction Cycle) | 单片机执行一条指令所需的时间。 | 若干个机器周期的叠加(因指令复杂度而异)。 | μs、ms |
三者的关系:指令周期 ≥ 机器周期 ≥ 时钟周期(均为整数倍关系)。
简单说:单片机的所有复杂操作(如执行一条指令)都需拆解为若干个 “基本操作”,每个基本操作对应 1 个机器周期;就像砌墙时,“搬一块砖” 是基本操作,砌一面墙需若干次 “搬砖”,而 “机器周期” 就是 “搬一块砖” 的时间。
注意:机器周期是 “架构相关” 的 —— 不同单片机(如 8051、PIC、STM32)的机器周期定义可能不同,甚至同一架构的不同型号也可能有差异(主要与时钟源设计有关)。
单片机的所有操作都依赖 “时钟信号”(由外部晶振或内部时钟源提供,类似 “心跳”),而 “时钟周期”(Clock Cycle)是时钟信号的最小周期(即 1 个振荡周期),是处理器能识别的 “最小时间单位”。发出一个脉冲所用的时间就是时钟周期,对于51 晶振,发出一个脉冲所用的时间就是时钟周期,对于32,晶振周期会经过倍频+锁相环 时钟周期以流向CPU的脉冲信号为准。
机器周期本质是 “若干个时钟周期的叠加”—— 因为单个时钟周期太短(通常 ns 级),无法完成一次基本操作(如从内存取指令需多个步骤,每个步骤对应 1 个时钟周期),因此处理器会将 “N 个时钟周期” 打包为 1 个 “机器周期”,作为基本操作的时间单位。
不同架构的单片机,“1 个机器周期包含的时钟周期数” 是固定的(由硬件设计决定),常见的有 “12 个、6 个、4 个、1 个” 等。
二、8051 单片机中的周期特性(以传统 AT89C51 为例)
8051 单片机是经典的 8 位单片机,架构简单且时序固定,三个周期的关系清晰且严格,是理解 “周期概念” 的基础。
1. 时钟周期:最小时间单位
来源:由外部晶振或内部 RC 振荡器提供的时钟信号决定。8051 通常外接晶振(如 11.0592MHz、12MHz),时钟信号的频率即为 “时钟频率(f_clk)”。
计算方法:时钟周期(T_clk)= 1 / 时钟频率(f_clk)。
示例:若外接 12MHz 晶振(最常用配置),则:T_clk = 1 / 12MHz = 1/12 × 10⁻⁶ s ≈ 83.3ns(即每个时钟周期约 83.3 纳秒)。
2. 机器周期:固定的 “基本操作单位”
8051 架构的核心特点是 “机器周期与时钟周期的关系固定”,这是其与现代单片机的关键区别之一。
定义:8051 规定 “1 个机器周期 = 12 个时钟周期”(硬件设计固定,不可修改)。(这就是与STM32最大的区别)
计算方法:机器周期(T_machine)= 12 × 时钟周期(T_clk)= 12 / f_clk。
示例:12MHz 晶振下: T_machine = 12 × 83.3ns = 1μs(即 1 个机器周期为 1 微秒)。
作用:8051 的所有基本操作(如从 ROM 取一条指令、读写 RAM 一个字节)均需 1 个机器周期完成,因此机器周期是 “时序设计的基准”—— 无论是指令执行时间还是外设通信时序,均以机器周期为单位计算。
对比理解:
STC89C52(改进型 8051):支持 “双倍速模式”,可配置 N=6(即 1 机器周期 = 6 时钟周期)。若 f_clk=12MHz,T_machine=6×(1/12MHz)=0.5μs(比传统 8051 快 1 倍);
3. 指令周期:指令执行的时间
8051 的指令按复杂度分为 “单周期指令”“双周期指令”“四周期指令”,指令周期直接以机器周期为单位:
单周期指令:简单指令(如MOV A,#00H、NOP),执行时间 = 1 个机器周期。
示例:12MHz 晶振下,NOP(空操作)指令执行时间 = 1μs。
双周期指令:中等复杂度指令(如ADD A,R0、SJMP),执行时间 = 2 个机器周期。
示例:12MHz 晶振下,SJMP(短跳转)指令执行时间 = 2μs。
四周期指令:复杂指令(如MUL AB(乘法)、DIV AB(除法)),执行时间 = 4 个机器周期。
示例:12MHz 晶振下,MUL AB指令执行时间 = 4μs。
4. 8051 周期的应用:延时程序设计
由于 8051 的周期关系固定,其延时程序可直接基于 “机器周期” 手动计算。例如,需实现 1ms 延时(12MHz 晶振,T_machine=1μs):
- 1ms = 1000μs = 1000 个机器周期;
- 若用
DJNZ R0,delay(双周期指令,每次执行 2 个机器周期),则需循环次数 = 1000/2=500 次; - 代码示例:
void delay_1ms() { unsigned char i; for(i=0;i<250;i++); // 循环内指令总周期约1000个机器周期 }
- 每次循环需要执行判断条件(i<250)和i 自增(i++)等操作
- 这些操作组合起来,每次循环大约消耗 4 个机器周期,这就是为什么i是250(不同编译器 / 硬件可能略有差异)
三、STM32 单片机中的周期特性(以 STM32F103 为例,Cortex-M3 内核)
STM32 是基于 ARM Cortex-M 内核的 32 位单片机,架构更先进(哈佛结构、流水线设计),时钟系统复杂,且无 “固定机器周期” 定义,周期特性与 8051 有本质区别。
1. 时钟周期:最小时间单位(核心基准)
STM32 的时钟源和频率可灵活配置(支持内部 RC、外部晶振、PLL 倍频),但时钟周期的定义与 8051 一致:
来源:由 “系统时钟频率(f_sys)” 决定,f_sys 需通过 “时钟树” 配置(如外部 8MHz 晶振经 PLL 倍频至 72MHz)。
对于时钟树以及时钟源的相关知识,以下文章有详细的解释,大家不会的可以去看看
计算方法:时钟周期(T_clk)= 1 / 系统时钟频率(f_sys)。
示例:若系统时钟配置为 72MHz(STM32F103 典型配置),则:T_clk = 1 / 72MHz ≈ 13.89ns(每个时钟周期约 13.89 纳秒,远小于 8051 的 83.3ns)。
2. 机器周期:概念弱化,无固定定义
Cortex-M 内核的设计目标是 “高效指令执行”,多数指令可在 1 个时钟周期内完成,因此取消了 “固定 N 个时钟周期 = 1 个机器周期” 的架构设计,“机器周期” 不再是 STM32 的核心时序单位。
原因:
8051 因架构简单(冯・诺依曼结构、无流水线),需用 “12 个时钟周期打包为机器周期” 才能完成基本操作;而 STM32 采用 “哈佛结构 + 三级流水线”(取指、译码、执行并行),基本操作(如取指令、执行)可在 1 个时钟周期内完成,无需 “打包”。
替代方案:STM32 直接以 “时钟周期” 作为时序基准,外设(定时器、ADC 等)的计数、延时均基于时钟周期设计。
3. 指令周期:与时钟周期直接挂钩
STM32 的指令执行效率远高于 8051,指令周期不再依赖机器周期,而是直接由 “指令所需的时钟周期数” 决定:
多数指令(如MOV、ADD、LDR(寄存器加载)):仅需 1 个时钟周期,指令周期 = 1×T_clk。
示例:72MHz 下,MOV R0,#0x01指令执行时间≈13.89ns。
复杂指令(如MUL(乘法)、DIV(除法)、LDR(内存加载)):需 2~3 个时钟周期,指令周期 = 2×T_clk 或 3×T_clk。
示例:72MHz 下,32 位乘法指令MULS R0,R1,R2需 2 个时钟周期,执行时间≈27.78ns。
4. STM32 周期的应用:定时器精准计时
由于 STM32 的时钟周期固定且可精准配置(通过 PLL 实现高频稳定时钟),其时序控制通常依赖 “定时器” 而非手动指令延时。例如,需生成 100μs 延时(72MHz 系统时钟):
定时器时钟频率可配置为 72MHz(不分频),则定时器计数 1 次的时间 = T_clk≈13.89ns;(T_clk = 1 / 72MHz ≈ 13.89ns)
需计数次数 = 100μs / 13.89ns≈7200 次;
通过配置定时器 “计数到 7200 时触发中断”,即可实现精准 100μs 延时(误差≤1 个时钟周期)。
四、8051 与 STM32 周期特性对比总结
为更清晰区分两者差异,通过表格对比核心要点:
| 对比维度 | 8051 单片机(AT89C51) | STM32 单片机(Cortex-M3) |
|---|---|---|
| 时钟周期 | 由固定晶振决定(如 12MHz→83.3ns),不可灵活调整。 | 由时钟树配置决定(如 8MHz 晶振 + PLL×9→72MHz→13.89ns),可动态调整。 |
| 机器周期 | 固定关系:1 机器周期 = 12 时钟周期(如 12MHz→1μs)。 | 无固定定义,因指令 / 操作而异(多数基本操作 = 1 时钟周期)。 |
| 指令周期 | 1~4 个机器周期(如 12MHz 下 1~4μs),效率低。 | 1~3 个时钟周期(如 72MHz 下 13.89~41.67ns),效率高。 |
| 时序基准 | 以 “机器周期” 为核心(延时、外设时序均基于此)。 | 以 “时钟周期” 为核心(定时器、外设计数均基于此)。 |
| 灵活性 | 差(时钟频率固定,周期关系不可改)。 | 强(时钟频率可通过 PLL 灵活配置,支持多时钟源)。 |
| 适用场景 | 低速简单场景(如家电控制、简单传感器采集)。 | 高速复杂场景(如电机控制、物联网、工业自动化 |
总结
时钟周期是所有单片机的 “最小时间单位”,而机器周期的定义则因架构而异:8051 依赖固定的 “机器周期” 实现基础操作,STM32 则因高效架构弱化了这一概念,直接以时钟周期为时序基准。理解两者的周期特性,是掌握单片机时序控制(如延时设计、外设通信)的核心基础 ——8051 需牢记 “12 倍时钟周期 = 1 机器周期”,STM32 则需重点掌握 “时钟树配置与时钟周期计算”。
更多推荐


所有评论(0)