定时器

1. 定时器基本工作原理是什么

定时器本质上就是一个跟着时钟不断计数的计数器。

单片机给定时器一个时钟源后,它就会按固定节奏加一,或者某些模式下减一。当计数值到达设定上限时,会产生一个更新事件,然后重新开始计数。这个过程如果配合中断、输出比较、输入捕获等功能,就能实现定时、PWM、测频、计数等很多功能。

你面试时可以说:

定时器的核心就是“时钟驱动下的计数器”。只要时钟频率和计数终点确定了,定时时间就确定了。


2. 定时器如何实现定时

定时的本质是让定时器“数固定次数”。

例如,定时器时钟经过预分频后变成 1 kHz,也就是每 1 ms 计一次数。如果自动重装值 ARR 设成 999,那么它数 1000 次就溢出一次,也就是 1 秒。

所以定时 = 时钟频率确定 + 每次计数周期确定 + 一共数多少次确定。

常见公式你要会说:

定时周期 = [(PSC + 1) × (ARR + 1)] ÷ 定时器输入时钟频率

其中:

  • PSC 是预分频器

  • ARR 是自动重装值


3. 预分频器和自动重装值怎么理解

可以把它们理解成两个控制节奏的参数。

预分频器 PSC
作用是先把输入时钟变慢。
比如定时器原始时钟是 72 MHz,PSC = 71,那么分频后就是 1 MHz,也就是 1 微秒计一次数。

自动重装值 ARR
作用是决定数到多少结束一轮。
比如 ARR = 999,那就是从 0 数到 999,一共 1000 次,然后溢出。

面试时可以说:

PSC 决定计数器走得多快,ARR 决定一轮数多久。两个参数一起决定最终定时周期。


4. 为什么 PWM 通常和定时器有关

因为 PWM 的本质是“周期性波形”,而定时器最擅长做的就是“按固定时间节奏重复计数”。

定时器从 0 开始计数,到 ARR 结束形成一个周期。再设置一个比较值 CCR,当计数值小于 CCR 时输出高电平,大于等于 CCR 时输出低电平,这样就得到了一个周期固定、高低电平宽度可调的波形,这就是 PWM。

所以 PWM 频率由定时器周期决定,占空比由比较值决定。


中断

5. 什么是中断

中断可以理解成 MCU 正在做主程序时,外部或内部某个事件突然来了,CPU 暂时停下手头工作,先去处理这个更紧急的事,处理完再回来继续原来的程序。

常见中断来源有:

  • 定时器溢出

  • 串口收到数据

  • 外部按键触发

  • ADC 转换完成

面试时可以这样说:

中断是一种事件驱动机制,能让 CPU 在事件发生时及时响应,不需要一直盯着看。


6. 中断和轮询有什么区别

轮询
CPU 不停地反复检查某个标志位,看事件有没有发生。

中断
CPU 平时先做别的事,事件发生后硬件主动通知 CPU 去处理。

区别可以总结成这几句:

  • 轮询简单,但浪费 CPU 时间

  • 中断响应更及时,效率更高

  • 轮询适合简单、低实时性场景

  • 中断适合需要及时响应的场景

你可以这样答:

轮询是程序主动问,发生了吗。中断是硬件主动说,发生了。中断方式通常更高效。


7. 中断服务函数里为什么不建议写太重的逻辑

因为中断处理期间,CPU 会优先执行中断服务函数。如果里面逻辑太重,会带来几个问题:

  1. 占用 CPU 太久,影响主程序运行

  2. 可能拖慢其他中断响应,严重时造成中断丢失

  3. 会让系统实时性变差

  4. 排查问题更困难

所以一般原则是:

中断里只做“短、快、必要”的事,比如读数据、置标志、简单缓存。复杂处理放到主循环里做。

这个回答面试官会很喜欢,因为很有工程意识。


8. 中断里能不能直接做延时

通常不建议。

因为延时会让 CPU 长时间卡在中断里,导致其他中断和主程序都没法正常执行,整个系统实时性会很差,严重时会出问题。

比如串口接收中断里做一个长延时,后续数据可能已经到了,但当前中断还没退出,就容易丢数据。

更好的做法是:

  • 中断里置标志

  • 主循环里根据标志再处理

  • 或者用定时器、状态机实现非阻塞等待

面试时回答:

理论上能写,工程上通常不这么做,因为会阻塞系统。中断里尽量避免延时。


串口 UART

9. 串口通信的基本过程是什么

UART 是一种异步串行通信方式,不需要单独的时钟线。通信双方约定好波特率等参数后,就可以按固定节奏收发数据。

一个字节发送的典型过程是:

  1. 空闲状态通常为高电平

  2. 发送起始位,拉低

  3. 按位发送数据位,通常低位先发

  4. 可选发送校验位

  5. 发送停止位,恢复高电平

接收方按照相同波特率在合适时刻采样,就能还原出数据。


10. 波特率是什么

波特率表示串口每秒传输符号的速率。对于常见 UART,可以近似理解为每秒传多少位。

比如 9600 波特率,通常表示每秒传输 9600 位。

波特率越高,传输越快,但对时钟精度、线材质量、电磁干扰的要求也更高。

面试时可以说:

波特率决定串口通信节奏,发送方和接收方必须匹配,否则容易乱码。


11. 串口中断接收怎么做

典型思路是:

  1. 初始化串口,配置波特率、数据位、停止位等

  2. 开启接收中断

  3. 每收到一个字节,进入串口中断服务函数

  4. 在中断里把收到的字节读出来,存进缓冲区

  5. 根据协议判断一帧是否接收完成

  6. 主循环里再去解析完整数据包

面试表达建议:

串口中断接收一般采用“中断收字节,主循环解协议”的方式。这样响应快,也便于管理数据帧。


12. 为什么会出现丢包、乱码

常见原因有这些:

乱码

  • 波特率不一致

  • 数据位、停止位、校验位配置不一致

  • 时钟误差太大

  • 电平不匹配

丢包

  • 接收处理不及时

  • 中断里逻辑过重

  • 缓冲区太小

  • 主循环来不及取数据

  • 连续高速发送时没做好缓存管理

你可以答:

乱码更多和参数不匹配、时钟误差有关。丢包更多和处理速度、缓冲区设计、中断响应有关。


ADC

13. ADC 是什么

ADC 是模数转换器,作用是把连续变化的模拟电压转换成单片机能处理的数字量。

因为 MCU 内部处理的是数字信号,但现实中的很多传感器输出的是电压信号,所以需要 ADC 作为桥梁。


14. 分辨率怎么理解

分辨率表示 ADC 能把输入电压划分成多少个等级。

比如 12 位 ADC,一共能表示 (2^{12} = 4096) 个等级,也就是 0 到 4095。

如果参考电压是 3.3V,那么每一级大约对应:

3.3 / 4096 ≈ 0.000805V,也就是约 0.805mV

分辨率越高,能区分的电压变化越细。


15. ADC 采样值怎么转电压

公式你必须会:

电压值 = ADC采样值 ÷ 最大计数值 × 参考电压

对于 12 位 ADC:

电压 = ADC值 ÷ 4095 × Vref

比如 ADC 读到 2048,参考电压 3.3V,那么输入电压约为:

2048 / 4095 × 3.3 ≈ 1.65V


16. 为什么采样会抖动,怎么处理

采样抖动常见原因:

  1. 电源不稳定

  2. 模拟输入本身有噪声

  3. 采样时间太短

  4. 周围有电磁干扰

  5. ADC 参考电压不稳

  6. 输入阻抗较高,采样电容来不及充电

常见处理方法:

  • 多次采样取平均

  • 做滑动平均或滤波

  • 增大采样时间

  • 优化电源和地线

  • 加电容滤波

  • 软件去抖和阈值处理

面试时可以说:

ADC 抖动很常见,通常从硬件抗干扰和软件滤波两个方向一起处理。


PWM

17. PWM 的频率和占空比是什么

频率
指 PWM 每秒重复多少个周期。

占空比
指一个周期内高电平时间所占的比例。

例如:

  • 周期 20ms

  • 高电平持续 5ms

那么占空比就是 5ms / 20ms = 25%


18. PWM 如何控制舵机或 LED 亮度

控制 LED 亮度
LED 对人眼有视觉暂留效应。只要 PWM 频率足够高,人眼看到的是平均亮度。占空比越大,平均电流越大,LED 看起来越亮。

控制舵机
舵机通常看的是脉宽,而不是单纯占空比。很多舵机需要固定周期,比如 20ms,一个周期里高电平脉宽 0.5ms 到 2.5ms 对应不同角度。

所以:

  • LED 更关注平均功率

  • 舵机更关注固定周期下的高电平脉宽


19. PWM 底层怎么由定时器产生

底层逻辑就是:

  1. 定时器按设定频率从 0 计数到 ARR

  2. 每开始一轮就进入一个新周期

  3. 当计数值小于 CCR 时输出高电平

  4. 当计数值到达 CCR 后输出低电平

  5. 周期重复

所以:

  • ARR 影响周期

  • CCR 影响高电平宽度

  • PSC 影响计数速度

这就是 PWM 的底层来源。


I2C

20. I2C 的起始、停止条件

I2C 有两根线:

  • SCL 时钟线

  • SDA 数据线

SCL 为高电平 时:

  • SDA 从高变低,表示起始条件

  • SDA 从低变高,表示停止条件

这是 I2C 协议里非常关键的定义,面试官很爱问。


21. ACK 是什么

ACK 就是应答位。

每发送完 8 位数据后,第 9 个时钟周期由接收方拉低 SDA,表示“我收到了”,这就是 ACK。

如果接收方没有拉低,保持高电平,就叫 NACK,表示没有应答。

ACK 的作用:

  • 确认字节已收到

  • 帮助主机判断通信是否正常

  • 帮助判断从机是否存在、是否愿意继续传输


22. 主机和从机怎么通信

I2C 是主从式通信,总线由主机发起。

典型流程:

  1. 主机发起始条件

  2. 主机发送从机地址 + 读写位

  3. 从机返回 ACK

  4. 主机发送寄存器地址或数据

  5. 从机 ACK

  6. 根据读写方向继续交换数据

  7. 最后主机发停止条件

如果是读寄存器,常见流程是:

  1. 起始

  2. 发从机地址 + 写

  3. 发寄存器地址

  4. 重新起始

  5. 发从机地址 + 读

  6. 读数据

  7. 停止


23. I2C 为什么容易出错

I2C 很容易出错,原因很多:

  1. 时序要求细

  2. 地址容易写错

  3. 上拉电阻缺失或不合适

  4. ACK 没处理好

  5. 读写流程写错

  6. 起始、停止、重启条件理解不清

  7. 总线被某个器件拉住,导致忙状态

面试时你可以这样总结:

I2C 容易出错,是因为它对时序和流程要求比较严格,而且很多问题表面现象很像,需要结合 ACK、地址、时序一步步排查。


SPI

24. SPI 的四根线是什么

标准 SPI 常见四根线:

  • SCK:时钟线

  • MOSI:主机输出从机输入

  • MISO:主机输入从机输出

  • CS 或 NSS:片选信号

片选线用于告诉某个从机“现在轮到你通信了”。


25. 全双工怎么理解

全双工就是发送和接收可以同时进行。

SPI 在主机发数据的同时,从机也可以通过另一条数据线把数据送回来。所以每打一拍时钟,双方理论上都能交换 1 位数据。

这点和 UART、I2C 的感觉不太一样,SPI 的同步性更强。


26. 主从模式是什么

SPI 通信中有一个主机和一个或多个从机。

  • 主机负责提供时钟

  • 主机负责控制片选

  • 从机跟着主机节奏收发数据

谁产生时钟,谁通常就是主机。没有主机时钟,从机一般不会自己传数据。


27. SPI 和 I2C 的区别

这个问题很经典,你要能直接说出来。

线路数量

  • I2C 通常 2 根线

  • SPI 通常 4 根线,多个从机时还需要多根片选线

通信方式

  • I2C 半双工感更强,按协议一段一段传

  • SPI 支持全双工,同时收发

时钟

  • I2C 也是同步通信,有时钟线 SCL

  • SPI 也有时钟线 SCK,时序更直接

寻址方式

  • I2C 有设备地址,多个设备能挂同一总线

  • SPI 通常靠片选区分设备

速度

  • SPI 通常更快

  • I2C 相对慢一些,但布线省

复杂度

  • I2C 协议更复杂,时序细节更多

  • SPI 协议更直接,调试往往更省心

你面试时可以总结成一句:

I2C 省线、适合挂多个低速外设;SPI 更快、时序直接、适合高速通信。


给你一版面试里的简洁回答模板

如果面试官连续问这些基础题,你可以用这种风格回答:

我对这些外设的理解不只是停留在会配置。
例如定时器我知道本质是时钟驱动的计数器,PSC 和 ARR 一起决定定时周期;PWM 本质上是定时器计数和比较输出形成的周期波形。
中断方面,我理解它和轮询的区别,也知道中断里要尽量只做轻量处理,避免阻塞系统。
串口方面,我清楚 UART 的收发流程、波特率含义,以及丢包乱码的常见原因。
ADC 方面,我知道采样值和参考电压、分辨率之间的关系,也知道抖动需要通过滤波和硬件优化处理。
I2C 和 SPI 方面,我理解它们的通信流程、主从关系、时序特点,以及各自适用场景。
所以如果让我做 MCU 开发,我可以从原理、配置、联调、排错这几个层面去处理问题。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐