(嵌入式面经)第11章 20+公司面经杂谈(五):Momenta、瑞晟、OPPO
预计2025.03.12,完成优化/完善该内容,敬请期待!!!
(以下为学习过程中的粗略知识点,还未经过优化/完善,后续会变成更有条理的形式!!!)
SPI 通信时序:
• 时钟极性(CPOL)和时钟相位(CPHA):
o CPOL = 0:空闲状态下 SCK 为低电平。
o CPOL = 1:空闲状态下 SCK 为高电平。
o CPHA = 0:数据在时钟的第一个边沿采样。
o CPHA = 1:数据在时钟的第二个边沿采样。
• 数据传输:
o 主设备将数据发送到从设备,同时读取从设备发送回的数据(全双工通信)。
o 数据传输在 SCK 的上升沿或下降沿进行,具体取决于 CPOL 和 CPHA 设置。
SPI 通信程序实现
SPI 通信可以通过使用硬件 SPI 控制器和寄存器来实现,以下是基本步骤:
1. 初始化 SPI:
o 设置 SPI 模式(CPOL 和 CPHA)。
o 配置 SPI 时钟频率。
o 设置数据帧格式(如 8 位、16 位)。
o 配置 SS/CS 信号(通常是 GPIO 控制)。
2. 数据传输:
o 在主设备发送数据前,将 SS/CS 线拉低。
o 写入数据到 SPI 数据寄存器,SPI 控制器会自动生成时钟信号并发送数据。
o 读取 MISO 线上的返回数据。
o 数据传输完成后,将 SS/CS 线拉高。
寄存器配置
以下是一些常见的寄存器配置(以 STM32 为例):
1. SPI_CR1:SPI 控制寄存器 1
o 配置 CPOL 和 CPHA。
o 设置数据帧格式(8 位或 16 位)。
o 选择主设备或从设备模式。
o 设置 SPI 通信的时钟频率。
2. SPI_CR2:SPI 控制寄存器 2
o 配置 SPI 中断、DMA 使能等功能。
3. SPI_SR:SPI 状态寄存器
o 检查传输完成标志位(TXE),用于判断发送完成。
o 检查接收完成标志位(RXNE),用于判断接收完成。
4. SPI_DR:SPI 数据寄存器
o 读写数据时使用。
串口通信常用波特率?波特率是啥意思?
如果选用某个波特率发送指定大小的数据,怎么计算?串口有哪几部分组成?发送和接收通过什么判断已完成?串口按字节发送丢帧怎么办?
一个字符帧发送需要三个部分:起始位+数据帧+停止位。起始位是一个位周期的低电平,位周期就是每一位占用的时间;数据帧就是我们要发送的8位或9位数据,数据是从最低位开始传输的;停止位是一定时间周期的高电平。
停止位时间长短是可以通过USART控制寄存器2(USART_CR2)的STOP[1:0]位控制,可选0.5个、1个、1.5个和2个停止位。默认使用1个停止位。2个停止位适用于正常USART模式、单线模式和调制解调器模式。0.5个和1.5个停止位用于智能卡模式。
当USART_CR1寄存器的发送使能位TE置1时,启动数据发送.
当发送使能位TE置1之后,发送器开始会先发送一个空闲帧(一个数据帧长度的高电平),接下来就可以往USART_DR寄存器写入要发送的数据。在写入最后一个数据后,需要等待USART状态寄存器(USART_SR)的TC位为1,表示数据传输完成,如果USART_CR1寄存器的TCIE位置1,将产生中断。
串口的组成部分
1. 数据寄存器(DR):用于发送和接收数据。
2. 状态寄存器(SR):包含状态标志位,用于指示发送完成、接收完成、溢出错误等。
3. 波特率寄存器(BRR):用于设置波特率。
4. 控制寄存器(CR1, CR2, CR3):配置串口的各种功能,如数据位、停止位、校验位、中断使能等。
发送和接收的完成判断
• 发送完成判断:检查状态寄存器(SR)中的 TXE(传输数据寄存器空)位,如果 TXE 为 1,表示数据已发送完成,可以发送下一字节。
• 接收完成判断:检查状态寄存器(SR)中的 RXNE(接收数据寄存器非空)位,如果 RXNE 为 1,表示接收到新数据,可以读取数据。
处理串口按字节发送丢帧的问题
如果在串口通信中按字节发送数据时出现丢帧问题,可以采取以下措施:
1. 使用 DMA:配置 DMA 进行数据传输,确保数据传输过程中不会因 CPU 忙碌而丢帧。
2. 硬件 FIFO 缓冲区:使用具有硬件 FIFO 缓冲区的串口控制器,可以缓冲多个字节的数据,减少丢帧的风险。
3. 检查溢出错误:在状态寄存器(SR)中监测 ORE(溢出错误)位,如果出现溢出错误,可能需要降低波特率或优化数据处理流程。
9.平时调试用什么方法,除了debug还有什么方法?
10.常用的调试设备是什么?(示波器、万用表)怎么使用?想用示波器精确测量一段方波的幅值和周期应该怎么测量?
常用的调试设备:
示波器: 用于观察信号波形,测量信号的幅值、周期、频率等。
测量方波的幅值和周期: 将探头连接到方波信号源,调节水平(时间)和垂直(电压)刻度,读取波形的幅值和周期。
万用表: 用于测量电压、电流、电阻等基本电参数。
11.常用的数据结构?交叉链表的交叉节点怎么寻找?交叉链表的模样是什么?
12.网络有没有了解过?
13.硬件做过几层板?如果mcu下不进程序,硬件上该怎么调试?
14.结构体内存对其
15.c语言中static、volatile的作用?
16.c语言怎么开辟一块内存和释放此部分内存?
17.c语言给指定的内存存值
18. HandleThread 怎么使用?
19.怎么学习嵌入式的?(在前面问的)
20.想去哪里工作?西安或者深圳?
21.反问
还有一些记不清了,面试50分钟
2.16 中兴微电子
公司背景
深圳市中兴微电子技术有限公司(以下简称“中兴微电子”)于2003年注册成立。作为中国领先的通信IC设计公司,中兴微电子专注于通信网络、智能家庭和行业应用等通信芯片开发,自主研发并成功商用的芯片达到100多种,覆盖通信网络“承载、接入、终端”领域,服务全球160多个国家和地区,连续多年被评为“中国十大集成电路设计企业”
2.17 Oppo
公司背景
问题准备
30min 几乎纯聊天
自我介绍+关心个人背景经历等综合信息+选一个最熟悉的项目讲+遇到的难点和优化点
反问+岗位介绍
岗位用JAVA偏多 安卓开发在逐渐使用kotlin
从底软复筛转岗系统工程师的第二次面试...
岗位:系统工程师
时长:35 min
手撕:无
1. 自我介绍
2. 实习介绍,问了一个不痛不痒的问题
3. 八股,如:Linux的一些命令;继承;复用;重载;头文件重复定义
4. 对安卓的理解
5. 最困难的一门课,如何学习的这门课
6. 用过Java吗(没有,但提前看了一点)
7. 反问
投递底层软件工程师笔试之后被转岗到系统工程师,不知道是不是kpi。
35min偏聊天
自我介绍+主问项目和实习经历+遇到的难点和优化点
反问
无八股 非深挖
岗位用JAVA偏多(我是CPP...)
1、自我介绍
2、问项目中的线程池:怎么判断线程繁忙、管理者线程行为
3、问最新的项目做了什么事情
4、本科那个智能专业都学啥
八股:
CPP/计算机网络/数据库/操作系统拷打一遍
1、从浏览器输入网址后发生了
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
作者简介:仅用大半年时间0基础天坑急转嵌入式开发,逆袭成功拿下华为、vivo、小米等15个offer,面试经验60+,收藏20+面经,分享自己的求职历程与学习心得。 专栏内容:最新求职与学习经验,详细讲解了嵌入式开发的学习路径、项目经验分享、简历优化技巧、面试心得及实习经验,从测评,笔试,技术面,HR面,AI面,主管面,谈薪一站式服务,助你突破技术瓶颈、打破信息差,争取更多大厂offer。