当前位置: 首页 > news >正文

嵌入式工程师面试准备(客观题准备)

Q:1.为什么flash的起始地址是0x0800 0000?

A:ARM Cortex-M3 M4 M7等微控制器通常遵循一个通用的内存映射,其中0x0800 0000被定义为内部闪存的起始地址,这是ARM的推荐规范,所以许多制造商都遵循这一标准。
2.设置为相同的 可以方便软件开发和维护,
微控制器在上电或复位后,bootloader通常从固定地址开始执行代码。
但是也并不是所有的微控制器都使用这个地址,对于有不同内存映射的 还是需要根据手册来获取准确的内存映射信息。

Q:2.STM32 bootloader通用执行流程是什么?

1.启动模式选择
2.硬件初始化
3.通信接口初始化
4.协议处理
5.固件更新操作
6.跳转到用户程序
STM32有三种启动模式:主闪存存储器,系统存储器(内置bootloader)和内置SRAM。
用户通过BOOT引脚配置启动模式,当选择系统存储器启动时,芯片会执行内置的Bootloader程序

1,上电后或者发生复位后,bootloader会从预定义的复位向量地址开始执行代码,对于STM32,这个地址通常是0x0800 0000。
2.bootloader初始化代码中,首先会执行系统初始化代码。包括
配置时钟系统(HSE、HSI、PLL)以设置所需的系统时钟。
初始化堆栈指针。
配置必要的GPIO和外设
执行一些基本的内存清理操作。

bootloader 执行特定的硬件测试
跳转到应用程序代码

Q:3.8080并口协议的工作原理 和 IIC SPI的工作原理 区别

8080 并行接口是 早期的计算机总线接口标准,是INTEL 为其8080微处理器设计的总线接口,
常见于微控制器与外围设备(LCD显示屏)通信的协议。
包括 数据线 D0-D17 具体用哪几个信号线需要看配置
控制信号 D/CX RDX WRX CSX RESX

8080-I 8080-II的主要区别在于数据线通信时占据的数据位8080-I优先使用的是低8位,8080-II优先使用的是高8位。

使用过最熟悉的支持8080接口协议的就是ILI9341 TFT显示芯片,就以此为例 展开介绍写写,做个部分总结:
9341是一个单芯片控制驱动器,具有262144色的240RGB320像素解决方案,组成包括一个720通道的源极驱动器,一个320通道的栅极驱动器,172800字节用于图形显示的GRAM,以及供电电路。
看起上上面很简单的一段话 还是有一些内涵的。 比如262144色的定义如何来的?为什么是172800字节的GRAM大小?又为什么包含720通道的源极驱动器?
下面给简单解释下:
1.RGB颜色模型,通过组合不同强度 R、G、B三种基本色来形成各种不同的颜色。26万色通道用18bit的颜色深度来表示每个像素的颜色,所以RGB三基色分别用6位二进制表示,所以每种基色组合可表达的状态有2^6种,总颜色数量等于 2^6*2^6*2^6=2^18=262144色组合。
2.物理尺寸显示大小为240
320像素点 每个像素点需要的bit数为18位来表示一个像素点上的颜色种类,所以总共需要24032018个bit的数据大小=1382400bit,转换为字节的单位就是172800的GRAM了。
3.至于720通道的源极驱动器,同样和RGB颜色模型有关,为了显示一个完整的彩色像素,需要控制RGB三种基本色,从而需要分别控制RGB三个子像素的亮度,而物理层面上源级驱动器可以为每个子像素提供精确的驱动电压,从而控制子像素产生的亮度,对应子像素的数据表示。
所以物理层面上也会需要DAC将RGB的色值通过数值转换为模拟电压,从而产生对应的驱动电压。

ili9341 240RGB*320
所以默认240是列 320是行

像液晶屏的调试 需要先找到出厂设置的物理零点。
以9341为例,0x36h寄存器地址存放的是帧存储器的读写扫描方向。设置寄存器为默认值全0 即可判断出帧存储器的读写行列方向,以及彩色模型BGR还是RGB,这里说一下,V1.09版本以前的英文数据手册,关于RGB-BGR有一处错误,是0 = BGR 1 = RGB
因为位参数也是写的BGR,测试后发现的。

难点或者复杂点:

根据项目需求,参考手册上的说明,完成各种过程函数的实现(面向对象里面就可以称呼为方法了),debug,并做成库

IIC
物理层

双线制:SDA SCL 所有连接在总线上的设备都通过这两条线进行通信 开漏输出 开漏输出智能将信号拉低,不能拉高,便于多设备共享总线而不发生电平冲突。多主多从架构,设备上可以有多主多从设备

链路层:

START SCL为高电平,SDA由高电平向低电平的跳变 指示为START信号
STOP SCL为高电平,SDA由低电平向高电平的跳变指示为STOP信号

速率

标准模式 100kHz
快速模式 400KHz
高速模式 3-4MHz 具体需要看设备支持 这里只只是总线的特性。

地址帧:START 信号后 主设备发送一个7bit或10bit的从设备地址,以及一个读写位,总线上的所有设备都会接收这个地址和自己地址比对,比对结果一致的,返回ACK表示响应。
数据帧:地址匹配成功后,开始发送数据,每个字节传输完成后,接收方会发送一个应答位来表示是否成功接收。
SPI
物理层

四线制:CS SCL MOSI MISO 单主多从架构,主设备控制始终信号和从设备的选择,从设备根据主设备的控制进行数据收发
工作模式
由CPOL和CPHA决定 组合可以产生四种工作模式
CPOL 指定SPI总线空闲时的电平状态 CPOL = 0 总线空闲低电平 CPOL = 1 总线空闲高电平
CPHA 指定数据在SCK的第一边沿或第二个边沿采样 CPHA=0 第一个边沿采样 CPHA=1第二个边沿采样
由上述定义
CPOL =0 CPHA = 0:空闲低电平 第一个上升沿采样 下降沿发送
CPOL =0 CPHA = 1:空闲低电平 第二个下降沿采样 上升沿发送

链路层

数据是按照bit传输 数据传输速率由SCK频率定义。也受控于主控芯片最高频率。

速率

低速情况下:几百KHz和几MHz之间
高速情况下 几十MHz-100MHz 也存在

Q:经典PID控制算法 如何使实际值慢慢接近目标值?

我们整定参数应该如何整定

Q:数组和链表的区别?

A:数组和链表是两种常见的数据结构。它们在存储和操作数据上有显著的区别。
1.存储方式
数组:数组在内存中是连续存储的。,且定义时需要指定大小,通常是固定的 所有元素在内存中占据一块连续的空间。
链表:链表中的元素在内存中是可以分散存储的,每个元素(节点)包含数据和指向下一个节点的指针。链表的大小是动态的,可以随时增加和减小节点。
2.操作数据
访问:
数组:数据是连续存储的,可以通过索引直接访问任意元素,时间复杂度为O(1)。
链表:链表必须从头节点开始遍历,直到找到目标节点,时间复杂度为O(n)。
插入和删除
数组:
在数组中插入或删除元素需要异动大量的元素,时间复杂度O(n);
链表:在链表中插入或删除元素只需调整指针,时间复杂度为O(1);
3.使用效率上:
数组:数组的内存使用效率较高,因为只有数据本身占用空间。由于连续存储的特性,对缓存的利用较好,访问速度通常较快。
链表:链表每个节点除了数据外还需要额外的空间存储指针,因此内存使用效率较低。链表的节点在内存中分散存储,对缓存的利用较差,访问速度通常较慢。
所以对于数组和链表的使用要注意应用场景,数组适合快速访问和固定大小的场景,链表适合频繁插入和删除操作的动态大小场景。

应用:创建单向链表 ,双向链表 , 环形队列 并定义相关方法

Q:单片机上电后不能正常启动 可能是哪些原因造成的?如何排查?
Q:简述一下FSMC总线和它的应用?

A:FSMC,灵活静态存储控制器,顾名思义该总线主要用于控制不同类型的静态存储器,如(SRAM、NOR Flash、NAND Flash、PSRAM(伪静态)),FSMC提供了一系列的控制信号和数据线,能够模拟不同存储器的读写时序,从而实现对外部存储器的高效访问。

特点:支持不同的存储器类型和数据宽度,可以根据实际需求选择合适的存储器进行扩展。可以是8 16 32数据总线宽度。
时序可编程:FSMC的读写时序可以通过寄存器进行编程配置,能够根据不同存储器的速度特性调整读写时序参数,如地址建立时间、数据保持时间,从而实现与各种不同速度的存储器的匹配。

多存储块管理:FSMC将外部存储器空间划分为多个存储块,每个存储块可以独立配置和管理,允许同时连接多个不同类型的存储器,提高系统的扩展性和灵活性

以STM32为例,


http://www.mrgr.cn/news/90151.html

相关文章:

  • 软件测试面试题
  • Vivado IP之浮点数Floating-point
  • 字符串高频算法:无重复字符的最长子串
  • a16z 最新 Voice AI 报告:语音将成为关键切入点,而非最终产品本身丨 Voice AI 学习笔记
  • 5G技术解析:从核心概念到关键技术
  • 大模型推理——MLA实现方案
  • 示例代码:C# MQTTS双向认证(客户端)(服务器EMQX)
  • 【清晰教程】通过Docker为本地DeepSeek-r1部署WebUI界面
  • Mac(m1)本地部署deepseek-R1模型
  • QT实现多线程的方法
  • 使用EVE-NG-锐捷实现单臂路由
  • openbmc web/redfish到底层设计(持续更新...)
  • Spring AI 介绍
  • 【操作系统】Linux基本命令
  • Redis | 十大数据类型
  • Ubuntu 下 nginx-1.24.0 源码分析 ngx_tm_t 类型
  • 旋转位置编码(RoPE)讲解和代码实现
  • vue动态table 动态表头数据+动态列表数据
  • iOS主要知识点梳理回顾-3-运行时
  • 力扣--链表
  • leetcode 做题思路快查
  • 大语言模型RAG,transformer
  • 【C++】命名空间
  • SqlSugar简单使用之Nuget包封装-Easy.SqlSugar.Core
  • 六、OSG学习笔记-漫游(操作器)
  • windows平台本地部署DeepSeek大模型+Open WebUI网页界面(可以离线使用)