二、嵌入式面试经验总结

目录

一、嵌入式面试经典30问

1.讲一下stm32的时钟系统

(1) 时钟源

(2)系统时钟树

(3)PLL 配置

(4)时钟安全系统 (CSS)

(5)RTC时钟

(6)时钟配置工具

2.c语言中堆和栈的区别 推挽输出是什么?

3.加入一个单片机上电之后不运行是为什么?

4.举你用过的单片机的型号和它的一些主要参数?

5.一个温度传感器模块按照正确的使用方式和参数指标对人体皮肤测量后得到的温度一直是35℃,这是为什么?

6.一些结构体、联合体、sizeof方面的知识?

7.对c语言功底考察比较深入

8.偏硬件的话会考察电路知识比较多?

9.请说一下51单片机的中断处理流程?

10.485有几根线?

11.串口和并口有什么区别?

12.堆和栈的区别是什么?

13.传感器的输出引脚是高阻抗好还是低阻抗好?

14.局部变量和全局变量分别存放在哪里?

15.c语言头文件的工作原理?

16、潮汐是怎样形成的?

17.精度和分辨率有什么区别?

18.请问你对c语言的指针熟悉吗?

19.解释一下const?

20.讲一下can

21.什么是SPI

22.熟悉IIC吗?

23.会用linux吗?

24.有没有写过状态机?

25.谈一下中断的处理流程是什么样子的?

26.用过什么传感器?

27.怎么选择是用51单片机还是用STM32单片机?

28.如果让我设计一款系统,你会考虑什么?

29.你更喜欢嵌入式软件还是嵌入式硬件?

30.你对自己有什么职业规划?

 

一、嵌入式面试经典30问

STM32系统架构图:

来源b站@AITA_MrFirr

6391bd21e6e444639d74841d0ca901ce.png

四个驱动单元:

  • Cortex-M3的数据总线D-Bus和系统总线S-Bus
  • DMA1、DMA2(两个直接存储器访问单元):在硬件上绕过CPU直接在内存与IO设备之间开辟数据传输通路,从而降低CPU开销,提高效率

四个被动单元:

  • 单片机内存(SRAM)
  • 闪存(FLASH)
  • 可变静态存储控制器(FSMC)
  • AHB2APB的桥,连接的外设(此处只是留出标准接口,常用的片载资源)

驱动单元与被动单元之间通过总线矩阵以及AHB系统总线连接与协调

1.讲一下stm32的时钟系统

答:STM32 的时钟系统是一个复杂但灵活的结构,提供多种时钟源和分频器,以满足不同应用的需求。以下是STM32时钟系统的主要组成部分和工作原理:

(1) 时钟源(心脏)

STM32的时钟系统可以从多种源获取时钟信号,包括:

  • 外部高频晶振 (HSE):高速外部时钟,通常为4MHz到16MHz之间。
  • 外部低频晶振 (LSE):低速外部时钟,通常为32.768kHz,用于RTC(实时时钟)。
  • 内部高速振荡器 (HSI):高速内部时钟,通常为8MHz。
  • 内部低速振荡器 (LSI):低速内部时钟,通常为40kHz,用于独立看门狗和RTC备用。
  • PLL (Phase-Locked Loop):相位锁定环路,可以通过倍频和分频生成各种频率的时钟信号。

(2)系统时钟树(动脉)

STM32的系统时钟树包括多个分频器和开关,以选择和分配时钟信号。主要的时钟树组件包括:

  • 系统时钟 (SYSCLK):整个MCU的主时钟,可以从HSE、HSI或PLL中选择。
  • AHB时钟 (HCLK):高级高速总线的时钟,用于内存、DMA和APB总线的时钟,可以通过分频器从SYSCLK生成。
  • APB时钟 (PCLK1, PCLK2):外设总线的时钟,APB1和APB2有独立的分频器,可以从HCLK生成。
  • USB、SDIO(安全数字输入输出接口如SD卡等)和其他外设时钟:通过PLL生成特定频率的时钟信号。

(3)PLL 配置

PLL可以将输入时钟信号倍频或分频,以生成所需的时钟频率。配置PLL时需要注意以下几点:

  • PLL源:可以选择HSE或HSI作为输入源。
  • 倍频和分频因子:通过设置M、N、P、Q因子来调整输出频率。

(4)时钟安全系统 (CSS)

CSS是一种保护机制,用于检测HSE时钟故障并自动切换到HSI时钟,以确保系统正常运行。

(5)RTC时钟

RTC时钟可以从LSE、LSI或HSE的特定分频信号中选择,用于实时时钟的计时。

(6)时钟配置工具

STM32提供了CubeMX等配置工具,可以通过图形界面方便地配置时钟系统,生成初始化代码。

注:以下图文整理来源于b站up@电光耗子皮卡皮

STM32时钟信号处理流程:

e180e526e4434b21b1fcdc0ec54b92dc.png

128540b28d1040ffa69b9f08a0a33bad.png

 

950c27b498c84f85944950261a73fada.png

c4a8c355a20841d1bdfe9d9848c3e791.png

最常用的时钟系统应用方式:

b1e99507ecd543e3bf85fdc29acff2c6.png

2.c语言中堆和栈的区别 推挽输出是什么?

(1)堆(Heap)


1. 内存分配:堆内存是动态分配的。在运行时,通过函数如 `malloc`、`calloc`、`realloc` 和 `free` 来手动管理内存。
2. 管理方式:程序员负责分配和释放内存。内存块的大小可以动态调整。
3. 存储区域:堆内存通常位于应用程序的高地址区域。
4. 生命周期:堆中的内存块在手动释放前会一直存在,即使在函数返回后也不会被自动释放。
5. 分配效率:堆的内存分配速度较慢,因为需要管理空闲内存和已分配内存块。
6. 碎片化:频繁的分配和释放可能导致内存碎片。

 (2)栈(Stack)


1. 内存分配:栈内存是自动分配的。函数调用时会自动分配和释放局部变量的内存。
2. 管理方式:由编译器自动管理,不需要程序员手动控制。
3. 存储区域:栈内存通常位于应用程序的低地址区域。
4. 生命周期:栈中的变量在其所在的函数返回时会自动释放。
5. 分配效率:栈的内存分配速度快,因为只是简单的指针移动。
6. 碎片化:栈的内存分配是连续的,不会产生碎片。

(3)堆和栈的应用场景

栈:适用于局部变量、函数调用参数、返回地址等短期存储的数据。
堆:适用于需要在函数间共享、生命周期不固定、大小不确定的动态内存块。

(4)推挽输出(Push-Pull Output)

推挽输出是一种常见的数字输出电路设计,主要特点如下:

a. 两种状态:推挽输出可以输出高电平(Vcc)或低电平(GND),这由两个晶体管控制,一个连接到电源,一个连接到地。
b.驱动能力:推挽输出可以源电流(向外输出电流)和吸电流(从外部输入电流),驱动能力较强。
c.应用场景:常用于数字信号传输、LED驱动、蜂鸣器驱动等。

推挽输出的电路图
推挽输出电路通常由两个MOSFET或BJT晶体管组成:
        Vcc
         |
        |\
        |  \
        |    \  (PMOS)
        |      \
        |       \
        |        \
Output--+---------+-----> Output Signal
        |        /
        |       /
        |      /  (NMOS)
        |    /
        |  /
        |/
        GND
推挽输出的特点
速度快:由于两个晶体管可以快速切换,因此推挽输出的响应速度较快。
功耗低:在切换过程中,两个晶体管不会同时导通,因此功耗相对较低。

总结:堆和栈是C语言中两种不同的内存管理方式,分别适用于不同的应用场景。推挽输出是一种常见的数字输出模式,具有较强的驱动能力和快速响应特性,广泛应用于电子电路设计中。

3.假如一个单片机上电之后不运行是为什么?

  • 检查电源:确认电源电压稳定并符合要求。
  • 检查复位电路:确保复位电路设计正确。
  • 检查时钟源:确认时钟源工作正常。
  • 检查程序:确保程序正确并已成功下载到单片机中。
  • 检查外设和GPIO配置:确认外设和GPIO引脚配置无误。
  • 检查看门狗:确认看门狗配置和喂狗操作正确。
  • 检查硬件连接:检查所有焊接点和连接是否正确。

4.举你用过的单片机的型号和它的一些主要参数?

STM32F103C8T6 是 STMicroelectronics 生产的一款基于 ARM Cortex-M3 内核的微控制器,属于 STM32F1 系列。以下是其一些主要参数:

(1) 内核

  • 内核类型:ARM Cortex-M3
  • 主频:72 MHz
  • 处理器架构:32-bit

(2) 存储器

  • Flash 存储:64 KB
  • SRAM:20 KB

(3)外设接口

  • 通用输入输出 (GPIO):37 个
  • 定时器
    • 3 个通用 16 位定时器
    • 1 个高级控制定时器(16 位)
    • 2 个看门狗定时器(独立看门狗和窗口看门狗)
    • 1 个 SysTick 定时器
  • 通信接口
    • 2 个 I2C 接口
    • 3 个 USART 接口
    • 2 个 SPI 接口
    • 1 个 CAN 接口
    • 1 个 USB 2.0 全速接口

(4)模数转换 (ADC)

  • ADC 通道:2 个 12-bit ADC(最多 16 个通道)
  • 采样速度:最高 1 MHz

(5)数模转换 (DAC)

  • 无内置 DAC

(6)时钟和电源

  • 电源电压:2.0V 至 3.6V
  • 低功耗模式
    • 睡眠模式
    • 停止模式
    • 待机模式

(7)封装

  • 封装类型:LQFP48
  • 引脚数量:48 个

(8)工作温度

  • 温度范围:-40°C 至 +85°C

5.一个温度传感器模块按照正确的使用方式和参数指标对人体皮肤测量后得到的温度一直是35℃,这是为什么?

(1)接触不良或安装问题

  • 原因:传感器与皮肤的接触不良,可能导致测量结果不准确。
  • 解决方法:确保传感器与皮肤紧密接触,可以使用导热膏等提高接触效果。检查传感器安装在正确位置。

(2)环境温度影响

  • 原因:测量环境的温度接近35℃,传感器可能受到环境温度的影响。
  • 解决方法:确保测量环境温度与预期一致,避免环境温度对测量的影响。在一个受控的环境中进行测量。

(3)传感器校准

  • 原因:传感器可能没有经过正确的校准,导致测量结果不准确。
  • 解决方法:根据厂家提供的校准方法对传感器进行校准。校准后再次进行测量。

(4)传感器类型和响应时间

  • 原因:传感器的类型和响应时间可能导致测量结果恒定。
  • 解决方法:了解传感器的响应时间,确保在测量前给传感器足够的时间稳定。如果响应时间过长,考虑更换响应速度更快的传感器。

(5) 传感器故障

  • 原因:传感器本身可能存在故障或损坏,导致测量结果恒定在某一温度。
  • 解决方法:使用其他传感器进行对比测量,排除传感器故障的可能。如果故障,需更换传感器。

(6)程序代码错误

  • 原因:程序代码中可能存在错误,导致测量数据处理不正确。
  • 解决方法:检查并验证程序代码,确保数据采集和处理逻辑正确。使用已知温度的环境进行验证。

(7)电路和信号处理问题

  • 原因:传感器电路可能存在问题,导致信号传输和处理不正确。
  • 解决方法:检查电路连接和放大器、电源等电路部分。确保电路设计和连接正确。

(8) 传感器精度和分辨率

  • 原因:传感器的精度和分辨率有限,可能无法精确测量小范围内的温度变化。
  • 解决方法:确认传感器的精度和分辨率是否满足测量需求。如果不足,考虑更换精度和分辨率更高的传感器。

6.一些结构体、联合体、sizeof方面的知识?

(1)结构体

结构体是一种用户定义的数据类型,用于将不同类型的数据组合在一起。结构体的每个成员都有自己的内存地址,并且可以单独访问。

(2)联合体

联合体是一种特殊的数据类型,允许将不同类型的数据存储在同一个内存位置。联合体的所有成员共享同一块内存,因此任何时候只能存储一个成员的值。

(3)sizeof 操作符

sizeof 是一个编译时操作符,用于计算数据类型或变量的大小(以字节为单位)。

7.对c语言功底考察比较深入

8.偏硬件的话会考察电路知识比较多?

9.请说一下51单片机的中断处理流程?

f6082d826d624a56b7d7aa32062c64d6.png

51单片机(如Intel 8051系列)的中断处理流程包括以下几个步骤:

(1)中断源触发

  • 外部中断:由外部硬件引脚(如INT0和INT1)触发。
  • 定时器中断:由内部定时器(如T0和T1)溢出触发。
  • 串行中断:由串行通信的接收或发送完成触发。
  • 其他中断:如ADC转换完成等。

(2)中断请求

当中断源触发时,相应的中断请求信号被置位,通知CPU有中断请求。

(3)中断优先级判断

51单片机具有两级中断优先级:

  • 高优先级:优先处理高优先级的中断请求。
  • 低优先级:在没有高优先级中断的情况下处理低优先级中断请求。

中断优先级由中断优先级寄存器(IP)控制。

(4)中断屏蔽判断

检查中断使能寄存器(IE),判断当前中断是否被允许:

  • 全局中断使能位(EA):当EA=1时,允许中断;EA=0时,禁止所有中断。
  • 单独中断使能位:对应具体中断源的使能位。

(5)中断响应

如果中断被允许且满足优先级要求,CPU会:

  • 完成当前指令:当前指令执行完成后,CPU暂停主程序的执行。
  • 保存现场:将当前程序计数器(PC)值压入堆栈,以便中断服务程序结束后能返回主程序继续执行。

(6)跳转到中断向量表

51单片机中断向量表地址如下:

  • 外部中断0(INT0):0x0003
  • 定时器0中断(TF0):0x000B
  • 外部中断1(INT1):0x0013
  • 定时器1中断(TF1):0x001B
  • 串行中断(RI/TI):0x0023

CPU跳转到对应的中断服务程序(ISR)地址。

(7) 执行中断服务程序(ISR)

在中断服务程序中,处理相应的中断事件,如清除中断标志位,执行中断处理逻辑等。

(8) 中断服务程序结束

中断服务程序执行完毕后,通过RETI指令返回主程序:

  • 恢复现场:从堆栈中弹出保存的程序计数器(PC)值,恢复主程序的执行。
  • 继续主程序:返回主程序的中断点,继续执行主程序。

10.485有几根线?

  1. A (D+) - 差分信号线之一
  2. B (D-) - 差分信号线之二
  3. GND (Ground) - 地线,用于提供参考电压(可选)

因此,RS-485总线通常至少有两根差分信号线,如果包括地线则总共有三根线。

11.串口和并口有什么区别?

(1)串口(Serial Port)

  1. 数据传输方式:串行传输,数据一位一位地顺序传输。
  2. 线缆和引脚:通常使用较少的线缆和引脚(例如RS-232通常有9个引脚)。
  3. 速度:串口传输速度较慢,但可以支持较长距离的通信。
  4. 应用:常用于外设设备,如鼠标、调制解调器、传感器等。
  5. 连接形式:一般是点对点连接(例如计算机与外设之间)。

(2)并口(Parallel Port)

  1. 数据传输方式:并行传输,数据多位同时传输(通常是8位或更多)。
  2. 线缆和引脚:使用较多的线缆和引脚(例如标准的并行口有25个引脚)。
  3. 速度:并口传输速度较快,但传输距离较短。
  4. 应用:常用于打印机、扫描仪等设备。
  5. 连接形式:可以是点对点或点对多点连接(例如计算机与多台设备之间)。

(3)小结

  • 串口适用于需要长距离通信且数据传输速率要求不高的应用。
  • 并口适用于需要高数据传输速率且距离较短的应用。

串口因其简单性和长距离传输能力,仍然在许多工业和嵌入式应用中得到广泛使用,而并口由于其高速度特性,曾广泛用于PC外设连接,但现在已逐渐被USB等更先进的接口取代

12.堆和栈的区别是什么?

参考问题2

13.传感器的输出引脚是高阻抗好还是低阻抗好?

(1)高阻抗输出

  • 优点

    1. 信号源驱动能力弱:适合连接到高输入阻抗的放大器或模拟数字转换器(ADC),减少电流消耗。
    2. 低功耗:高阻抗状态下的电流较小,有利于降低功耗。
    3. 减少负载效应:对外部电路的负载影响较小,适合长距离信号传输。
  • 缺点

    1. 抗干扰能力差:容易受到外部噪声和干扰的影响。
    2. 驱动能力弱:无法直接驱动低阻抗负载,可能需要后续放大电路。

(2)低阻抗输出

  • 优点

    1. 抗干扰能力强:对噪声和干扰不敏感,信号更稳定。
    2. 驱动能力强:可以直接驱动低阻抗负载,如LED、继电器等。
  • 缺点

    1. 信号源驱动能力强:对驱动电路要求较高,可能会增加功耗。
    2. 负载效应明显:对后续电路的阻抗要求较高,可能引入负载效应。

(3)具体应用考虑

  • 模拟信号传感器:通常具有高阻抗输出,因为模拟信号处理电路(如运算放大器、ADC)通常具有高输入阻抗。
  • 数字信号传感器:可以具有低阻抗输出,因为数字电路的输入阻抗相对较低,且低阻抗输出有助于信号完整性和抗干扰能力。

(4)小结

  • 高阻抗输出:适用于低功耗、长距离传输以及需要与高阻抗输入电路(如ADC)配合的应用。
  • 低阻抗输出:适用于需要高抗干扰能力和强驱动能力的应用。

选择传感器输出阻抗时,需根据具体电路设计和应用场景综合考虑。

14.局部变量和全局变量分别存放在哪里?

(1)局部变量

  1. 存储位置:局部变量通常存储在栈(Stack)内存中。
  2. 生命周期:局部变量的生命周期与其所在的作用域相同,当程序执行到定义局部变量的函数或代码块时,局部变量被创建并分配内存;当函数或代码块执行结束后,局部变量的内存被自动释放。
  3. 特点:局部变量只能在其定义的函数或代码块内访问,作用域有限,变量名可以在不同的函数或代码块中重复使用而互不干扰。

(2)全局变量

  1. 存储位置:全局变量通常存储在静态数据区(Data Segment)中,这个区域又分为已初始化数据区(.data)和未初始化数据区(.bss)。
    • 已初始化数据区(.data):存放已初始化的全局变量。
    • 未初始化数据区(.bss):存放未初始化的全局变量,程序开始运行时,这些变量会被初始化为0。
  2. 生命周期:全局变量的生命周期贯穿程序的整个运行过程,从程序开始执行到程序结束。
  3. 特点:全局变量在整个程序中都可以访问,作用域是整个程序,使用不当可能导致命名冲突或难以追踪的错误。

(3)总结

  • 局部变量存储在栈内存中,生命周期短,作用域限于定义它们的函数或代码块。
  • 全局变量存储在静态数据区,生命周期贯穿程序运行全过程,作用域是整个程序。

15.c语言头文件的工作原理?

(1)头文件的主要作用

  1. 函数原型声明:提供函数的原型声明,使得在多个源文件中调用这些函数时,编译器可以知道函数的参数类型和返回值类型。
  2. 宏定义:使用#define指令定义常量和宏,方便代码的复用和维护。
  3. 结构体和类型定义:定义结构体、枚举和其他类型,以便在多个源文件中使用相同的定义。
  4. 外部变量声明:使用extern关键字声明全局变量,使得这些变量可以在其他源文件中访问。

(2)头文件的工作原理

  1. 预处理器指令:C语言的预处理器指令#include用于包含头文件的内容。例如,#include <stdio.h>会将标准输入输出库的头文件stdio.h的内容插入到源文件中。
    • #include <filename>:用于包含标准库头文件或系统头文件,编译器会在系统指定的目录中查找。
    • #include "filename":用于包含用户自定义的头文件,编译器会先在当前目录查找,然后再在系统目录中查找。
  2. 头文件保护:为了防止头文件被多次包含引起的重复定义错误,通常使用头文件保护机制,使用预处理器指令#ifndef#define#endif

16、潮汐是怎样形成的?

 

17.精度和分辨率有什么区别?

(1)精度(Accuracy)

  1. 定义:精度是指测量值与真实值之间的接近程度,即测量结果的准确性。
  2. 衡量标准:通常用误差(测量值与真实值的差异)来衡量。精度高的系统,测量误差小。
  3. 影响因素
    • 系统误差:测量系统固有的偏差,例如仪器校准不当。
    • 随机误差:由于环境、操作等因素引起的随机波动。
  4. 表达方式:常用绝对误差(如±0.1V)或相对误差(如测量值的±1%)来表示。

(2)分辨率(Resolution)

  1. 定义:分辨率是指测量系统能够区分的最小变化量,即系统能识别的最小增量。
  2. 衡量标准:通常用测量范围内最小可检测变化量来衡量。分辨率高的系统,能检测到更微小的变化。
  3. 影响因素
    • 传感器或仪器的设计:如AD转换器的位数。
    • 噪声水平:噪声过大会降低系统的有效分辨率。
  4. 表达方式:常用最小可测量单位(如0.01V)来表示。

(3)对比总结

  • 精度强调测量结果的正确性,即测量值与真实值的吻合程度。它受系统误差和随机误差的影响。
  • 分辨率强调测量系统的灵敏度,即能识别的最小变化。它决定了测量系统的最小测量单位。

开放性问题:

18.请问你对c语言的指针熟悉吗?

指针是一个变量,用于存储另一个变量的内存地址

19.解释一下const?

在C语言中,const关键字用于声明一个变量为常量,表示该变量的值在初始化之后不能被改变。使用const可以增强代码的可读性和可靠性。以下是对const的详细解释和使用方法:

(1)基本概念

  • 声明:使用const关键字声明的变量是常量,试图修改其值会导致编译错误。

    const int a = 10;

(2)使用场景

  1. 常量变量

    • 定义:用const声明的变量的值在初始化后不可改变。

      const int MAX_SIZE = 100;

    • 用途:通常用于定义不可变的常量值,确保在程序的不同部分中使用相同的值。
  2. 指向常量的指针

    • 定义:指针本身可以改变,但指针指向的值不能修改。

      const int* p;

    • int value = 10; const int* p = &value; // *p = 20; // 错误,不能修改指针p指向的值

  3. 常量指针

    • 定义:指针本身的地址不可变,但可以修改指针指向的值。
      int* const p;
      
    • 示例

      int value1 = 10; int value2 = 20; int* const p = &value1; *p = 30; // 合法,修改指针p指向的值 // p = &value2; // 错误,不能修改指针p的地址

  4. 常量指针指向常量

    • 定义:指针和指针指向的值都不可改变。

      const int* const p;

    • 示例

      int value = 10; const int* const p = &value; // *p = 20; // 错误,不能修改指针p指向的值 // p = &value2; // 错误,不能修改指针p的地址

  5. 常量参数

    • 定义:函数参数声明为const,可以确保函数内部不会修改传递给它的数据。

      void printValue(const int* p);

    • 示例

      void printValue(const int* p) { printf("%d\n", *p); // *p = 20; // 错误,不能修改参数p指向的值 }

  • const常量:用来声明在程序中不会改变的变量值。
  • 指向常量的指针:允许指针指向一个常量,但不允许通过指针修改常量的值。
  • 常量指针:指针的值(地址)不可变,但可以修改指针指向的数据。
  • 常量指针指向常量:指针和指针指向的数据都不可变。

20.讲一下can

CAN(Controller Area Network)是一种用于汽车和工业自动化的串行通信协议,具备以下特点:

  1. 高可靠性

    • 错误检测与重发:内建错误检测机制(如CRC)和自动重发功能确保数据的准确性。
  2. 实时性

    • 优先级机制:支持消息优先级,确保重要数据优先传输。
  3. 多主机通信

    • 广播式总线:所有节点共享同一通信总线,支持多主机通信模式。
  4. 数据帧

    • 数据长度:CAN 2.0支持0到8字节数据帧;CAN FD支持最多64字节数据。
  5. 物理层

    • 差分信号:使用差分信号提高抗干扰能力。

版本

  • CAN 2.0:包括标准帧(11位标识符)和扩展帧(29位标识符)。
  • CAN FD:支持更高数据速率和更大数据负载(64字节)。

应用领域

  • 汽车:发动机控制、刹车系统、车身控制。
  • 工业自动化:PLC、传感器、执行器。
  • 医疗设备:监护仪、诊断设备。
  • 建筑自动化:照明、空调、安防系统。

21.什么是SPI

SPI(Serial Peripheral Interface)是一种同步串行通信协议,用于微控制器和外围设备之间的数据交换。SPI由摩托罗拉(Motorola)在1980年代开发,广泛应用于各种嵌入式系统中。

(1)SPI的基本特点

  1. 同步通信

    • 数据在时钟信号的控制下进行传输,发送和接收操作同步进行。
  2. 全双工

    • SPI协议支持全双工通信,即数据可以同时在两个方向上传输。
  3. 主从架构

    • 主设备(Master):负责生成时钟信号并控制数据传输。
    • 从设备(Slave):响应主设备的命令,进行数据交换。
  4. 多设备支持

    • 可以通过选择不同的从设备(通常通过片选信号)来实现与多个从设备的通信。

(2)SPI的主要信号线

  1. SCLK(Serial Clock)

    • 主设备生成的时钟信号,用于同步数据传输。
  2. MOSI(Master Out Slave In)

    • 主设备向从设备发送数据的信号线。
  3. MISO(Master In Slave Out)

    • 从设备向主设备发送数据的信号线。
  4. SS(Slave Select)

    • 用于选择特定的从设备,确保数据传输只发生在选定的从设备上。

(3)数据传输模式

  • 时钟极性(CPOL):时钟信号的空闲状态(高或低)。
  • 时钟相位(CPHA):数据采样和数据变化的时机(时钟的上升沿或下降沿)。

SPI协议有4种基本的数据传输模式,取决于时钟极性和时钟相位的配置。

优点

  1. 高速传输:SPI支持高数据传输速率,适合需要快速数据交换的应用。
  2. 简单协议:实现相对简单,不需要复杂的协议解析。
  3. 全双工通信:允许同时进行数据的发送和接收。

缺点

  1. 引脚数量多:每个从设备需要一个片选信号,增加了硬件连接的复杂度。
  2. 无硬件协议:SPI没有如I2C那样的硬件协议处理机制,通信控制由软件处理。

(4)应用场景

  • 存储器:如SPI闪存、EEPROM。
  • 传感器:如温湿度传感器、加速度计。
  • 显示器:如液晶显示器、OLED显示屏。

SPI是一种灵活、高效的串行通信协议,广泛应用于嵌入式系统中,用于各种外设的通信和数据交换。

22.熟悉IIC吗?

I2C是一种同步串行通信协议,用于微控制器和各种外围设备之间的数据交换。I2C由飞利浦(Philips,现为NXP)在1980年代开发,广泛用于嵌入式系统中。

(1)I2C的基本特点

  1. 同步通信

    • 数据在时钟信号的控制下进行传输,确保发送和接收操作同步进行。
  2. 半双工通信

    • 数据只能在一个方向上传输,虽然可以通过控制信号来交换数据,但发送和接收不能同时进行。
  3. 主从架构

    • 主设备(Master):控制通信,生成时钟信号,并发起数据传输。
    • 从设备(Slave):响应主设备的命令,进行数据交换。
  4. 多设备支持

    • 地址机制:通过7位或10位地址来区分不同的从设备,每个从设备在总线上有一个唯一的地址。

(2)I2C的主要信号线

  1. SCL(Serial Clock Line)

    • 主设备生成的时钟信号,用于同步数据传输。
  2. SDA(Serial Data Line)

    • 数据线,用于传输数据。数据在时钟信号的上升沿或下降沿时被采样。

(3)数据传输

  1. 起始条件(Start Condition)

    • 由主设备发出,表示数据传输的开始。
  2. 地址传输

    • 主设备发送从设备地址,并指示读/写操作。
  3. 数据传输

    • 数据在SDA线上传输,由主设备或从设备发送。
  4. 应答(Acknowledge)

    • 每个字节传输后,从设备发送应答信号(ACK)给主设备,表示成功接收到数据。
  5. 停止条件(Stop Condition)

    • 由主设备发出,表示数据传输的结束。

优点:

  1. 简化连接:使用两根信号线(SCL和SDA)可以连接多个设备,节省了引脚和布线空间。
  2. 支持多主机:支持多主机系统(主设备可以有多个)。
  3. 灵活的设备地址:允许多个设备通过地址区分。

缺点:

  1. 速度较慢:相比于SPI,I2C的传输速率较低(标准模式为100 kHz,高速模式为400 kHz,超高速模式可达3.4 MHz)。
  2. 总线负载限制:I2C总线的负载能力有限,过多设备可能影响信号质量。

(4)应用场景

  • 传感器:如温湿度传感器、加速度计。
  • EEPROM:外部存储器的数据读取和写入。
  • 实时钟表:如RTC(实时时钟)模块。
  • 显示器:如LCD、OLED显示屏的控制。

I2C是一种简单、低成本的通信协议,适合用于中低速、低复杂度的应用场景,广泛应用于各种嵌入式系统中。

23.会用linux吗?

24.有没有写过状态机?

25.谈一下中断的处理流程是什么样子的?

  • 中断事件发生

    • 外部或内部事件触发中断请求。例如,外部设备发起中断、定时器超时、I/O操作完成等。
  • 中断请求(IRQ)

    • 中断源产生一个中断请求信号,这个信号通知处理器需要中断服务。
  • 中断响应

    • 处理器检测到中断请求信号,并暂停当前正在执行的任务,准备执行中断服务程序(ISR)。
  • 保存上下文

    • 处理器保存当前任务的状态(上下文),包括程序计数器(PC)、寄存器值等,以便中断服务完成后可以恢复到中断发生前的状态。
  • 中断向量

    • 处理器根据中断请求信号查询中断向量表,确定对应的中断服务程序(ISR)的地址。
  • 执行中断服务程序(ISR)

    • 处理器跳转到ISR的地址并执行中断服务程序。ISR负责处理中断请求,完成相关任务,如读取数据、设置标志、清除中断请求等。
  • 中断标志清除

    • ISR完成后,通常需要清除中断标志位或中断请求信号,通知系统中断已处理完毕。
  • 恢复上下文

    • 处理器恢复之前保存的上下文,将程序计数器(PC)和寄存器值恢复到中断发生前的状态。
  • 恢复任务执行

    • 处理器继续执行中断之前的任务或程序。

26.用过什么传感器?

补充自己用的

27.怎么选择是用51单片机还是用STM32单片机?

(1)性能需求

  • 51单片机

    • 处理能力:51单片机通常具有较低的处理能力和有限的存储资源。适合简单的控制任务和低速数据处理。
    • 时钟频率:一般为12 MHz至40 MHz。
  • STM32单片机

    • 处理能力:STM32单片机具有更高的处理能力和更大的存储资源。适合复杂的计算和高性能应用。
    • 时钟频率:范围广泛,通常从48 MHz到180 MHz,甚至更高。

(2) 内存和存储

  • 51单片机

    • 内存:通常具有较小的RAM和Flash存储(例如,64 KB Flash和2 KB RAM)。
    • 存储:适用于简单的应用场景。
  • STM32单片机

    • 内存:提供更多的RAM和Flash存储(例如,256 KB Flash和64 KB RAM,具体型号不同)。
    • 存储:适用于需要更多存储和复杂功能的应用。

(3)外设和接口

  • 51单片机

    • 外设:外设功能较为基础,如串口、定时器、PWM等。
    • 接口:通常支持基础的I/O接口。
  • STM32单片机

    • 外设:支持丰富的外设和接口,如UART、SPI、I2C、CAN、USB、DAC、ADC、GPIO等。
    • 接口:支持多种高级接口和外设,适合复杂的应用需求。

(4)开发环境和工具

  • 51单片机

    • 开发环境:开发工具较为简单,例如Keil、SDCC等。
    • 编程语言:通常使用C语言或汇编语言。
  • STM32单片机

    • 开发环境:支持现代化的开发工具和环境,如STM32CubeIDE、IAR Embedded Workbench、Keil等。
    • 编程语言:支持C/C++语言,且有丰富的库和中间件支持。

(5) 成本和可用性

  • 51单片机

    • 成本:一般较低,适用于预算有限的项目。
    • 可用性:广泛应用于低成本和高产量的产品。
  • STM32单片机

    • 成本:可能稍高,但性能和功能更强大。
    • 可用性:有多种型号和规格可供选择,满足不同需求。

(6)开发时间和复杂性

  • 51单片机

    • 开发时间:适合简单应用的快速开发,开发周期较短。
    • 复杂性:较低,适用于入门级或基础项目。
  • STM32单片机

    • 开发时间:功能强大,但可能需要更多的学习和调试时间。
    • 复杂性:高,适用于复杂应用和系统级开发。

(7)总结

  • 选择51单片机:如果你的项目需求简单,处理能力要求低,预算有限,且开发周期短,可以选择51单片机。
  • 选择STM32单片机:如果你的项目需要高性能、大存储容量、多种外设和接口,且对开发工具和支持有较高要求,可以选择STM32单片机。

根据项目的具体需求,综合考虑性能、存储、外设、开发环境、成本和开发时间等因素,来决定使用51单片机还是STM32单片机。

28.如果让你设计一款系统,你会考虑什么?

(1)需求分析

  • 功能需求:明确系统需要实现的功能,满足用户需求和业务目标。
  • 非功能需求:考虑系统的性能、可靠性、可扩展性、安全性等方面的要求。

(2) 系统架构

  • 总体设计:确定系统的整体架构,包括模块划分、接口设计和数据流动。
  • 技术选型:选择合适的硬件平台、处理器、通信协议和开发工具。

(3)硬件设计

  • 硬件平台:选择适当的微控制器(如51单片机或STM32)、传感器、外设和其他组件。
  • 电路设计:设计电路图、布局PCB板,考虑电源管理、信号完整性等因素。
  • 接口与连接:设计系统接口,包括电源、通信、输入输出等接口。

(4) 软件设计

  • 系统架构:设计软件架构,包括操作系统、驱动程序、应用层、用户界面等。
  • 编程语言和框架:选择适当的编程语言(如C/C++)、框架和库来实现系统功能。
  • 中断和任务管理:设计中断处理、任务调度和资源管理,确保系统实时性和稳定性。

(5)数据管理

  • 数据采集和处理:设计数据采集、存储、处理和传输方案。
  • 数据库设计:如果需要存储大量数据,设计数据库结构和管理方案。

(6) 用户界面

  • 设计用户界面:设计友好的用户界面,考虑用户体验和操作便捷性。
  • 显示和输入:选择合适的显示器(如LCD、OLED)和输入方式(如按钮、触摸屏)。

(7) 系统测试

  • 功能测试:验证系统的各项功能是否符合设计要求。
  • 性能测试:测试系统在不同负载和条件下的性能表现。
  • 可靠性测试:检查系统的稳定性和故障恢复能力。
  • 用户测试:进行用户验收测试,确保系统满足用户需求。

(8)安全性

  • 数据安全:保护数据的隐私和完整性,使用加密和认证机制。
  • 系统安全:防止系统被恶意攻击,采取安全措施和策略。

(9) 维护与升级

  • 系统维护:设计系统的维护策略,包括远程升级、故障排除和维护文档。
  • 扩展性:考虑未来功能扩展和系统升级的需求。

(10)成本和时间

  • 预算控制:在设计过程中控制成本,包括硬件、软件和开发费用。
  • 时间管理:制定详细的开发计划和时间表,确保项目按时完成。

29.你更喜欢嵌入式软件还是嵌入式硬件?(区别)

(1)嵌入式硬件工程师

职责

  • 硬件设计:负责设计和开发嵌入式系统的硬件部分,包括电路板、微控制器(MCU)、外设和接口等。
  • 电路图和PCB设计:绘制电路图,设计印刷电路板(PCB),确保硬件能够稳定工作。
  • 硬件调试:测试和调试硬件组件,解决硬件问题,优化电路设计。
  • 硬件与软件接口:设计硬件接口和通信协议,确保硬件与软件能够有效地交互。
  • 选择组件:选择合适的电子元件(如传感器、执行器、连接器等),并考虑其性能和兼容性。

技能和知识

  • 电路设计:深入了解模拟电路和数字电路设计。
  • PCB布局:熟悉PCB设计工具和技术,如Altium Designer、KiCad等。
  • 电气工程:具备电气工程基础,了解电源管理、信号完整性等。
  • 硬件测试:使用示波器、逻辑分析仪等工具进行硬件测试和故障排查。

工具和平台

  • 硬件设计工具:如Altium Designer、Cadence、KiCad等。
  • 测试设备:示波器、逻辑分析仪、万用表等。

(2)嵌入式软件工程师

职责

  • 软件开发:负责开发和实现嵌入式系统的固件和应用程序,包括操作系统、驱动程序和用户应用程序。
  • 系统集成:将软件与硬件进行集成,确保系统功能的实现和优化。
  • 编程:使用编程语言(如C、C++、汇编语言)编写软件代码。
  • 调试和优化:调试嵌入式软件,优化性能,解决软件中的问题。
  • 接口实现:开发和实现与硬件的接口,处理数据采集、控制信号等功能。

技能和知识

  • 编程语言:熟悉C、C++、汇编语言等嵌入式编程语言。
  • 实时操作系统(RTOS):了解RTOS的使用,如FreeRTOS、uC/OS等。
  • 软件工具:掌握调试工具和开发环境,如Keil、IAR Embedded Workbench、Eclipse等。
  • 协议和接口:了解通信协议(如UART、SPI、I2C、CAN等)和接口设计。

工具和平台

  • 开发环境:Keil、IAR Embedded Workbench、Eclipse等。
  • 调试工具:调试器、仿真器、逻辑分析仪等。

总结

  • 嵌入式硬件工程师:专注于硬件设计、开发和测试,包括电路设计、PCB布局、电气工程等方面。
  • 嵌入式软件工程师:专注于软件开发、调试和系统集成,包括编程、操作系统使用、软件优化等方面。

30.你对自己有什么职业规划?(模板)

在嵌入式系统领域,我的职业规划包括短期、中期和长期目标。

短期内,我计划进一步提升在嵌入式系统开发中的技能,特别是在STM32平台和实时操作系统(RTOS)的应用。我希望通过参与更具挑战性的项目,积累实际经验,并获得相关的技术认证。此外,我还计划学习新兴技术,如物联网(IoT)和智能硬件,以丰富我的技术背景。

中期来看,我希望在嵌入式系统领域成为专家,尤其是在系统架构或高效能设计方面。我也希望能够担任技术团队的领导,提升项目管理和团队协作能力。同时,我计划积极参与行业会议,分享我的技术成果和观点。

长期目标是担任战略性技术职位,如技术总监或首席工程师,参与公司技术战略的制定和创新。我也考虑创业,开发新产品或技术,推动行业发展。无论在哪个阶段,我都会持续学习和成长,保持对新技术的敏感性,并在技术社区中贡献我的经验和知识。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值