嵌入式ARM 处理器的面试题

1 ARM 处理器

1.1 常见CPU 指令集

  • CISC(Complex Instruction Set Computer)复杂指令集:特点是指令多、变长、复杂。
  • RISC(Reduced Instruction Set Computing)精简指令集:特点是指令少、等长、简单;寄存器多、速度快;并行处理能力强。
  • ARM 使用 RISC 指令集架构。

1.2 CPU 的内部结构

CPU 的内部结构大致可分为以下四部分:

  1. 控制单元:包含指令寄存器、指令译码器、操作控制器。
  2. 运算单元:即算术逻辑单元(ALU)。
  3. 存储单元:包含专用寄存器和通用寄存器。
  4. 时钟。

1.3 CPU 跟内存、虚拟内存、硬盘的关系

  1. 硬盘上的系统、程序和数据,需加载到内存中,才能被 CPU 读写。
  2. 当需要的内存大于实际物理内存时,会使用虚拟内存。
  3. 虚拟内存可将部分硬盘空间模拟成内存空间,暂时不运行的程序和不使用的数据存储在硬盘上,需要时再加载到内存。
  • 类比理解:CPU 是工厂,内存是中转站,硬盘是仓库,虚拟内存是临时中转站。

1.4 ARM 结构处理器分类

  1. 嵌入式微处理器:相当于微型计算机的 CPU(运算器 + 控制器 + 寄存器组),指 32 位以上的处理器,性能较高。
  2. 嵌入式微控制器(MCU):典型代表是单片机,以某类微处理器内核为核心,芯片内部集成 Flash、RAM、EEPROM、总线、定时/计数器、串行接口等功能模块。
  3. 嵌入式 DSP(数字信号处理):专门用于高效数字信号处理的微处理器,通用性较弱,常用于音频、图像、RF 通信等领域,多见于国防、诊疗、电器产品等行业。

1.5 嵌入式系统中 ROM、RAM、Register 的概念和作用

  • ROM(只读存储器):断电不丢数据,类似电脑中的硬盘。
  • RAM(随机存储器):断电丢数据,类似电脑中的内存。
  • Register(寄存器):断电丢数据,是暂时存放指令信息或数据信息的硬件设备。

1.6 SRAM、DRAM、SDRAM 的区别

类型 特点 应用场景
SRAM(静态随机存储器) 加电时无需刷新,数据不丢失 CPU 缓存
DRAM(动态随机存储器) 加电时需不断刷新才能保存数据 常见的系统内存
SDRAM(同步动态随机存储器) 数据读取需时钟同步 系统内存

1.7 字节序的概念及分类

  • 字节序:指多字节数据的内存排列顺序,主要有大端序和小端序两种。
    1. 大端字节序:高字节在低地址,低字节在高地址。
    2. 小端字节序:低字节在低地址,高字节在高地址。
  • ARM 芯片默认为小端模式,但可切换为大端模式。
  • 注意:大小端由 CPU 架构决定,而非软件。
  • 参考链接:https://www.ruanyifeng.com/blog/2022/06/endianness-analysis.html

1.8 C 语言代码判断大小端

  1. 方式一:取第一个字节判断
int check_end() 
{ 
    int a = 0x1; // 0x00 00 00 01 
    // 取 a 地址,强转为(char *)类型,*解引用范围为第一个字节(低地址)
    return *(char*)&a; // 返回 1 为小端,返回 0 为大端
}
  1. 方式二:利用联合体判断
int u_check_end() 
{
    union test 
    { 
        int a; 
        char b; 
    }u; 
    u.a = 1; // 0x00 00 00 01 
    return u.b; // 返回 1 为小端,否则为大端(union 共用一块内存,char 从最低地址开始)
}

2 STM32 基本概念

2.1 STM32 最小系统

STM32 单片机能工作的最小外围电路称为最小系统,通常包括 STM32 芯片、电源、时钟、下载调试和复位 5 部分。

2.2 嵌入式系统的定义

嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适用于对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。

  • 组成:由嵌入式微处理器、外围硬件设备、嵌入式操作系统及用户应用程序四部分构成。

2.3 常用的 STM32 外设

常用外设包括 I2C、SPI、ADC、UART、CAN、TIM、独立看门狗(IWDG)、RTC。

3 中断

3.1 中断、中断向量表和中断嵌套的概念

  • 中断:CPU 对系统某事件的响应,即 CPU 暂停当前程序,保留现场后自动执行该事件的中断处理程序,执行完后返回原程序断点继续执行。
    1. 中断向量:中断处理程序入口地址。
    2. 中断向量表:存放中断码、中断处理程序入口地址的一段内存空间。
    3. 中断嵌套:一个中断服务程序执行时,优先级更高的中断源请求,暂停低优先级服务程序去处理高优先级的,处理完后返回低优先级程序。

3.2 STM32 进入中断的步骤

  1. 配置中断向量表:修改 VTOR(Vector Table Offset Register)寄存器设置中断向量表起始地址(ST 厂家基本已配置,开发者无需操作)。
  2. 配置中断控制器:NVIC(嵌套向量中断控制器)、EXTI(外部中断控制器)。
  3. 定义中断服务程序:按规范命名中断处理函数。
  4. 触发中断:可通过软件(设置 NVIC 相关寄存器)或硬件(外部信号触发 EXTI 中断)触发。

3.3 处理器中断处理的过程

中断请求 → 中断响应 → 保护现场 → 中断服务 → 恢复现场 → 中断返回

3.4 STM32 常见中断类型

包括外部中断、定时器中断、DMA 中断、UART 中断、SPI 中断、I2C 中断、USB 中断、ADC 中断。

3.5 STM32 中断优先级分组

中断优先级分为组 0~4,组号表示抢占优先级可设置的位数,且抢占优先级位数 + 响应优先级位数 = 4 位,具体分组如下:

分组 抢占优先级 响应优先级
组 0 0 位(仅 0) 4 位
组 1 1 位(0~1) 3 位
组 2 2 位(0~3) 2 位
组 3 3 位(0~7) 1 位
组 4 4 位(0~15) 0 位

3.6 中断服务函数的特点和注意事项

  • 特点
    1. 没有参数和返回值。
    2. 需要配置相应寄存器开启中断。
    3. 触发条件满足时,硬件自动调用。
    4. 内部不能递归调用自己。
  • 注意事项:尽量不要执行耗时操作。

3.7 中断服务函数执行时间过长的优化方法

  1. 优化中断服务程序:精简代码,减少不必要的操作和延迟。
  2. 中断优先级设置:根据中断重要性和紧急程度设置优先级,确保高优先级中断及时响应。
  3. 中断屏蔽:临时屏蔽非关键中断,优先处理紧急中断。
  4. 中断共享优化:减少中断间竞争和冲突,避免中断抢占和资源争夺。

4 GPIO

4.1 STM32 GPIO 介绍

GPIO(通用输入输出)是 STM32 的重要外设,用于控制数字输入输出。

  1. 八种工作模式
    • 输入模式:浮空输入、带上拉输入、带下拉输入、模拟输入。
    • 输出模式:开漏输出、推挽输出、开漏复用输出、推挽复用输出。
  2. 常见用途
    • 普通 GPIO:输入模式读取外部传感器、按键信号;输出模式控制外部电路开关。
    • 引脚复用:将 GPIO 引脚作为 ADC、TIM、USART 等外设的输入输出端口。
    • 中断模式:配置 GPIO 中断模式实现外部中断、事件捕捉等功能。

4.2 STM32 IO 口开漏输出和推挽输出的区别

  • 推挽输出:既能输出低电平也能输出高电平,有较强的电流驱动能力。
  • 开漏输出:只能输出低电平,不能输出高电平;若要输出高电平,需外部接入上拉电阻。

5 I2C

5.1 I2C 总线介绍

IIC(Inter-Integrated Circuit)总线是短距离串行通信协议,支持一主多从、多主多从,同步串行半双工。

  • 通信线路:双向数据线(SDA)和单向时钟线(SCL)。
  • 传输速率:标准模式 100kbps,快速模式 400kbps,高速模式 3.4Mbps(少数支持)。
  • 地址机制:每个设备有唯一地址,通信时通过地址识别设备。
  • IIC 总线协议
    • 总线空闲状态:SCL 和 SDA 均为高电平(接上拉电阻)。
    • 启动信号(START):SCL 高电平时,SDA 由高变低(主控器发出)。
    • 数据位传送(DATA):SCL 高电平时,SDA 电平稳定(低为 0,高为 1)。
    • 应答信号(ACK):SCL 高电平时,SDA 保持低电平。
    • 非应答信号(NACK):SCL 高电平时,SDA 保持高电平。
    • 停止信号(STOP):SCL 高电平时,SDA 由低变高(主控器发出)。
  • 数据传输规则:每发送 1 个字节(8bit),第九个时钟期间,接收器需回传 ACK 或 NACK。
读数据步骤
  1. 主机发送启动信号(START)。
  2. 主机发送 7bit 从机地址 + 1bit 读写选择位(1 为读,0 为写)。
  3. 从机产生应答信号(ACK)。
  4. 主机发送 8bit 从机寄存器地址。
  5. 从机产生应答信号。
  6. 主机再次发送启动信号(START)。
  7. 主机再次发送 7bit 从机地址 + 1bit 读写选择位(1 为读)。
  8. 从机产生应答信号。
  9. 主机读取 1 个字节数据。
  10. 主机产生非应答信号(NACK),随后产生停止信号(STOP)。
写数据步骤
  1. 主机发起启动信号(START)。
  2. 主机发送 7bit 从机地址 + 1bit 读写选择位(0 为写)。
  3. 从机产生应答信号(ACK)。
  4. 主机发送 8bit 从机寄存器地址。
  5. 从机产生应答信号(ACK)。
  6. 主机发送 1 个字节数据。
  7. 从机产生应答信号(ACK)。

5.2 I2C 中使用开漏输出的原因

  1. 避免短路:多个从机若同时一个拉高、一个拉低,会导致短路;开漏输出配合上拉电阻可限流。
  2. 线与功能:适合多主机场景,1&0=0,任意主机拉低时,其他主机可识别。

5.3 IIC 驱动的验证方法

通过读取从机 ID 验证驱动是否正常。

5.4 IIC 通讯上拉电阻的选择及对速率的影响

  • 电阻选择:一般 1~10kΩ,通常选 4.7kΩ。
  • 对速率的影响:
    • 电阻过小:功耗大,易烧毁 I2C 接口。
    • 电阻过大:影响信号上升沿时间,降低时钟频率,可能出现误码。

6 SPI

6.1 SPI 总线介绍

SPI 是高速全双工同步串行通信协议,支持一主多从(从机间不通信)。

  • 传输速率:最高可达 50Mbps。
  • 通信线路(4 根):
    • 片选信号线(SS,低电平选中从机)。
    • 时钟信号线(SCLK,影响传输速率)。
    • 主发从收线(MOSI)。
    • 主收从发线(MISO)。
  • 四种工作模式(由极性 CPOL 和相位 CPHA 组合决定):
    • 极性 CPOL:0 表示空闲时 SCLK 低电平;1 表示空闲时 SCLK 高电平。
    • 相位 CPHA:0 表示第一个跳变沿采样;1 表示第二个跳变沿采样。
    • 模式 0:CPOL=0,CPHA=0(空闲 SCLK 低,第一个跳变沿采样)。
    • 模式 1:CPOL=0,CPHA=1(空闲 SCLK 低,第二个跳变沿采样)。
    • 模式 2:CPOL=1,CPHA=0(空闲 SCLK 高,第一个跳变沿采样)。
    • 模式 3:CPOL=1,CPHA=1(空闲 SCLK 高,第二个跳变沿采样)。

6.2 模拟 SPI 和硬件 SPI 的区别

对比维度 硬件 SPI 模拟 SPI
实现方式 芯片外设功能 用 GPIO 引脚模拟时序
CPU 资源占用 专用寄存器支持,占用少 需 CPU 实时控制引脚电平,占用多
通用性与移植性 依赖芯片外设,移植需适配 普通 GPIO 即可实现,通用性强、移植方便

7 UART

7.1 UART 保证数据传输正确性的方式

在数据位两端添加起始位、奇偶校验位、停止位,用于数据同步和纠错。

7.2 串口通讯接收不定长数据的方法

  1. 固定格式:收发双方约定数据起始和结束标识(如 AB 开头、BA 结束),收到标识时判定数据起止。
  2. 接收中断 + 超时判断:利用计时器,若固定时间内未接收新字符,则判定一帧数据接收完成(基于两帧数据间的时间间隔)。
  3. 空闲中断:串口空闲一段时间后触发中断,判定一帧数据传输完毕(仅高端 MCU 支持,STM32 常用此方式)。

7.3 串口 RS232、RS485 介绍

类型 通信方式 连接方式 传输介质 传输距离
RS232 全双工、点对点 3 线(RXD、TXD、GND) - 最长 15 米
RS485 半双工、一对多 2 线(D+、D-,双绞线) 差分传输(抗干扰强) 最长上千米

7.4 一个串口操控 6 个温湿度传感器的方法

使用串口多路复用器(如 CD74HC4067),或通过 RS485 总线实现多从机通信。

8 通信对比

8.1 异步通信和同步通信的区别

对比维度 异步通信 同步通信
等待机制 发送方无需等待接收方响应,操作分离 发送方需等待接收方处理并返回结果,再执行下一步
数据同步方式 依赖起始位、停止位(如 UART) 依赖时钟信号(如 SPI、I2C)或同步帧结构
效率 适用于数据传输不频繁场景, overhead 较低 适用于高速、连续数据传输,效率更高

8.2 UART、USB、SPI、IIC 的异同点

总线接口 串/并 同步/异步 工作方式 速率 线路 距离
UART 串行 异步 全双工 慢,最快仅 1.5Mbps 3 线(RX、TX、GND) 远,RS485 可达 1200m
USB 串行 同步 半双工 快,USB3.0 可达 5Gbps 4 线(Vbus、GND、D+、D-) 近,不超过 5m
SPI 串行 同步 全双工 快,可达 50Mbps 3 线或 4 线(SCLK、SIMO、SOMI、SS) 中,可达 10m
IIC 串行 同步 半双工 慢,最快仅 3.4Mbps 2 线(SCL、SDA) 近,不超过 30cm

8.3 CAN 通信协议的特点

CAN(Controller Area Network)是工业自动化和汽车领域常用的串行通信总线,支持多节点同时通信,具备以下特点:

  1. 高可靠性:采用差分信号传输,抗电磁干扰能力强。
  2. 高实时性:基于优先级机制,紧急数据可优先传输,响应速度快。
  3. 高速性:传输速率最高可达 1Mbps(短距离)。
  4. 固定帧格式:数据帧包含帧头、数据段、校验段等固定字段,解析统一。
  5. 多节点支持:单总线可连接多个设备,扩展性和兼容性强。

8.4 嵌入式系统中常用通信接口及适用场景

通信接口 适用场景
UART 简单点对点通信(如传感器、显示器数据交互)
SPI 高速多设备通信(如存储器读写、高速传感器数据采集)
I2C 多从机低速率通信(如传感器网络、外设控制)
CAN 长距离高可靠性场景(如车辆网络、工业自动化)
Ethernet(以太网) 大数据量远程通信(如智能家居、远程监控)

9 无线通信

9.1 WIFI 芯片选型及与 STM32 的通信方式

  • 选用芯片:ESP32-C3(集成 WIFI 和低功耗蓝牙功能)。
  • 通信方式:通过 UART(串口)通信,STM32 发送 AT 指令控制 ESP32-C3 实现 WIFI 数据收发(如连接路由器、上传/下载数据)。

9.2 无线模块选型及适用场景

传输距离 单网接入量 数据速率 功耗 使用场景
短(10~100m) 低(1Mbps) 短距离数据传输(如智能家居设备间通信)
中(50~几百 m) 非常高 高(数百 Mbps) 高(需接电源) 家庭/企业网络(如 WIFI 覆盖、高清视频传输)
中(几百米) 中等 中(几百 k~几 Mbps) 无线遥控、近距离传感器网络(如无线抄表)
远(几公里~十公里) 中等 低(几百~几百 kbps) 物联网传感器网络、远程监控(如农田监测)
远(几公里~十几公里) 非常高 低(几百~几百 kbps) 大规模物联网部署(如城市环境监测)

10 定时器

10.1 定时器的概念及功能

定时器是用于产生精确时间间隔的模块,核心组件包括定时器(计数器)、捕获/比较器、中断控制器,STM32 定时器分为基本定时器通用定时器高级定时器三类,可实现以下功能:

  1. 精确延时(如毫秒级、微秒级定时)。
  2. 周期性任务执行(如定时采集传感器数据)。
  3. PWM 波生成(如电机调速、LED 调光)。
  4. 输入信号测量(如脉冲宽度测量、频率测量)。

10.2 STM32 定时器的作用和优势

  • 作用
    1. 计数器:累计外部脉冲或内部时钟周期。
    2. 延时控制:生成固定时间间隔的中断。
    3. 输入捕获:解码信号(如编码器信号)、测量时间间隔。
    4. 编码器接口:读取电机编码器数据,计算转速和方向。
    5. 输出比较:生成 PWM 波、单脉冲输出。
    6. 触发中断:触发其他外设(如 ADC)工作。
  • 优势:无需 CPU 参与,定时精度高,降低 CPU 负载。

10.3 PWM 的实现原理

PWM(脉冲宽度调制)通过定时器的捕获比较寄存器(CCR)自动重装载寄存器(ARR) 控制输出电平,具体原理如下:

  1. 公式:占空比(%)= (CCR / (ARR + 1)) × 100%。
  2. 工作过程:
    • 定时器计数从 0 开始递增,当计数值 < CCR 时,输出高电平。
    • 当计数值 ≥ CCR 时,输出低电平。
    • 计数值达到 ARR 后自动重置为 0,重复上述过程,生成周期性 PWM 波。

11 DMA 有什么作用?

DMA(直接存储器访问)用于实现外设与存储器存储器与存储器之间的高速数据传输,无需 CPU 干预,核心作用如下:

  1. 降低 CPU 负载:数据传输由 DMA 硬件完成,CPU 可专注于其他任务(如逻辑运算、中断处理)。
  2. 提高传输效率:避免 CPU 逐字节搬运数据,传输速率更高(如 ADC 采样数据直接存入内存)。
  • STM32 资源:提供 2 个 DMA 控制器,DMA1 含 7 个通道,DMA2 含 5 个通道,每个通道对应特定外设(如 ADC、UART、SPI)。

12 ADC 采集的电压做什么处理,直接 STM32 读取吗?

  1. 信号预处理:ADC 采集的是模拟电压信号,需先通过模拟电路调理(如滤波、分压/放大),再进行数字化采样。
  2. 数字化后处理
    • 放大:根据参考电压和分压电路,将 ADC 采样值换算为实际电压(如采样值 × 参考电压 / 2^ADC 位数)。
    • 滤波:通过一阶低通滤波等算法平滑采样值,减少噪声干扰。
  3. 读取方式
    • 直接读取:STM32 可通过 ADC 数据寄存器直接读取采样值。
    • DMA 读取:通过 DMA 将 ADC 采样值自动传输到内存,减少 CPU 干预。

13 STM32 单片机如何降低功耗?

  1. 关闭无用外设时钟:对未使用的外设(如 SPI、I2C),通过 RCC 寄存器关闭其时钟,避免无效功耗。
  2. 降低时钟频率:根据功能需求调整系统时钟(如从 72MHz 降至 8MHz),减少 CPU 和外设的动态功耗。
  3. 使用低功耗模式
    • 休眠模式:CPU 停止工作,外设(如定时器、UART)可继续运行,唤醒速度快。
    • 停机模式:CPU 和大部分外设停止工作,仅保留 RTC、WKUP 引脚等唤醒源,功耗较低。
    • 待机模式:仅保留备份寄存器和 RTC,功耗最低,唤醒后需重新初始化系统。

14 嵌入式开发中常用的调试手段有哪些?

  1. 仿真器(Debugger):如 J-Link、ST-Link,支持源代码级调试(设置断点、单步执行、查看变量/寄存器值)。
  2. 串口调试:通过 UART 输出调试信息(如变量值、错误日志),配合串口助手(如 SecureCRT)查看。
  3. printf 调试:在代码中插入 printf 函数,输出关键流程或变量信息(需重定向 printf 到串口)。
  4. LED 指示灯:通过 LED 闪烁频率或状态(如亮/灭)标识程序执行状态(如初始化完成、错误报警)。
  5. 逻辑分析仪:捕获数字信号(如 SPI、I2C 时序),分析高低电平方波,定位时序问题。
  6. 示波器:观察模拟信号(如传感器输出、电源电压),检测信号噪声或波形异常。

15 单片机上电后没有运转,解决思路是什么?

  1. 排查供电:用万用表测量供电引脚(如 VCC、GND)电压是否符合规格(如 3.3V/5V),检查焊接是否虚焊、短路。
  2. 检查复位电路:测量复位引脚(NRST)电平,若持续为低电平(复位状态),排查复位电路元器件(如复位电阻、电容)是否损坏或焊接错误。
  3. 验证晶振:用示波器或逻辑分析仪测量晶振引脚(如 OSC_IN、OSC_OUT)是否有周期性时钟信号,排查晶振、匹配电容是否正常。
  4. 确认程序烧录:检查下载工具(如 ST-Link)是否提示烧录成功,若成功仍不运行,尝试重新烧录或更换程序文件。
  5. 排查代码/硬件卡死:通过仿真器单步调试,判断是否进入死循环(如while(1)未退出),或硬件外设(如 I2C)存在卡死问题。

16 复位后,main 函数执行之前单片机做什么?

复位后到 main 函数执行前,单片机执行启动代码(汇编编写) ,完成以下初始化操作:

  1. 复位向量跳转:程序计数器(PC)跳转到中断向量表中的复位向量地址,指向启动代码入口。
  2. 堆栈指针初始化:设置栈指针(SP)指向栈区起始地址,为函数调用、局部变量分配空间做准备。
  3. 系统时钟初始化:配置 PLL、HSE、HSI 等时钟源,设置系统主频(如 STM32 默认从 HSI 启动,主频 8MHz)。
  4. 数据段初始化:将 Flash 中的初始化数据(如全局初始化变量)复制到 RAM 对应区域。
  5. BSS 段初始化:将未初始化的全局变量、静态变量清零。
  6. C 库初始化:初始化 C 库内部数据结构(如 malloc 堆区),为 C 语言程序运行提供环境。
  7. 跳转至 main 函数:完成上述操作后,通过 bl main 指令跳转到 main 函数执行。

17 看门狗的作用,底层是怎么执行的?

  • 作用:防止 MCU 因程序死循环、跑飞导致系统卡死,保障系统稳定性。
  • 底层执行原理
    1. 核心组件:一个自动递增的计数器(看门狗计数器)和预设的超时阈值。
    2. 工作流程:
      • 系统启动后,看门狗计数器开始自动递增。
      • 程序需在计数器达到超时阈值前,通过“喂狗”操作(写入特定寄存器)重置计数器。
      • 若程序卡死(未及时喂狗),计数器溢出,触发中断(可选)或强制系统复位,恢复正常运行。
  • STM32 看门狗类型:独立看门狗(IWDG,由低速时钟 LSI 驱动,不受主时钟影响)、窗口看门狗(WWDG,由 APB1 时钟驱动,精度更高)。
Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐