嵌入式ARM 处理器的面试题
本文介绍了ARM处理器和STM32的基本概念。主要内容包括:1)ARM处理器采用RISC指令集架构,包含CPU内部结构、存储器分类及字节序概念;2)STM32最小系统组成及常用外设(I2C、SPI等);3)中断机制,包括处理流程、优先级分组和优化方法;4)GPIO的8种工作模式;5)I2C总线协议及开漏输出特点;6)SPI总线特性。重点阐述了ARM处理器的体系结构、存储器管理、中断处理机制以及常用
嵌入式ARM 处理器的面试题
1 ARM 处理器
1.1 常见CPU 指令集
- CISC(Complex Instruction Set Computer)复杂指令集:特点是指令多、变长、复杂。
- RISC(Reduced Instruction Set Computing)精简指令集:特点是指令少、等长、简单;寄存器多、速度快;并行处理能力强。
- ARM 使用 RISC 指令集架构。
1.2 CPU 的内部结构
CPU 的内部结构大致可分为以下四部分:
- 控制单元:包含指令寄存器、指令译码器、操作控制器。
- 运算单元:即算术逻辑单元(ALU)。
- 存储单元:包含专用寄存器和通用寄存器。
- 时钟。
1.3 CPU 跟内存、虚拟内存、硬盘的关系
- 硬盘上的系统、程序和数据,需加载到内存中,才能被 CPU 读写。
- 当需要的内存大于实际物理内存时,会使用虚拟内存。
- 虚拟内存可将部分硬盘空间模拟成内存空间,暂时不运行的程序和不使用的数据存储在硬盘上,需要时再加载到内存。
- 类比理解:CPU 是工厂,内存是中转站,硬盘是仓库,虚拟内存是临时中转站。
1.4 ARM 结构处理器分类
- 嵌入式微处理器:相当于微型计算机的 CPU(运算器 + 控制器 + 寄存器组),指 32 位以上的处理器,性能较高。
- 嵌入式微控制器(MCU):典型代表是单片机,以某类微处理器内核为核心,芯片内部集成 Flash、RAM、EEPROM、总线、定时/计数器、串行接口等功能模块。
- 嵌入式 DSP(数字信号处理):专门用于高效数字信号处理的微处理器,通用性较弱,常用于音频、图像、RF 通信等领域,多见于国防、诊疗、电器产品等行业。
1.5 嵌入式系统中 ROM、RAM、Register 的概念和作用
- ROM(只读存储器):断电不丢数据,类似电脑中的硬盘。
- RAM(随机存储器):断电丢数据,类似电脑中的内存。
- Register(寄存器):断电丢数据,是暂时存放指令信息或数据信息的硬件设备。
1.6 SRAM、DRAM、SDRAM 的区别
| 类型 | 特点 | 应用场景 |
|---|---|---|
| SRAM(静态随机存储器) | 加电时无需刷新,数据不丢失 | CPU 缓存 |
| DRAM(动态随机存储器) | 加电时需不断刷新才能保存数据 | 常见的系统内存 |
| SDRAM(同步动态随机存储器) | 数据读取需时钟同步 | 系统内存 |
1.7 字节序的概念及分类
- 字节序:指多字节数据的内存排列顺序,主要有大端序和小端序两种。
- 大端字节序:高字节在低地址,低字节在高地址。
- 小端字节序:低字节在低地址,高字节在高地址。
- ARM 芯片默认为小端模式,但可切换为大端模式。
- 注意:大小端由 CPU 架构决定,而非软件。
- 参考链接:https://www.ruanyifeng.com/blog/2022/06/endianness-analysis.html
1.8 C 语言代码判断大小端
- 方式一:取第一个字节判断
int check_end()
{
int a = 0x1; // 0x00 00 00 01
// 取 a 地址,强转为(char *)类型,*解引用范围为第一个字节(低地址)
return *(char*)&a; // 返回 1 为小端,返回 0 为大端
}
- 方式二:利用联合体判断
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 暂停当前程序,保留现场后自动执行该事件的中断处理程序,执行完后返回原程序断点继续执行。
- 中断向量:中断处理程序入口地址。
- 中断向量表:存放中断码、中断处理程序入口地址的一段内存空间。
- 中断嵌套:一个中断服务程序执行时,优先级更高的中断源请求,暂停低优先级服务程序去处理高优先级的,处理完后返回低优先级程序。
3.2 STM32 进入中断的步骤
- 配置中断向量表:修改 VTOR(Vector Table Offset Register)寄存器设置中断向量表起始地址(ST 厂家基本已配置,开发者无需操作)。
- 配置中断控制器:NVIC(嵌套向量中断控制器)、EXTI(外部中断控制器)。
- 定义中断服务程序:按规范命名中断处理函数。
- 触发中断:可通过软件(设置 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 中断服务函数的特点和注意事项
- 特点:
- 没有参数和返回值。
- 需要配置相应寄存器开启中断。
- 触发条件满足时,硬件自动调用。
- 内部不能递归调用自己。
- 注意事项:尽量不要执行耗时操作。
3.7 中断服务函数执行时间过长的优化方法
- 优化中断服务程序:精简代码,减少不必要的操作和延迟。
- 中断优先级设置:根据中断重要性和紧急程度设置优先级,确保高优先级中断及时响应。
- 中断屏蔽:临时屏蔽非关键中断,优先处理紧急中断。
- 中断共享优化:减少中断间竞争和冲突,避免中断抢占和资源争夺。
4 GPIO
4.1 STM32 GPIO 介绍
GPIO(通用输入输出)是 STM32 的重要外设,用于控制数字输入输出。
- 八种工作模式:
- 输入模式:浮空输入、带上拉输入、带下拉输入、模拟输入。
- 输出模式:开漏输出、推挽输出、开漏复用输出、推挽复用输出。
- 常见用途:
- 普通 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。
读数据步骤
- 主机发送启动信号(START)。
- 主机发送 7bit 从机地址 + 1bit 读写选择位(1 为读,0 为写)。
- 从机产生应答信号(ACK)。
- 主机发送 8bit 从机寄存器地址。
- 从机产生应答信号。
- 主机再次发送启动信号(START)。
- 主机再次发送 7bit 从机地址 + 1bit 读写选择位(1 为读)。
- 从机产生应答信号。
- 主机读取 1 个字节数据。
- 主机产生非应答信号(NACK),随后产生停止信号(STOP)。
写数据步骤
- 主机发起启动信号(START)。
- 主机发送 7bit 从机地址 + 1bit 读写选择位(0 为写)。
- 从机产生应答信号(ACK)。
- 主机发送 8bit 从机寄存器地址。
- 从机产生应答信号(ACK)。
- 主机发送 1 个字节数据。
- 从机产生应答信号(ACK)。
5.2 I2C 中使用开漏输出的原因
- 避免短路:多个从机若同时一个拉高、一个拉低,会导致短路;开漏输出配合上拉电阻可限流。
- 线与功能:适合多主机场景,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 串口通讯接收不定长数据的方法
- 固定格式:收发双方约定数据起始和结束标识(如 AB 开头、BA 结束),收到标识时判定数据起止。
- 接收中断 + 超时判断:利用计时器,若固定时间内未接收新字符,则判定一帧数据接收完成(基于两帧数据间的时间间隔)。
- 空闲中断:串口空闲一段时间后触发中断,判定一帧数据传输完毕(仅高端 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)是工业自动化和汽车领域常用的串行通信总线,支持多节点同时通信,具备以下特点:
- 高可靠性:采用差分信号传输,抗电磁干扰能力强。
- 高实时性:基于优先级机制,紧急数据可优先传输,响应速度快。
- 高速性:传输速率最高可达 1Mbps(短距离)。
- 固定帧格式:数据帧包含帧头、数据段、校验段等固定字段,解析统一。
- 多节点支持:单总线可连接多个设备,扩展性和兼容性强。
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 定时器分为基本定时器、通用定时器、高级定时器三类,可实现以下功能:
- 精确延时(如毫秒级、微秒级定时)。
- 周期性任务执行(如定时采集传感器数据)。
- PWM 波生成(如电机调速、LED 调光)。
- 输入信号测量(如脉冲宽度测量、频率测量)。
10.2 STM32 定时器的作用和优势
- 作用:
- 计数器:累计外部脉冲或内部时钟周期。
- 延时控制:生成固定时间间隔的中断。
- 输入捕获:解码信号(如编码器信号)、测量时间间隔。
- 编码器接口:读取电机编码器数据,计算转速和方向。
- 输出比较:生成 PWM 波、单脉冲输出。
- 触发中断:触发其他外设(如 ADC)工作。
- 优势:无需 CPU 参与,定时精度高,降低 CPU 负载。
10.3 PWM 的实现原理
PWM(脉冲宽度调制)通过定时器的捕获比较寄存器(CCR) 和自动重装载寄存器(ARR) 控制输出电平,具体原理如下:
- 公式:占空比(%)= (CCR / (ARR + 1)) × 100%。
- 工作过程:
- 定时器计数从 0 开始递增,当计数值 < CCR 时,输出高电平。
- 当计数值 ≥ CCR 时,输出低电平。
- 计数值达到 ARR 后自动重置为 0,重复上述过程,生成周期性 PWM 波。
11 DMA 有什么作用?
DMA(直接存储器访问)用于实现外设与存储器、存储器与存储器之间的高速数据传输,无需 CPU 干预,核心作用如下:
- 降低 CPU 负载:数据传输由 DMA 硬件完成,CPU 可专注于其他任务(如逻辑运算、中断处理)。
- 提高传输效率:避免 CPU 逐字节搬运数据,传输速率更高(如 ADC 采样数据直接存入内存)。
- STM32 资源:提供 2 个 DMA 控制器,DMA1 含 7 个通道,DMA2 含 5 个通道,每个通道对应特定外设(如 ADC、UART、SPI)。
12 ADC 采集的电压做什么处理,直接 STM32 读取吗?
- 信号预处理:ADC 采集的是模拟电压信号,需先通过模拟电路调理(如滤波、分压/放大),再进行数字化采样。
- 数字化后处理:
- 放大:根据参考电压和分压电路,将 ADC 采样值换算为实际电压(如采样值 × 参考电压 / 2^ADC 位数)。
- 滤波:通过一阶低通滤波等算法平滑采样值,减少噪声干扰。
- 读取方式:
- 直接读取:STM32 可通过 ADC 数据寄存器直接读取采样值。
- DMA 读取:通过 DMA 将 ADC 采样值自动传输到内存,减少 CPU 干预。
13 STM32 单片机如何降低功耗?
- 关闭无用外设时钟:对未使用的外设(如 SPI、I2C),通过 RCC 寄存器关闭其时钟,避免无效功耗。
- 降低时钟频率:根据功能需求调整系统时钟(如从 72MHz 降至 8MHz),减少 CPU 和外设的动态功耗。
- 使用低功耗模式:
- 休眠模式:CPU 停止工作,外设(如定时器、UART)可继续运行,唤醒速度快。
- 停机模式:CPU 和大部分外设停止工作,仅保留 RTC、WKUP 引脚等唤醒源,功耗较低。
- 待机模式:仅保留备份寄存器和 RTC,功耗最低,唤醒后需重新初始化系统。
14 嵌入式开发中常用的调试手段有哪些?
- 仿真器(Debugger):如 J-Link、ST-Link,支持源代码级调试(设置断点、单步执行、查看变量/寄存器值)。
- 串口调试:通过 UART 输出调试信息(如变量值、错误日志),配合串口助手(如 SecureCRT)查看。
- printf 调试:在代码中插入 printf 函数,输出关键流程或变量信息(需重定向 printf 到串口)。
- LED 指示灯:通过 LED 闪烁频率或状态(如亮/灭)标识程序执行状态(如初始化完成、错误报警)。
- 逻辑分析仪:捕获数字信号(如 SPI、I2C 时序),分析高低电平方波,定位时序问题。
- 示波器:观察模拟信号(如传感器输出、电源电压),检测信号噪声或波形异常。
15 单片机上电后没有运转,解决思路是什么?
- 排查供电:用万用表测量供电引脚(如 VCC、GND)电压是否符合规格(如 3.3V/5V),检查焊接是否虚焊、短路。
- 检查复位电路:测量复位引脚(NRST)电平,若持续为低电平(复位状态),排查复位电路元器件(如复位电阻、电容)是否损坏或焊接错误。
- 验证晶振:用示波器或逻辑分析仪测量晶振引脚(如 OSC_IN、OSC_OUT)是否有周期性时钟信号,排查晶振、匹配电容是否正常。
- 确认程序烧录:检查下载工具(如 ST-Link)是否提示烧录成功,若成功仍不运行,尝试重新烧录或更换程序文件。
- 排查代码/硬件卡死:通过仿真器单步调试,判断是否进入死循环(如while(1)未退出),或硬件外设(如 I2C)存在卡死问题。
16 复位后,main 函数执行之前单片机做什么?
复位后到 main 函数执行前,单片机执行启动代码(汇编编写) ,完成以下初始化操作:
- 复位向量跳转:程序计数器(PC)跳转到中断向量表中的复位向量地址,指向启动代码入口。
- 堆栈指针初始化:设置栈指针(SP)指向栈区起始地址,为函数调用、局部变量分配空间做准备。
- 系统时钟初始化:配置 PLL、HSE、HSI 等时钟源,设置系统主频(如 STM32 默认从 HSI 启动,主频 8MHz)。
- 数据段初始化:将 Flash 中的初始化数据(如全局初始化变量)复制到 RAM 对应区域。
- BSS 段初始化:将未初始化的全局变量、静态变量清零。
- C 库初始化:初始化 C 库内部数据结构(如 malloc 堆区),为 C 语言程序运行提供环境。
- 跳转至 main 函数:完成上述操作后,通过
bl main指令跳转到 main 函数执行。
17 看门狗的作用,底层是怎么执行的?
- 作用:防止 MCU 因程序死循环、跑飞导致系统卡死,保障系统稳定性。
- 底层执行原理:
- 核心组件:一个自动递增的计数器(看门狗计数器)和预设的超时阈值。
- 工作流程:
- 系统启动后,看门狗计数器开始自动递增。
- 程序需在计数器达到超时阈值前,通过“喂狗”操作(写入特定寄存器)重置计数器。
- 若程序卡死(未及时喂狗),计数器溢出,触发中断(可选)或强制系统复位,恢复正常运行。
- STM32 看门狗类型:独立看门狗(IWDG,由低速时钟 LSI 驱动,不受主时钟影响)、窗口看门狗(WWDG,由 APB1 时钟驱动,精度更高)。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐
所有评论(0)