【面试准备】蓝桥杯嵌入式——外设原理类
本文概述了单片机常用外设的工作原理与使用要点。定时器本质是时钟驱动的计数器,通过PSC和ARR参数实现定时;PWM利用定时器生成周期波形。中断机制优于轮询,但服务函数应保持简洁。串口通信依赖波特率匹配,采用中断接收可提高效率。ADC将模拟信号数字化,需注意抗干扰处理。I2C和SPI各有特点:I2C省线适合低速多设备,SPI全双工适合高速通信。掌握这些外设的底层原理和配置方法,是MCU开发的基础。
定时器
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 会优先执行中断服务函数。如果里面逻辑太重,会带来几个问题:
-
占用 CPU 太久,影响主程序运行
-
可能拖慢其他中断响应,严重时造成中断丢失
-
会让系统实时性变差
-
排查问题更困难
所以一般原则是:
中断里只做“短、快、必要”的事,比如读数据、置标志、简单缓存。复杂处理放到主循环里做。
这个回答面试官会很喜欢,因为很有工程意识。
8. 中断里能不能直接做延时
通常不建议。
因为延时会让 CPU 长时间卡在中断里,导致其他中断和主程序都没法正常执行,整个系统实时性会很差,严重时会出问题。
比如串口接收中断里做一个长延时,后续数据可能已经到了,但当前中断还没退出,就容易丢数据。
更好的做法是:
-
中断里置标志
-
主循环里根据标志再处理
-
或者用定时器、状态机实现非阻塞等待
面试时回答:
理论上能写,工程上通常不这么做,因为会阻塞系统。中断里尽量避免延时。
串口 UART
9. 串口通信的基本过程是什么
UART 是一种异步串行通信方式,不需要单独的时钟线。通信双方约定好波特率等参数后,就可以按固定节奏收发数据。
一个字节发送的典型过程是:
-
空闲状态通常为高电平
-
发送起始位,拉低
-
按位发送数据位,通常低位先发
-
可选发送校验位
-
发送停止位,恢复高电平
接收方按照相同波特率在合适时刻采样,就能还原出数据。
10. 波特率是什么
波特率表示串口每秒传输符号的速率。对于常见 UART,可以近似理解为每秒传多少位。
比如 9600 波特率,通常表示每秒传输 9600 位。
波特率越高,传输越快,但对时钟精度、线材质量、电磁干扰的要求也更高。
面试时可以说:
波特率决定串口通信节奏,发送方和接收方必须匹配,否则容易乱码。
11. 串口中断接收怎么做
典型思路是:
-
初始化串口,配置波特率、数据位、停止位等
-
开启接收中断
-
每收到一个字节,进入串口中断服务函数
-
在中断里把收到的字节读出来,存进缓冲区
-
根据协议判断一帧是否接收完成
-
主循环里再去解析完整数据包
面试表达建议:
串口中断接收一般采用“中断收字节,主循环解协议”的方式。这样响应快,也便于管理数据帧。
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. 为什么采样会抖动,怎么处理
采样抖动常见原因:
-
电源不稳定
-
模拟输入本身有噪声
-
采样时间太短
-
周围有电磁干扰
-
ADC 参考电压不稳
-
输入阻抗较高,采样电容来不及充电
常见处理方法:
-
多次采样取平均
-
做滑动平均或滤波
-
增大采样时间
-
优化电源和地线
-
加电容滤波
-
软件去抖和阈值处理
面试时可以说:
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 底层怎么由定时器产生
底层逻辑就是:
-
定时器按设定频率从 0 计数到 ARR
-
每开始一轮就进入一个新周期
-
当计数值小于 CCR 时输出高电平
-
当计数值到达 CCR 后输出低电平
-
周期重复
所以:
-
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 是主从式通信,总线由主机发起。
典型流程:
-
主机发起始条件
-
主机发送从机地址 + 读写位
-
从机返回 ACK
-
主机发送寄存器地址或数据
-
从机 ACK
-
根据读写方向继续交换数据
-
最后主机发停止条件
如果是读寄存器,常见流程是:
-
起始
-
发从机地址 + 写
-
发寄存器地址
-
重新起始
-
发从机地址 + 读
-
读数据
-
停止
23. I2C 为什么容易出错
I2C 很容易出错,原因很多:
-
时序要求细
-
地址容易写错
-
上拉电阻缺失或不合适
-
ACK 没处理好
-
读写流程写错
-
起始、停止、重启条件理解不清
-
总线被某个器件拉住,导致忙状态
面试时你可以这样总结:
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 开发,我可以从原理、配置、联调、排错这几个层面去处理问题。
更多推荐



所有评论(0)