嵌入式基础知识面试题(30 题,含答案)

覆盖:中断、SPI、I²C、UART、RS-485、DMA、定时器、看门狗、启动流程及常见硬件排错。不同 MCU 的寄存器命名和细节有差异,实际开发应以芯片手册为准。

一、中断与异常

1. 什么是中断?它与轮询相比有什么优缺点?

答案: 中断是硬件事件到来时暂停当前执行流,转到中断服务程序(ISR),处理后恢复现场的机制。它能降低无效轮询和响应延迟,适合低频、异步事件;代价是引入异步并发、上下文切换和时序复杂性。高频连续数据常采用“外设 + DMA + 批量中断”,而不是每字节一次中断。轮询实现简单、时序直观,在启动阶段、极短等待或事件持续高频时也可能更合适。

2. 进入和退出中断时通常发生什么?

答案: CPU 完成当前可完成的指令,依据架构自动或由软件保存部分现场,取得中断向量并跳转到 ISR;退出时恢复现场和先前执行状态。以 Cortex-M 为例,硬件会自动压栈部分核心寄存器,NVIC 支持尾链等优化。ISR 使用的额外寄存器、浮点上下文和中断嵌套会增加栈占用与延迟。

3. 中断服务程序为什么要短小?ISR 中不宜做什么?

答案: ISR 运行时会延迟同级或更低优先级中断,并增加任务响应抖动,因此应快速清除/确认中断源,采集必要数据,通知任务后退出。不宜长时间循环、阻塞等待、动态分配、进行大量日志格式化、访问慢速外设或调用非 ISR 安全的 RTOS API。耗时解析和业务处理应下放到任务或主循环,即“上半部快、下半部完整”。

4. 什么是中断优先级和中断嵌套?

答案: 多个中断同时待处理时,控制器根据优先级选择服务顺序;更高优先级中断可抢占正在执行的低优先级 ISR,称为嵌套。以 Cortex-M 为例,优先级数值通常越小逻辑优先级越高,优先级分组决定抢占优先级和子优先级位数。优先级应按响应时限配置,不能只把所有“重要”中断都设成最高。

5. 中断丢失或程序反复进入同一中断,应如何排查?

答案: 检查外设中断标志、使能位、NVIC 使能和向量表是否正确;确认标志的清除语义是写 0、写 1 清除、读后清除还是要求特定顺序;检查引脚复用、边沿/电平配置和信号质量。反复进入常因中断源未清除或电平条件持续存在;丢失可能因屏蔽时间过长、只用一个标志表示多次事件、FIFO 溢出或清标志时误清新事件。用示波器 GPIO 打点和计数器比在 ISR 中大量打印更可靠。

6. ISR 与主循环/任务共享变量时,加 volatile 就足够吗?

答案: 通常不够。volatile 只约束编译器对访问的优化,不保证多字节读写或“读-改-写”原子,也不解决竞态。单生产者单消费者环形缓冲区可在满足平台原子访问和内存顺序的前提下精心设计;一般情况应使用短临界区、原子操作或 RTOS 的 ISR 安全通信机制。还要避免 ISR 改写主线程正在处理的同一缓冲区。

二、SPI

7. SPI 的基本信号和通信特点是什么?

答案: 典型 SPI 有 SCLKMOSIMISO 和片选 CS/NSS。主机产生时钟并选择从机,数据通常全双工、无地址和确认机制,速率较高。多个从机可共享时钟和数据线,但通常各有片选;未选中的从机必须释放 MISO 为高阻,否则会总线冲突。

8. SPI 的 CPOL 和 CPHA 是什么?四种模式如何理解?

答案: CPOL 决定时钟空闲电平,CPHA 决定在第一个还是第二个有效边沿采样。组合形成 Mode 0~3。不能仅凭模式编号猜测,应对照主从器件手册的“在哪个边沿改变、在哪个边沿采样”。模式不匹配常表现为数据整体左/右移一位、最高/最低位错误或随频率升高变得不稳定。

9. SPI 为什么说发送和接收同时发生?只读从机时为什么还要发送数据?

答案: SPI 移位寄存器每个时钟边沿同时移出一位并移入一位,主机只有产生时钟,从机数据才能被移回。因此主机“只读”时仍需发送 dummy 字节(常见 0x000xFF,以器件要求为准)来产生时钟;“只写”时也要读取或清除接收寄存器/FIFO,避免溢出状态影响后续通信。

10. SPI 的片选信号有哪些常见时序要求?

答案: 从机手册通常规定片选建立时间、结束保持时间、字节间间隔,以及一帧内 CS 能否拉高。有的器件要求命令、地址、数据期间 CS 始终保持有效;若驱动每字节自动抬高 CS,通信会失败。还要满足设备上电后首次访问等待时间,并避免多个从机同时选中。

11. SPI 读出的数据全是 0xFF0x00,如何排查?

答案: 先用示波器/逻辑分析仪确认供电、地、CS、时钟和 MOSI 是否实际到达器件,再检查引脚复用、主从模式、CPOL/CPHA、位序、数据宽度、速率及命令格式。全 0xFF 常见于 MISO 悬空或上拉、从机未被选中;全 0x00 可能是下拉、器件未供电/复位或一直驱动低。还需检查 MISO/MOSI 是否接反、电平是否兼容,以及读取命令后是否需要 dummy 周期。

三、I²C(IIC)

12. I²C 的基本信号和电气特点是什么?

答案: I²C 使用 SCLSDA 两根线,器件通常以开漏/开集方式只能主动拉低,由上拉电阻产生高电平,因此支持线与、应答、仲裁和多器件共享。标准模式、快速模式等有不同速率和时序要求。上拉阻值需结合总线电容、上升时间、功耗和器件灌电流能力选择,并非固定都用 4.7 kΩ。

13. I²C 的起始、停止、数据和 ACK/NACK 条件是什么?

答案: SCL 为高时 SDA 从高变低是 START,从低变高是 STOP;一般数据位只能在 SCL 低时改变,在 SCL 高时保持稳定。每传输 8 位后,第 9 个时钟由接收方拉低 SDA 表示 ACK,保持高表示 NACK。主机读多个字节时,通常对非末字节发 ACK,对最后一个字节发 NACK,然后 STOP。

14. 7 位 I²C 地址与所谓“8 位地址”有什么关系?

答案: 标准 7 位地址占首字节的高 7 位,最低位是读写位。因此有些手册列出的“写地址”和“读地址”其实是 (addr7 << 1) | R/W,例如 7 位地址 0x50 对应写字节 0xA0、读字节 0xA1。不同驱动 API 有的接收 7 位地址,有的要求已左移地址,必须看接口文档,避免重复左移。

15. 什么是重复起始(Repeated START)?什么时候使用?

答案: 主机不发送 STOP,而直接再次发送 START,从而保持对总线的控制并改变方向或目标阶段。典型寄存器读取是:写设备地址 + 寄存器地址,然后重复起始,再发读地址并读取数据。某些器件允许 STOP 后再读,某些严格要求重复起始,应按器件手册实现。

16. I²C 总线 SDA 被拉低、总线忙死时如何恢复?

答案: 常见原因是主机在字节中途复位,从机仍等待剩余时钟。可暂时把 SCL 配为开漏 GPIO,在确认硬件允许后产生最多约 9 个时钟脉冲,让从机移出剩余位,再生成 STOP,随后复位 I²C 控制器并重新初始化。若仍不释放,应检查器件复位/掉电能力、线路短路、电平转换器和上拉。恢复动作应有超时,不能永久死循环。

17. I²C 出现 NACK 的常见原因有哪些?

答案: 地址格式错误、设备未上电或仍在复位、引脚/上拉错误、速度或时序超限、器件忙(如 EEPROM 内部写周期)、寄存器地址或命令不支持、总线电平不达标都可能导致 NACK。应先确认 NACK 出现在地址阶段还是数据阶段,再结合波形定位;不能简单地无限重试,否则会掩盖硬件故障并阻塞系统。

四、UART 与 RS-485

18. UART 的一帧通常由什么组成?双方必须匹配哪些参数?

答案: UART 帧通常包含 1 个起始位、5~9 个数据位、可选奇偶校验位和 1/1.5/2 个停止位,线路空闲通常为高。双方要匹配波特率、数据位、校验、停止位和位序;常见写法 115200 8N1 表示 115200 波特、8 数据位、无校验、1 停止位。UART 本身通常不规定包边界、地址和 CRC,这些由上层协议定义。

19. 波特率和比特率有什么区别?UART 为什么允许少量时钟误差?

答案: 波特率是每秒符号数,比特率是每秒比特数;二进制 UART 中每个符号承载一位,所以两者数值通常相同。接收器检测起始边沿后按内部过采样时钟在各位中间采样,因此可容忍一定的收发时钟偏差,但误差会在整帧内累积。容许值取决于帧长、过采样和器件设计,不能一概写死;应检查时钟树和手册误差预算。

20. UART 的奇偶校验能发现哪些错误?为什么还需要 CRC?

答案: 奇偶校验可检测一帧数据位中奇数个翻转,但无法发现偶数个翻转,也不能可靠发现丢字节、插入、顺序或帧边界错误。上层协议常增加长度、序号和 CRC。CRC 对突发错误检测能力强,但只用于检错,不提供加密或身份认证。

21. UART 接收不定长数据有哪些常见方案?

答案: 可逐字节中断写入环形缓冲区,再按结束符/长度/超时解析;也可用 DMA 循环接收,结合空闲线(IDLE)中断、DMA 半满/满中断计算新增数据。解析器应能处理粘包、拆包、回绕、非法长度、超时和校验失败。若协议允许任意二进制数据,不能仅靠某个普通数据字节作为分隔符,除非设计转义机制。

22. UART 出现乱码、丢字节或帧错误,应如何排查?

答案: 确认共地和电平标准(TTL、RS-232、RS-485 不能直接混接),测量真实波特率并检查时钟源;核对数据位/校验/停止位、引脚复用和收发交叉连接。丢字节还要检查接收是否及时、FIFO/溢出标志、DMA 缓冲区和临界区;长线环境检查终端、电磁干扰和地电位差。先看波形和错误状态寄存器,再判断是物理层还是软件层问题。

23. RS-232、TTL UART 和 RS-485 有什么区别?

答案: UART 是串行数据格式/控制器,TTL/CMOS UART 使用相对地的单端逻辑电平,适合板内短距离;RS-232 使用正负单端电压且逻辑常反相,需要收发器;RS-485 使用差分 A/B 线,抗共模干扰、适合较长距离和多节点。RS-485 主要定义物理层,不自动解决总线仲裁、地址、帧格式和重发,这些需上层协议实现。

24. 半双工 RS-485 如何控制收发方向?

答案: 常见收发器用 DE 控制驱动使能、/RE 控制接收使能,工程中常将它们联动。发送前使能驱动,发送完后等待最后一个停止位真正离开移位寄存器,即等待 Transmission Complete,而不仅是发送数据寄存器空,再关闭驱动切回接收。切换过早会截断帧尾,过晚会占用总线并可能与对端响应冲突。

25. RS-485 为什么需要终端电阻和偏置电阻?应如何放置?

答案: 长线或高速下,线缆表现为传输线,终端电阻用于匹配特性阻抗、减少反射,通常放在总线物理两端,而不是每个节点都并联。偏置电阻在所有驱动器高阻时给总线一个确定的空闲状态;很多现代收发器带失效保护,但仍需根据网络设计确认。阻值要结合线缆阻抗、节点负载、收发器驱动能力和功耗计算。

26. RS-485 的 A/B 线命名为什么容易接反?接反后怎么办?

答案: 不同厂商对 A/B、+/- 的命名历史上并不完全一致,不能只按字母连接,应比较数据手册中“非反相/反相端”以及空闲/显性差分极性。接反通常导致无法正确接收或持续帧错误。调试时测差分波形并对照收发器真值表;产品接口文档最好同时标注 A/B 与极性含义。

五、DMA、定时器、看门狗与系统基础

27. DMA 的作用是什么?使用 DMA 时有哪些常见陷阱?

答案: DMA 在外设与内存或内存之间搬运数据,减少 CPU 逐字节处理和中断次数,适合 ADC、SPI、UART 等连续传输。需正确设置源/目标宽度、地址递增、长度、方向、触发源和完成/错误中断;保证缓冲区生命周期有效、对齐满足要求,避免传输期间被同时修改。在带数据缓存的 CPU 上还要做 cache clean/invalidate 或使用一致性内存,否则 CPU 与 DMA 可能看到不同数据。

28. MCU 定时器能实现哪些功能?输入捕获和输出比较有什么区别?

答案: 定时器由时钟、预分频器、计数器和比较/捕获通道等组成,可用于周期中断、PWM、脉宽/频率测量、编码器接口和触发 ADC/DMA。输入捕获在外部边沿到来时锁存计数值,通过相邻捕获差求周期;输出比较在计数值等于比较寄存器时触发中断或改变输出。PWM 通常由周期寄存器和比较值决定频率与占空比。

29. 看门狗有什么作用?怎样“正确喂狗”?

答案: 看门狗在规定时间内未被刷新时复位系统,用于从死锁、跑飞等故障中恢复。不能在无条件定时中断里机械喂狗,否则即使业务任务卡死也会继续喂。更可靠的做法是由监控模块检查关键任务心跳、状态机进展和必要外设健康度,全部满足后再喂狗;保存复位原因和关键故障上下文。窗口看门狗还要求刷新既不能太晚也不能太早。

30. MCU 从复位到进入 main() 通常经历什么?Bootloader 如何跳转到应用?

答案: 复位后 CPU 从向量表取得初始栈指针和复位处理入口,启动代码设置时钟/内存环境,复制 .data 从 Flash 初值区到 RAM、清零 .bss,执行必要的 C/C++ 运行库初始化,再调用 main()。Bootloader 校验应用映像后跳转时,通常要停止相关中断和外设、设置向量表地址(若架构支持)、装载应用初始栈指针并跳到应用复位入口。还需处理缓存、MPU、时钟和 pending 中断等状态;具体流程必须遵循芯片架构和厂商文档。


面试作答建议

回答外设问题时可以沿着一条清晰链路展开:电气层 → 时序/帧格式 → 控制器配置 → 中断或 DMA → 缓冲与协议解析 → 超时和错误恢复 → 示波器/逻辑分析仪验证。这比只背寄存器或协议名更能体现实际调试能力。