单片机工作原理

取指→译码→执行→外设交互——一颗芯片如何"思考"并驱动物理世界

半导体数字IC系列 · 原理深析

📌 精炼摘要

单片机(MCU)的工作本质是"取指令→译码→执行→外设交互"的无限循环:CPU从程序存储器Flash中逐条取出机器指令,由译码器解析含义,运算器完成运算,再通过内部总线与GPIO、定时器、ADC等外设交互(科普中国·单片机词条)。本文从CPU内核、总线架构、存储器分工、时钟树、中断系统到I/O口逐层拆解"内部发生了什么",并以LED点灯程序串起从C语言到引脚电平翻转的完整执行链路,帮助读者建立可验证、可计算的底层认知。

📚 延伸阅读:单片机MCU·MCU分类·选型指南

🔄 单片机工作总览:永不停止的四步循环

核心框架

单片机的一切工作,都可以归纳为一个"取指令→译码→执行→外设交互"的四步循环(《单片机原理及应用》教材)。上电复位后,程序计数器PC指向程序存储器的起始地址,CPU通过内部总线把该地址上的机器指令取回指令寄存器;译码器解析这条指令的含义(是算术运算、数据搬移还是跳转);执行单元完成运算并把结果写回寄存器或存储器;当指令涉及外设时,再通过外设寄存器与GPIO、定时器、ADC等模块交互。取完一条,PC自动加一指向下一条指令,如此周而复始,直到断电。

这个循环由时钟"打节拍"驱动。经典8051中,12个振荡周期构成1个机器周期,一条基本指令需要1-4个机器周期——使用12MHz晶振时,1个机器周期恰好是1µs,CPU每秒可执行约100万条基本指令(Intel 8051数据手册)。而32位ARM Cortex-M内核采用流水线设计,多数指令只需1个时钟周期即可完成:STM32F103以72MHz运行时理论峰值约72MIPS(百万条指令每秒),是8051的数十倍(ST STM32F103数据手册)。

从更高视角看,单片机就是一个被时钟驱动的有限状态机:程序决定了状态如何迁移,外设负责与物理世界交换信息,中断则允许外部事件随时插入当前节奏。理解这四步循环,就抓住了单片机原理的主干——后面的内核、总线、存储器、时钟与中断,都是围绕它展开的细节。

🧮 CPU内核结构:运算器、控制器与寄存器组

处理器核心

CPU内核是单片机的"大脑",由三大部件构成(《计算机组成原理》教材):运算器ALU负责算术与逻辑运算——加法、减法、与、或、异或、移位等;控制器负责取指、译码并产生控制信号,指挥全芯片按节拍协同工作;寄存器组则是CPU内部的高速暂存单元,用于存放操作数、中间结果与状态标志。8051的累加器ACC为8位,另有B寄存器、程序状态字PSW与数据指针DPTR(Intel 8051数据手册);Cortex-M3则提供R0-R12共13个通用寄存器,加上栈指针SP、链接寄存器LR、程序计数器PC与程序状态寄存器xPSR(《ARM Cortex-M3权威指南》)。

程序计数器PC是CPU中最重要的寄存器之一,它保存着下一条待执行指令的地址。8051的PC为16位,复位后指向0x0000,从程序存储器最低地址开始执行(Intel 8051数据手册);ARM Cortex-M3的复位入口则由向量表决定——上电后处理器从0x00000000读取初始栈指针,从0x00000004读取复位向量(Reset_Handler的地址)(《ARM Cortex-M3权威指南》)。PC只在复位、跳转指令与中断响应时被改写,正常流程中它随取指自动递增。

一条指令从取回到执行完毕的完整过程称为指令周期,分为取指、译码、执行、写回四个阶段(《单片机原理及应用》教材)。8051是CISC架构,111条指令按执行时间分为1、2、4个机器周期三档(Intel 8051数据手册);Cortex-M3则采用三级流水线(取指-译码-执行),三条指令在流水线上重叠进行,配合Thumb-2指令集,大多数指令仅1个时钟周期即可完成(《ARM Cortex-M3权威指南》)。流水线正是"分工"带来的效率红利:每个阶段由独立硬件并行工作。

🔌 内部总线架构:数据、地址与控制三总线

数据通路

单片机的CPU、存储器、外设之间靠内部总线连接。总线分为三组(《单片机原理及应用》教材):地址总线由CPU输出地址,决定"访问哪里";数据总线双向传输数据,决定"传什么";控制总线承载读写控制与时序信号,决定"何时传、怎么传"。8051有16位地址总线,可寻址2^16=64KB程序空间,数据总线为8位(Intel 8051数据手册)。

按程序与数据的存放方式,计算机体系结构分为两大流派(科普中国·冯·诺依曼结构):冯·诺依曼结构(如MSP430、早期x86)让程序和数据共用同一存储器与总线,结构简单但取指与取数不能并行;哈佛结构(如8051、AVR、PIC)让程序存储器和数据存储器物理分离、各有独立总线,取指和取数可同时进行——8051因此能在1个机器周期内同时取指令和读写数据(Intel 8051数据手册)。

ARM Cortex-M采用"改进哈佛"结构(《ARM Cortex-M3权威指南》):存储器地址空间统一(程序、数据、外设都映射到同一个32位地址空间内),但芯片内部通过总线矩阵把指令总线(I-Bus)与数据总线(D-Bus)分开,CPU可并行取指与访问数据,同时保留了访问代码自身的能力,兼顾了哈佛结构的高吞吐与冯·诺依曼结构的灵活性。

总线带宽是衡量数据通路能力的关键指标:8051数据总线8位、基本总线周期1µs,理论峰值带宽约1MB/s;STM32F103的AHB总线32位、72MHz,理论峰值带宽为72MHz×4字节≈288MB/s(ST STM32F103参考手册)。实际吞吐还会受Flash等待周期、DMA竞争等因素影响,但量级差异已足以解释8位与32位MCU的性能鸿沟——这也是"总线宽度×总线频率"这一带宽公式在单片机上的直观体现。

💾 程序存储器Flash:程序存在哪、如何启动运行

程序存储

程序存储器存放编译后的机器码,掉电不丢失。现代MCU普遍使用NOR Flash:随机读取速度快(可像内存一样按地址直接取指执行)、按扇区/页擦除、擦写寿命有限(科普中国·闪存词条)。STM32F103C8T6内置64KB Flash,按1KB/页组织,官方标称擦写寿命不低于1万次(ST STM32F103数据手册)。NOR Flash每个存储单元由浮栅晶体管构成,通过浮栅中是否注入电荷表示0/1,电荷在断电后仍可保持数年之久。

启动流程是理解程序执行的第一步(ST STM32F103参考手册):Cortex-M3复位后,硬件先从0x00000000装载初始栈指针(MSP),再从0x00000004装载复位向量,跳入Reset_Handler;随后SystemInit配置时钟(例如通过PLL把8MHz外部晶振倍频到72MHz),再由C库启动代码__main完成全局变量初始化——把.data段从Flash拷贝到RAM、清零.bss段——最后才进入main()。8051则直接得多:复位后PC=0x0000,从0000H地址顺序执行,通常在0003H中断向量区之前放一条跳转指令越过向量表(Intel 8051数据手册)。

ISP与IAP让固件更新不再需要取下芯片。ISP(In-System Programming,在系统编程)依赖芯片出厂固化的Bootloader:STC89C52可通过串口ISP下载程序,芯片上电时检测到下载请求即进入引导程序,接收代码并写入Flash(STC89C52数据手册);STM32的系统存储器中也固化了USART/USB/DFU引导程序(ST STM32F103参考手册)。IAP(In-Application Programming,在应用编程)更进一步:应用程序运行期间自行擦写Flash的特定区域,这是OTA远程升级的技术基础——新固件先下载到空闲分区,校验通过后由Bootloader跳转执行,实现"边运行边升级"。

🧠 数据存储器RAM:变量、堆栈与寄存器映射

数据存储

RAM(SRAM)存放程序运行时的变量、堆栈与中间结果,读写速度远快于Flash,但掉电即丢失(科普中国·随机存取存储器)。8051内部RAM仅128字节(00H-7FH),其中00H-1FH是4组工作寄存器区(R0-R7可整体切换),20H-2FH是位寻址区(16字节共128个位可单独操作),其余为通用数据区;52子系列把80H-FFH也用作RAM,合计256字节(Intel 8051数据手册)。

堆栈是RAM中最重要的结构之一。8051的堆栈指针SP默认指向07H,数据入栈时地址递增(向上生长),调用子程序或响应中断时硬件自动压栈PC(2字节)(Intel 8051数据手册);Cortex-M3的堆栈向下生长,复位时从向量表加载初始栈顶,响应中断时硬件自动压栈xPSR、PC、LR、R12及R3-R0共8个寄存器(《ARM Cortex-M3权威指南》)。堆栈溢出会覆盖相邻变量导致程序"跑飞",是嵌入式开发中最隐蔽的故障之一。

寄存器映射是"软件操作硬件"的桥梁:8051把ACC、B、PSW、IE、IP、P0-P3等特殊功能寄存器(SFR)映射到80H-FFH地址段,直接读写即控制硬件(Intel 8051数据手册);STM32把GPIO、定时器、串口等外设寄存器统一映射到32位地址空间,如GPIOB端口配置寄存器的起始地址为0x40010C00(ST STM32F103参考手册)。C语言中"*(volatile unsigned int*)0x40010C00"这类指针操作,本质上就是通过总线向该地址写控制字。

RAM与Flash的分工一目了然:代码与只读常量放Flash(断电保留),全局变量、局部变量、堆栈放RAM(读写快、断电清空)。STM32F103C8T6拥有64KB Flash与20KB SRAM,比例约3:1,是主流入门级配置(ST STM32F103数据手册)。因此大数组、大缓冲区要精打细算,常量可声明为const存入Flash以节省宝贵的RAM。

⏱️ 时钟系统:让一切按节拍运转

时序基础

单片机的每一个动作都由时钟驱动,时钟系统决定了整颗芯片的"节奏"(《单片机原理及应用》教材)。时钟源主要有两类:外部晶振(如8051常用的12MHz、串口常用的11.0592MHz)精度高、温漂小;内部RC振荡器(如STM32F103的HSI,8MHz,精度约±1%)无需外接元件、上电即用,适合对时序精度要求不高的场景(ST STM32F103数据手册)。

PLL倍频是32位MCU提升性能的利器:STM32F103用8MHz外部晶振经PLL×9倍频得到72MHz系统时钟,再经AHB预分频器、APB1/APB2预分频器逐级分发,形成一棵完整的时钟树——APB1总线最高36MHz(挂载定时器TIM2-TIM7、USART2/3、I2C等低速外设),APB2最高72MHz(挂载GPIO、USART1、ADC等)(ST STM32F103参考手册)。不同外设挂在不同总线上,决定了它们各自的工作频率上限。

时钟系统的细节直接影响外设精度:8051用11.0592MHz晶振而非12MHz,正是因为11.0592÷12÷32=28800,可对9600波特率实现零误差整数分频(《单片机原理及应用》教材);STM32的APB1预分频系数为2时,挂在其上的定时器时钟会自动×2补偿,保证定时器仍以72MHz计数(ST STM32F103参考手册)。低功耗设计则依赖独立低速时钟:独立看门狗IWDG用LSI(40kHz)计数,RTC可用LSE(32.768kHz)——32.768kHz恰好是2^15,分频后正好1秒(ST STM32F103数据手册)。

⚡ 中断系统(核心章节):MCU的"异步响应能力"

核心机制

中断是单片机实时处理外部事件的核心机制,也是它区别于普通CPU运算器的关键能力(科普中国·中断词条)。当外部事件(按键按下、定时器溢出、串口收到字节)发生时,硬件置位中断标志,CPU完成当前指令后暂停主程序,跳转到对应的中断服务程序(ISR)处理,处理完再返回断点继续执行。若无中断机制,CPU只能靠"轮询"不停查询事件标志,既浪费算力又无法保证响应速度。

中断源的数量因芯片而异:经典8051有5个中断源——外部中断INT0、定时器T0、外部中断INT1、定时器T1、串口(Intel 8051数据手册);STC89C52增加到6个(新增定时器T2);STM32F103的嵌套向量中断控制器NVIC支持60个可屏蔽中断通道,优先级分为抢占优先级与子优先级共16级(4位),可灵活配置(ST STM32F103参考手册)。

中断向量表是"中断源→处理函数"的映射表(《ARM Cortex-M3权威指南》):8051的向量地址固定——INT0在0x0003、T0在0x000B、INT1在0x0013、T1在0x001B、串口在0x0023,每项间隔8字节,只能放一条跳转指令(Intel 8051数据手册);Cortex-M3的向量表默认从0x00000000开始(可用VTOR重定位),第0项是初始栈指针,第1项是复位向量,其后依次是NMI、硬故障及外部中断向量(《ARM Cortex-M3权威指南》)。

中断响应流程体现了"硬件自动完成"的设计哲学(《ARM Cortex-M3权威指南》):Cortex-M3响应中断时,硬件自动压栈8个寄存器(xPSR、PC、LR、R12、R3-R0)→从向量表读取ISR地址→跳转执行→执行完毕自动出栈恢复→返回被中断的指令继续执行,全过程在零等待状态存储器下约需12个时钟周期;若返回时又有更高优先级请求到达,硬件会"尾链"(tail-chaining)直接进入下一个ISR,省去重复的压栈出栈。8051则需3-8个机器周期响应,只有高低两级优先级,嵌套能力有限(Intel 8051数据手册)。

实时性意义:中断系统决定了MCU的实时性上限,核心指标是"最坏情况中断延迟"——从事件发生到ISR第一条指令执行的时间。Cortex-M3在72MHz下中断延迟约0.17µs(12周期),8051在12MHz下最快也要3µs(《ARM Cortex-M3权威指南》)。这正是32位MCU在汽车、工控等强实时场景逐步替代8位MCU的底层原因之一。实践要点:ISR务必短小精悍(只置标志、不做事),耗时操作放到主循环,否则一个长ISR会阻塞其他所有中断。

⏲️ 定时器/计数器:计数、计时、PWM与看门狗

时间管理

定时器/计数器本质是一个"由时钟或外部信号驱动的计数器"(《单片机原理及应用》教材)。典型结构是"预分频器+计数寄存器":预分频器把输入时钟按N分频(如STM32定时器预分频系数1-65535),计数器对分频后的时钟逐周期累加,溢出时置标志或触发中断。8051的T0/T1是16位计数器(另有13位模式),12MHz下每个计数脉冲1µs,16位最大定时65535µs≈65.5ms(Intel 8051数据手册);STM32F103的16位通用定时器以72MHz计数,配合预分频可实现从纳秒级到秒级的定时范围(ST STM32F103参考手册)。

PWM(脉宽调制)是定时器最广泛的应用:计数器与比较寄存器逐周期比较,输出电平在比较点翻转,从而产生占空比可调的方波(科普中国·脉宽调制)。占空比=比较值/周期值,16位定时器理论分辨率可达1/65536。STM32的高级定时器(TIM1/TIM8)还支持互补输出与死区插入,可直接驱动H桥电机驱动电路(ST STM32F103参考手册)。LED调光、电机调速、舵机控制、D类音频输出都依赖PWM。

输入捕获模式则反其道而行:定时器记录外部信号边沿到来瞬间的计数值,两次捕获之差即脉冲宽度或周期,可用于测量频率与占空比(ST STM32F103参考手册)。例如用输入捕获解析红外遥控协议、测量超声波回波时间来计算距离。

看门狗是防止程序跑飞的"最后防线"(ST STM32F103参考手册):程序正常运行时周期性"喂狗"(重装载计数器),一旦程序死循环或跑飞导致喂狗超时,看门狗强制复位芯片。STM32F103提供独立看门狗IWDG(用LSI的40kHz独立时钟计数,不受主时钟故障影响)与窗口看门狗WWDG(只能在指定时间窗口内喂狗,还能发现"提前喂狗"的逻辑错误)(ST STM32F103参考手册)。IWDG在最大预分频4096、最大计数值4095、40kHz时钟下超时约26.2秒,足以覆盖多数应用场景。

🔢 I/O口工作原理:GPIO的推挽、开漏与读-修改-写

引脚操作

I/O口(GPIO)是单片机与物理世界交互的"手脚"(科普中国·GPIO)。每个引脚内部都是一个可配置的电路开关网络,主要工作模式包括:推挽输出(内部上管拉高、下管拉低,可主动输出0和1,驱动能力强)、开漏输出(只能拉低,高电平靠外部上拉电阻,可实现"线与"与电平转换)、上拉/下拉输入(内部电阻把不确定的引脚电平钳制到确定值)、浮空输入与模拟输入(ST STM32F103数据手册)。

经典8051的端口特性差异很大(Intel 8051数据手册):P0是开漏输出,驱动LED等负载时必须外接上拉电阻;P1-P3是准双向口,内部有弱上拉,输出高电平能力弱但灌电流能力约20mA,因此51电路常用"低电平点亮LED"的接法。STM32F103的GPIO支持8种配置模式,官方数据手册标注引脚最大灌/拉电流约25mA,且每个引脚内部都有独立的上拉/下拉电阻可软件配置(ST STM32F103数据手册)。

读-修改-写是端口操作的经典陷阱(《单片机原理及应用》教材):8051执行SETB P1.0这类指令时,CPU读的不是引脚电平,而是端口锁存器的值,修改后再写回——若引脚正被外部电路强制拉低,读回锁存器旧值可能造成误操作。因此51编程强调"端口操作先读锁存器"。STM32则通过BSRR寄存器"置位/清零"直接按位写输出数据寄存器ODR,从硬件上规避了读-修改-写竞态(ST STM32F103参考手册)。

端口寄存器是操作GPIO的软件入口:STM32每个端口有配置寄存器CRL/CRH、输入数据寄存器IDR、输出数据寄存器ODR与位操作寄存器BSRR(ST STM32F103参考手册)。理解"配置寄存器定模式、数据寄存器传电平、BSRR实现原子翻转"三者的关系,就掌握了GPIO软件层的全部要点。

📡 通信外设:UART、SPI与I2C的数据流

数据通信

通信外设让MCU与外部世界交换数据。UART(通用异步收发器)只需TX/RX两根线,靠约定波特率对齐位时序:一帧数据为1个起始位+8个数据位+(可选校验位)+1个停止位,共10-11位(《单片机原理及应用》教材)。8051串口模式1的波特率=定时器T1溢出率÷32,用11.0592MHz晶振可精确得到9600/115200等常用波特率(Intel 8051数据手册)。UART是调试打印与传感器通信最常用的接口,数据流为"移位寄存器按位收发→数据寄存器缓冲→中断或标志通知CPU"。

SPI是高速同步全双工总线,4根线(SCK时钟、MOSI主出从入、MISO主入从出、CS片选),主设备产生时钟,每个时钟周期双向传输1位(科普中国·SPI)。STM32F103的SPI1最高速率18Mbit/s(ST STM32F103数据手册),适合驱动Flash芯片、SD卡、TFT显示屏等高吞吐器件;通过不同的CS片选引脚可挂接多个从设备,片选信号决定当前与谁通信。

I2C只用SDA/SCL两根线,是半双工、带寻址的总线:主设备先发7位从机地址+读写位,被寻址的从机应答后按字节传输(科普中国·I2C总线)。7位地址空间共128个地址,其中16个保留,实际可用112个;标准模式速率100kHz、快速模式400kHz。STM32F103内置的I2C外设支持标准与快速模式(ST STM32F103参考手册),常用于连接EEPROM、温湿度传感器、触摸芯片等低速器件。

三种接口的取舍逻辑:UART线最少但异步、双方时钟需匹配、速率中等;SPI最快且全双工,但线多、需片选管理;I2C最省线且支持多主多从,但速率较低。实际项目中常"三件套"并用:UART调试、SPI驱动高速外设、I2C挂低速传感器(嵌入式系统设计导论)。

📊 模拟外设:ADC、DAC与比较器

模拟接口

ADC(模数转换器)把连续电压转换为数字量,是传感器采集的入口(科普中国·模数转换器)。主流MCU采用逐次逼近型(SAR):以二分法逐位比较,N位分辨率需要N次比较——12位ADC需要12个比较周期。STM32F103内置2个12位SAR型ADC,ADC时钟最高14MHz,采样时间1.5-239.5个周期可配置,最高转换速率约1Msps(100万次/秒)(ST STM32F103数据手册)。

分辨率与量化误差直接决定采集精度(《数字电子技术基础》教材):12位ADC把参考电压分成2^12=4096级,以3.3V参考电压计算,每个LSB(最低有效位)对应3.3V÷4096≈0.806mV;而8位ADC(如经典外扩芯片ADC0809)只有2^8=256级,LSB≈12.9mV——精度相差16倍,这正是传感器应用中"12位ADC逐步取代8位"的原因。

DAC(数模转换器)把数字量还原为模拟电压,用于音频输出、波形发生、偏置控制等场景(科普中国·数模转换器)。STM32F103的高密度型号(如F103RC/RD/RE)集成2路12位DAC,STM32F4系列同样内置12位DAC(ST STM32F103/F407数据手册)。模拟比较器则直接比较两个输入电压并输出逻辑电平,可用于过压保护、零交叉检测——STM32G0等新一代MCU已将其作为标准外设集成(ST STM32G0数据手册)。

模拟外设的精度与PCB布局强相关:参考电压噪声、地线阻抗、采样保持时间都会影响转换结果;ADC采样前还需保证信号源阻抗满足内部采样电容的充电要求,否则转换值会偏小——这是初学者最容易忽视的"模拟陷阱"(《电子技术基础》教材)。

💡 程序执行实例:一颗LED点亮背后的完整链路

实战链路

把前面所有原理串起来的,是最经典的"点灯程序"。C语言核心操作只有一行:GPIOB->BSRR = (1<<0);——把PB0引脚输出高电平。这行代码要经历完整链路才能变成物理世界的一束光(嵌入式开发实践指南)。

第一步编译:交叉编译器(如arm-none-eabi-gcc)把C代码先翻译成汇编,再汇编成机器码(十六进制指令),链接后生成带地址信息的固件镜像,例如Flash地址0x0800012C处存放着"向BSRR写立即数"的指令;第二步烧录:通过SWD调试器或串口ISP把固件写入Flash的0x08000000起始区域(ST STM32F103参考手册);第三步复位:芯片上电,硬件从0x00000000取初始栈指针、0x00000004取复位向量,跳入启动代码,经SystemInit与C库初始化后进入main()。

第四步取指:PC指向Flash中"BSRR写操作"指令的地址0x0800012C,指令总线把32位机器码取回;第五步译码:控制器识别出这是"向BSRR寄存器写入立即数"的指令;第六步执行:数据总线把立即数0x0001写入GPIOB的BSRR置位寄存器,硬件随即把PB0引脚驱动到高电平——LED点亮(《ARM Cortex-M3权威指南》)。

时间账:72MHz下多数指令1个周期≈13.9ns,从复位到main()约需数百微秒(含时钟初始化与C库启动),而LED真正点亮只需微秒级。若在main()里写while(1){GPIOB->ODR^=1;延时();},LED就以约1Hz闪烁——你看到的每一次闪烁,背后都是数百万次"取指-译码-执行"循环(ST STM32F103数据手册)。这条链路也是"编译→烧录→复位→取指→执行→IO翻转"六步的标准范式。

🔭 独特观点:地址与节拍、最坏情况思维

前瞻思考
独特观点一:单片机的原理本质是"地址与节拍的双重编排"。空间上,总线把所有资源(Flash、RAM、外设寄存器)组织进统一的地址空间,软件用"地址"找到一切;时间上,时钟把取指-译码-执行编排成精确的节拍,外设事件靠中断插入。判断一个工程师对MCU理解得深不深,就看两件事:能否脱口说出某个外设寄存器的地址与位定义(空间观),能否说清某个事件在多少个时钟周期后得到响应(时间观)。这与主频无关,与"地址观+节拍观"有关——掌握了这两条主线,任何一颗新MCU上手都只需查手册。
独特观点二:MCU的实时性上限由"最坏情况"决定,而非平均性能。许多开发者习惯把耗时操作直接写进中断服务函数,结果高优先级中断被自己拖垮——ISR越长,其他事件被阻塞的时间越长。真正优秀的嵌入式设计是"中断只做标记、主循环完成处理":ISR越短,系统能容忍的并发事件越多,实时性越好。从这个角度看,单片机工作原理不只是芯片知识,更是一套"在有限资源下做确定性设计"的方法论;掌握它,比记住任何一颗芯片的参数都更有长期价值。

❓ 单片机工作原理常见问题

FAQ

Q1:单片机为什么能把程序"记住"?

程序存放在Flash(闪存)中,NOR Flash以浮栅晶体管存储电荷,断电后电荷仍可保持数年,因此掉电不丢失;而RAM靠电路状态暂存数据,断电即失。STM32F103的Flash擦写寿命官方标称不低于1万次。

Q2:为什么CPU要分"取指-译码-执行"?

因为CPU必须"先知道要干什么,才能去干"。取指把指令从存储器拿到手,译码弄清语义,执行落实动作,写回保存结果。流水线技术让这几步在不同硬件上重叠进行,Cortex-M3三级流水线使多数指令1个时钟周期完成,就是这个分工带来的效率红利。

Q3:中断和轮询有什么区别?

轮询是CPU定时去"问"每个事件有没有发生,浪费算力且响应慢;中断是事件主动"通知"CPU,硬件自动保存现场并跳转处理,处理完自动返回。8051响应中断需3-8个机器周期,Cortex-M3约12个时钟周期,而轮询的响应时间取决于查询周期,通常慢几个数量级。

Q4:哈佛架构和冯·诺依曼架构谁更好?

没有绝对优劣。哈佛架构程序与数据分开存储、总线独立,取指与取数可并行,速度快(8051、AVR);冯·诺依曼结构共用存储与总线,结构简单且便于自修改代码(MSP430)。Cortex-M的"改进哈佛"在统一地址空间内实现指令与数据总线分离,兼取两者之长,是当前32位MCU的主流选择。

Q5:为什么程序放Flash、变量放RAM?

程序要求断电不丢失,所以放在非易失的Flash中;变量需频繁读写且要求速度快,所以放RAM。代价是RAM容量小且贵:STM32F103C8T6有64KB Flash却只有20KB SRAM,因此大数组、大缓冲需精打细算,常量可声明为const存入Flash以节省RAM。

Q6:复位后单片机从哪开始执行?

8051复位后PC=0x0000,从程序存储器最低地址开始执行;Cortex-M3从向量表启动:硬件先读取0x00000000获得初始栈指针、0x00000004获得复位向量,跳入Reset_Handler,再经SystemInit与C库启动代码初始化后进入main()。所以"main()是第一行代码"其实是个错觉。

Q7:看门狗为什么叫"喂狗"?

看门狗计时器要求程序周期性重装载计数(喂狗),否则溢出触发复位。程序正常时喂狗是向芯片"报平安";程序死循环跑飞时无人喂狗,芯片被强制复位自救。STM32F103的独立看门狗IWDG用LSI时钟(40kHz)计数,最大超时约26秒,即使主时钟故障也能工作。