嵌入式面试常见问题(arm平台)(本文持续更新,建议收藏)

常见通信协议有哪些,特点分别是什么?

答:
有usart,i2c,spi,can,usb等等。

UART(Universal Asynchronous Receiver/Transmitter)是一种异步串行通信协议,用于设备间的数据传输。它采用全双工通信(可同时收发),仅需TX(发送)和RX(接收)两根信号线,无需共享时钟信号,依靠预定的波特率实现同步。

关键特性
  1. 异步通信:无公共时钟,依赖固定的波特率(如9600、115200bps)。

  2. 帧格式:每帧包含起始位(低电平)5-9位数据可选的校验位停止位(高电平)

  3. 电平标准

    • TTL电平:+3.3V/+5V表示逻辑1,0V表示逻辑0(直接用于MCU通信)。

    • RS-232:±3~15V表示信号(需电平转换芯片)。

    • RS-485:±1.5~6V差分(A-B>+200mV=1)
  4. 全双工:可同时收发数据。

  5. 无时钟线:需严格匹配波特率,防止误差累积,故不宜长时间连续传输

USART(通用异步/同步收发器)

在UART基础上增加同步模式(带时钟信号CLK),如SPI、I2C,适用于高速通信场景。

应用场景:嵌入式设备、传感器、工业控制、调试接口(如USB转串口)。

I2C(Inter-Integrated Circuit)是一种同步、半双工、串行通信协议,由Philips(现NXP)开发,用于短距离设备间通信。它仅需两根信号线(SCL时钟线 + SDA数据线),支持多主多从架构,广泛用于传感器、EEPROM、显示屏等低速外设。

关键特性
  1. 同步通信:依赖共享时钟(SCL),由主设备控制时序。

  2. 半双工:同一时间只能发送或接收数据。

  3. 多设备总线:支持地址寻址(7位/10位),同一总线可挂载多个从设备(默认上限128个)。

  4. 开漏输出:总线需外接上拉电阻,支持“线与”逻辑,避免冲突。

  5. 速率模式

    • 标准模式(100kbps)

    • 快速模式(400kbps)

    • 高速模式(3.4Mbps)

通信流程
  1. 起始条件(START):SCL高电平时,SDA由高→低。

  2. 地址帧:主设备发送7/10位从机地址 + 1位读写方向(0写,1读)。

  3. 数据帧:每8位数据后跟随1位应答(ACK/NACK)

  4. 停止条件(STOP):SCL高电平时,SDA由低→高。

优缺点
  • 优点:引脚少、支持多设备、硬件简单。

  • 缺点:速率较低、需上拉电阻、地址冲突需避免。

典型应用:温湿度传感器(如SHT30)、OLED屏幕(SSD1306)、RTC时钟(DS3231)等。

SPI(Serial Peripheral Interface)是一种高速、全双工、同步串行通信协议,由Motorola提出,广泛用于MCU与Flash、ADC、显示屏等外设的通信。其采用主从架构,通过4线制(或3线简化版)实现数据交换,以硬件简单、速率高著称。

关键特性

  1. 同步通信:依赖主设备提供的时钟(SCK),速率可达数十MHz(远高于I2C/UART)。

  2. 全双工:可同时发送和接收数据(MOSI + MISO)。

  3. 4线制标准接口

    • SCK(Serial Clock):主设备输出的时钟信号。

    • MOSI(Master Out Slave In):主设备发送数据线。

    • MISO(Master In Slave Out):从设备返回数据线。

    • SS/CS(Slave Select):从设备片选信号(低电平有效)。

    注:3线制可省去MISO或MOSI,实现半双工。

  4. 无寻址机制:通过片选(CS)选择从设备,每增加一个从机需额外占用1个GPIO。

  5. 灵活的数据格式:可配置时钟极性(CPOL)和相位(CPHA),适应不同设备时序。

通信流程

  1. 片选激活:主设备拉低目标从机的CS引脚。

  2. 时钟同步:主设备生成SCK,在上升沿或下降沿采样数据(由CPOL/CPHA决定)。

  3. 数据交换

    • 主设备通过MOSI发送数据,从机通过MISO返回数据(同时进行)。

  4. 片选释放:通信完成后拉高CS

优缺点

优点缺点
速率高(MHz级)引脚占用多(每从机需1个CS)
全双工通信无硬件级冲突检测(依赖软件)
协议简单,无复杂寻址传输距离短(通常<1m)
支持多从机(需多CS引脚)无标准错误校验机制

典型应用场景

  • 高速存储:Flash(W25Q128)、SD卡。

  • 传感器:高精度ADC(ADS131M04)、陀螺仪(MPU6050)。

  • 显示模块:TFT屏(ILI9341)、OLED驱动芯片。

  • 无线通信:RF模块(nRF24L01)、蓝牙芯片。

对比UART/I2C:SPI适合高速、点对点或多从机场景,但功耗和引脚开销较大。



GPIO的几种工作模式?

答:
STM32 的 GPIO(通用输入/输出)支持 8 种工作模式,可配置为 4 种输入模式 + 2 种输出模式 + 2 种复用功能模式,适用于不同应用场景。
1. 输入模式(4 种)
(1) 浮空输入(GPIO_Mode_IN_FLOATING)
  • 特点:引脚悬空(无内部上拉/下拉),电平完全由外部电路决定。
  • 应用:用于读取外部信号(如按键检测、UART RX)。
  • 注意:易受干扰,需外部上/下拉电阻稳定电平。
(2) 上拉输入(GPIO_Mode_IPU)
  • 特点:内部接上拉电阻(默认高电平),外部拉低时读 0。
  • 应用:按键检测(按键接地)、避免悬空干扰。
(3) 下拉输入(GPIO_Mode_IPD)
  • 特点:内部接下拉电阻(默认低电平),外部拉高时读 1。
  • 应用:按键检测(按键接 VCC)、避免悬空干扰。
(4) 模拟输入(GPIO_Mode_AIN)
  • 特点:关闭施密特触发器,直接连接 ADC/DAC,用于模拟信号采集。
  • 应用:ADC 电压检测、DAC 输出。
2. 输出模式(2 种)
(5) 开漏输出(GPIO_Mode_OUT_OD)
  • 特点
    • 只能输出低电平(MOS 管导通)或高阻态(MOS 管关闭)。
    • 输出高电平时需外部上拉电阻。
  • 应用
    • I2C(SDA/SCL 需开漏 + 上拉)。
    • 电平转换(如 3.3V ↔ 5V)。
(6) 推挽输出(GPIO_Mode_OUT_PP)
  • 特点
    • 可输出高电平(PMOS 导通)或低电平(NMOS 导通)。
    • 驱动能力强,无需外部上拉。
  • 应用
    • 驱动 LED、蜂鸣器、SPI(MOSI/SCK)。
    • 高速数字信号(如 PWM)。
3. 复用功能模式(2 种)
(7) 开漏复用输出(GPIO_Mode_AF_OD)
  • 特点
    • 类似开漏输出,但由片上外设(如 I2C、USART)控制。
  • 应用
    • I2C(SDA/SCL)。
    • 部分 USART(TX)。
(8) 推挽复用输出(GPIO_Mode_AF_PP)
  • 特点
    • 类似推挽输出,但由片上外设(如 SPI、PWM)控制。
  • 应用
    • SPI(MOSI/SCK)、USART(TX)。
    • 定时器 PWM 输出。
总结对比
模式
特点
典型应用
IN_FLOATING
悬空输入,易受干扰
UART RX、按键(需外接电阻)
IPU
内部上拉,默认高电平
按键(接地触发)
IPD
内部下拉,默认低电平
按键(接 VCC 触发)
AIN
模拟信号输入
ADC/DAC
OUT_OD
开漏输出,需外接上拉
I2C、电平转换
OUT_PP
推挽输出,驱动能力强
LED、SPI、PWM
AF_OD
外设控制的开漏输出
I2C、USART
AF_PP
外设控制的推挽输出
SPI、PWM、USART
适用场景建议
  • 数字输入:优先选 IPU/IPD(抗干扰)。
  • 模拟信号:必须用 AIN
  • I2C:必须用 AF_OD 或 OUT_OD + 上拉。
  • 高速驱动(SPI/PWM):用 AF_PP 或 OUT_PP

问:既然提到了施密特触发器,说一下吧

答案
单稳态触发器是一种具有一个稳态和一个暂稳态的脉冲整形电路,特点是需要外部触发信号才能翻转,且暂态持续时间由外部RC元件决定,之后自动返回稳态。 

开漏输出和推挽输出的区别和应用场景分别是哪些?

1. 工作原理区别

特性

开漏输出(OD)

推挽输出(PP)

输出结构

仅NMOS管(只能拉低,高电平靠外部上拉)

PMOS + NMOS(可主动拉高或拉低)

高电平输出

高阻态(需外部上拉电阻)

直接输出高电平(VCC)

低电平输出

NMOS导通,拉低到GND

NMOS导通,拉低到GND

驱动能力

依赖外部上拉电阻,电流受限

强驱动(高低电平均可主动输出)

电平转换

支持不同电压设备(如3.3V↔5V)

仅支持相同电压域

总线冲突保护

支持“线与”逻辑(多设备共享总线)

直接短路风险(需避免多设备同时驱动)

2. 典型应用场景

(1)开漏输出的适用场景

  • I2C通信:SDA/SCL线必须开漏 + 上拉,支持多主设备共享总线。

  • 电平转换:连接不同电压设备(如3.3V MCU与5V传感器)。

  • 中断信号:多个设备的中断线可并联(线与逻辑)。

  • 高电压驱动:外部上拉至更高电压(如12V继电器控制)。

(2)推挽输出的适用场景

  • 高速数字信号:SPI、USART(TX)、PWM等需快速切换的场景。

  • 驱动负载:LED、蜂鸣器、电机等需强电流驱动的设备。

  • 单主设备总线:如单向通信的SPI MOSI/SCK线。

3. 关键选择依据

  • 选开漏(OD)

    • 需要多设备共享总线(如I2C)。

    • 需电平转换或高电压输出。

    • 避免总线冲突(线与逻辑)。

  • 选推挽(PP)

    • 需要高速、强驱动能力(如SPI、PWM)。

    • 单主设备控制,无需总线共享。 


说一下你常用的单片机,有什么特点,为什么要使用他,主频是多少?

stm32g431rbt6,最高主频可以达到170mhz,内置3个运算放大器和比较器,具备cordic硬件加速计算,内置刹车输入功能,专门为电机控制设计

是否会计算串口的波特率?

串口通信的波特率决定了每秒传输的比特数(bps),其计算与 时钟源分频系数 相关。STM32 等单片机通常通过 USART 时钟分频 来生成目标波特率。
对于大多数单片机(如STM32),串口波特率的计算公式为:

其中:
  • fUSART_CLKfUSART_CLK​:USART 模块的时钟频率(如 APB 总线时钟)。
  • USARTDIV:分频系数(16位整数 + 小数部分,写入波特率寄存器)。

串口如何接收不定长的数据?

使用串口中断+DMA的方式,串口中断+DMA接收不定长数据的原理是:DMA自动将串口接收的数据搬运到缓冲区,同时使能串口空闲中断;当数据停止传输时触发空闲中断,此时通过DMA传输计数器计算出已接收的数据长度,即可获取完整的不定长数据帧,处理完成后重新初始化DMA继续接收。这种方式既利用DMA减轻CPU负担,又通过空闲中断准确判断帧结束位置。

嵌入式基于ROM运行和基于RAM运行有什么区别?

  1. 存储介质
    • ROM运行:代码直接从只读存储器(如Flash)执行,无需加载到RAM。
    • RAM运行:代码需先拷贝至随机存取存储器(RAM)再执行。
  2. 速度
    • ROM:读取速度较慢(受Flash访问延迟影响),但掉电数据不丢失。
    • RAM:运行速度更快(无等待周期),适合实时性要求高的代码,但掉电后数据消失。
  3. 用途
    • ROM:存储固件、启动代码等永久性内容。
    • RAM:存放运行时变量、堆栈或需频繁修改的代码(如动态加载模块)。
  4. 初始化
    • ROM:上电即执行,无需额外操作。
    • RAM:需通过Bootloader或启动代码将程序从ROM加载至RAM。

说一下stm32boot启动模式有哪些?

  1. 主闪存启动(Main Flash Memory)
    • 配置BOOT0=0BOOT1=X(X表示任意电平)。
    • 启动地址0x0800 0000(Flash存储器的起始地址)。
    • 特点
      • 这是最常见的启动模式,程序存储在内部Flash中,复位后直接从Flash运行。
      • 适用于正常程序运行,支持JTAG/SWD调试和程序烧录156。
  2. 系统存储器启动(System Memory)
    • 配置BOOT0=1BOOT1=0
    • 启动地址0x1FFF 0000(系统存储器的起始地址)。
    • 特点
      • 该模式下运行的是ST预置的BootLoader(ISP程序),通常用于串口(UART)或USB下载程序到Flash。
      • 适用于Flash损坏或需要重新烧录固件的情况,但操作较繁琐(需手动切换BOOT引脚)136。
  3. 内置SRAM启动(Embedded SRAM)
    • 配置BOOT0=1BOOT1=1
    • 启动地址0x2000 0000(SRAM的起始地址)。
    • 特点
      • 程序在RAM中运行,掉电后数据丢失,主要用于调试或快速测试代码。
      • 可减少Flash擦写次数,但需预先通过调试器(如ST-Link)加载程序到SRAM

中断介绍一下

中断是计算机系统中一种重要的机制,指当外部事件(如硬件信号)或内部事件(如程序异常)发生时,暂停当前任务,转而处理该事件,处理完成后恢复原任务的过程。

stm32的启动流程

1. 硬件上电与复位

  • 复位信号:STM32 上电或按下复位键时,硬件复位电路产生低电平复位信号(NRST),CPU 从初始状态开始执行。

  • 时钟初始化:内部高速时钟(HSI)默认启动,作为初始时钟源(后续可切换为外部晶振 HSE/PLL)。


2. 启动模式选择(Bootloader)

STM32 通过 BOOT0/BOOT1 引脚 决定启动位置(复位后采样引脚电平):

BOOT1BOOT0启动模式用途
00主闪存(Flash)正常用户程序
01系统存储器(Bootloader)串口/USB 下载固件
11内置 SRAM调试或临时运行代码

注意:多数应用选择 BOOT0=0,从 Flash 启动。


3. 执行启动文件(Startup File)

从 Flash 启动时,CPU 首先执行预编译的启动文件(如 startup_stm32fxxx.s,汇编编写),关键步骤:

(1) 初始化栈指针(SP)
  • 从 Flash 的 首地址(0x08000000) 读取 MSP(主栈指针)值,赋值给 SP。

  • 该值由链接脚本定义(如 _estack,指向 RAM 末尾)。

(2) 跳转到复位向量
  • 从 Flash 的 第二地址(0x08000004) 读取复位向量(Reset_Handler 函数地址),并跳转执行。

(3) 复位处理函数(Reset_Handler)
  • 初始化 .data 段:将已初始化的全局变量从 Flash 拷贝到 RAM。

  • 清零 .bss 段:将未初始化的全局变量(如 int a;)所在 RAM 区域清零。

  • 调用 SystemInit():配置时钟树(如 PLL 倍频)、FPU(如果启用)。

  • 跳转到 main():最终进入用户程序的 main() 函数。


4. 时钟与硬件初始化(SystemInit())

  • 时钟配置:根据 SystemInit()(通常位于 system_stm32fxxx.c)初始化 HSI/HSE/PLL,设置 SYSCLK。

  • 中断向量表重定位:将中断向量表地址指向 Flash 或 RAM(可选)。

  • 其他外设初始化:如 FPU、电源管理等(依赖芯片型号)。


5. 进入用户程序(main())

完成上述步骤后,CPU 正式执行用户代码


pid讲解下

PID(Proportional-Integral-Derivative)是一种经典的闭环控制算法,通过实时计算误差(目标值与实际值之差)比例(P)、积分(I)、微分(D)三个分量的加权和,生成控制信号,使系统输出快速、稳定地趋近目标值。

单片机最小系统板的组成

STM32的最小系统的硬件组成主要有:电源电路、复位电路、时钟电路、调试接口电路、启动电路。

说一下spi最快通信速率是多少

spi最快通信速率跟外设总线频率有关,一般为外设总线频率/2,比如f103的apb1的外设总线上挂载了spi,其pclk为36mhz,所以f103最快spi速率为18mhz 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值