嵌入式面试提问

嵌入式面试问题

1.讲一下STM32的时钟系统

  现总结下:首先是时钟源输入时钟信号到单片机,然后单片机对输入的时钟信号进行倍频和分频处理,再将处理后的时钟信号输出至系统,外设或外部接口。
  先看这张图,最外面的线上的方格是时钟相关的外部接口,OSC接口用于连接外部石英晶振时钟电路,最下面的接口用于内部时钟信号的输出。如图所示:
在这里插入图片描述

图 1 STM32外部时钟接口图

  然后我们介绍时钟源输入,单片机需要通过其产生的时钟信号来控制电路工作。最常见的时钟电路有RC和OSC两种时钟电路。RC时钟精度低且体积小,OSC正好相反。因此单片机往往内置RC时钟,若需要更高精度则需要外界OSC时钟。
  我们现在对时钟电路进行逐个分析:先介绍RC电路,如图所示,上面写了8MHz,HSI,RC。分别表示了时钟频率,时钟类型(高速内部时钟),RC表示电阻电容震荡器时钟电路。如图所示:
在这里插入图片描述

图2 内部时钟图

  在看第二个,由此可知,时钟频率的范围是4-16MHz,它的类型是外部的高速石英晶振时钟。第三个,时钟类型LSE就是低速石英晶振时钟,频率是32.768KHz。第四个,时钟类型是内部的低速阻容时钟,频率为40KHz。如图所示:
在这里插入图片描述

图3 外部时钟图

  我们继续看时钟系统手册,绿色竖着的梯形结构是选择器开关。他的作用是:在多个时钟输入的同时,选择一个作为输出。宽边的为输入时钟信号部分,窄边的为选择后的输出信号。然后介绍黄色框线标注的部分为预分频器,它的作用是用于将输入的时钟信号进行分频输出。接着介绍红色框线部分,它是倍频器,起作用是完成倍频功能,将输入的时钟源进行倍频输出。最后看蓝色框线标注的部分,它是数字信号电路里的与门。用来控制时钟信号的导通与否。默认为了降低功耗为关闭状态,即控制端为低电平,当需要使用外设时,会通过程序让其下端也就是控制端处于高电平,使上端的时钟信号导通。时钟系统图如下:
在这里插入图片描述

图4 时钟系统结构介绍图

  接下来介绍时钟系统的线路连接,从图中我们可以看到,内部高速阻容时钟输出一共有三个部分,第一个是提供给flash编程接口,第二个是通过系统时钟的选择器到达系统时钟。第三个是想通过二分频之后,通过锁相环的选择器进入锁相环。外部高速石英晶振时钟有四个输出,第一个是直接通过系统时钟的选择器到达系统时钟。第二个是通过第一个选择器之后再通过橙色的这条线到达锁相环,第三个是二分频之后通过选择器再通过橙色的这条路线到达锁相环。第四个是经过128分配之后至实时时钟。外部低速石英晶振时钟,它只有一个,就是直接输出至实时时钟。内部的低速阻容时钟,它有两条输出路线,第一个是直接到达实时时钟,直接输出至独立看门狗。如图所示:
在这里插入图片描述

图5 时钟线路图

  然后我们讲下重点锁相环,来看锁相环的输入及输出。首先锁相环的第一个输入是内部的高速时钟二分频之后输入到锁相环,即红色最下面那一条线,第二个输入是外部高速时钟,即蓝色的第二条再通过棕色那条,第三个输入是外部高速时钟二分频,即蓝色的第三条,那条除以2的再经过棕色那条。它的输出主要有两部分,第一部分是预分频后至USB接口,也就是上面的那条黄色路线。第二部分是直接到达系统时钟,即下面的那条黄色路线。示意图如下:
在这里插入图片描述

图6 倍频器示意图

  接着来讲系统时钟的输入输出,首先系统时钟的额输入部分有三种选择,第一是内部高速时钟,即红色的第二条线。第二是倍频器,即黄色的下面那条线。第三个输入是外部高速时钟,即蓝色的第一条线。它的输出有三个部分,第一个是IIS2,也就是集成电路内置的音频总线。第二是IIS3,第三个是AHB总线的预分频器。最后讲下主时钟输出,它的输入有四个部分,第一个是倍频器,第二个是内部高速时钟,第三个是内部高速时钟,第四个是系统时钟。主时钟的输出只有一个就是外部接口。上述示意图如下:
在这里插入图片描述

图7 主时钟即系统时钟示意图

  这样子就理清了时钟主体部分及主体路线的作用。

2.C语言中堆和栈的区别

  堆栈和内存的共同特点就是空间都是在内存上,也就说都是在ram上。

  1. 堆是一个动态的概念,栈是一个静态的概念。
  2. 栈是在编译的时候确定的,堆是在运行的时候确定的。
  3. 栈的大小在编译的时候就已经定好了,堆的大小有可能是一个动态变化的概念,取决于程序运行计算到那一步的具体的数据。一般都是根据使用需求来选择堆或者栈。
  4. 从访问效率上来说,因为堆是动态的,栈是静态的,所以堆的速度要慢。
  5. 再看另外一个特点就是访问权限方面,栈在访问权限上面的特点如下,一个函数的调用,访问的数据都是在栈上的。这个函数调用以后,它栈上的数据无法被另一个函数访问。简单来说就是不同函数之间的栈数据不能共享,这个原则也适用于多线程。堆是不一样的,堆是在程序进程中的堆,只要在这个进程上,所有的线程都可以访问这个堆上的数据。堆上的数据申请访问之后,在不同的语言下,可能处理的环境也是不一样的。
  6. 然后说下使用堆和使用栈的环境条件,当你对于上次的数据不确定,那就用堆而不知栈,但你确定的话,由于效率的问题,肯定要用栈,因为他会极大的提高你的运行速度,如果使用的是特别庞大的内存,一般不去用栈而是用堆,因为用完了要赶快释放掉。

3.GPIO的输出方式

  输出的方式由控制器和两个MOS管组成,这两个mos管一个为Nmos,一个为Pmos,根据两个mos管的开关情况来设置输出模式。

  1. 推挽输出:IO口高电平时,电流输出,IO口低电平时,电流流进
  2. 开漏输出:Q1一直关闭,根据Q2改变IO的电压,接一个上拉电阻,当Q2关闭时,为高阻态,外接接口就可以被上拉到目标电压。

4.单片机上电之后不运行

  1. 先检查电源电压的问题,用万用表测量接地引脚和电源引脚之间的电压。
  2. 检查复位引脚电压是否正常。测一下按下和松开复位按键的电压值。
  3. 检查晶振是否起震,用示波器看晶振引脚的波形。
  4. 如果电源不稳定的话,可以在电源引脚和接地引脚之间接一个0.1uf的电容改善一下。

5.举例你用过的单片机和主要参数

  这里我就以我用过的STM32单片机为例,

STM32C8T6的参数

  1. 是一个基于ARM Cortex—M3内核的32位微控制器
  2. 程序存储容量是64KB,需要电压2V-3.6V,工作温度为-40°-85°。
  3. 37个GPIO
  4. 2个12bitADC合计12路通道,外部通道:PA0-PA7+PB0-PB1,内部通道:温度传感器通道,内部参考电压通道。
  5. 4个定时器,其中TM1带死区(死区就是在上半桥关断后,延迟一段时间再打开下半桥或在下半桥关断后,延迟一段时间再打开上半桥,从而避免功率元件烧毁。这段延迟时间就是死区。)插入,常用于PWM控制电机。
  6. 通信窗口:两个IIC,两个SPI,3个USART,一个CAN
  7. 系统时钟,内部时钟最高可倍频到64MHz,外部时钟最高可倍频到72MHz。

STM32F407VET6的参数

  1. 基于ARN Cortex—M4内核的323位微控制器
  2. 存储容量512KB闪存,192KBSRAM,
  3. 12位精度,16通道ADC
  4. 3个IIC,3个SPI,3个USART,1个CAN
  5. 外部晶振最高180MHz

6.一个温度传感器按照正确的使用方式和参数指标对人体测量温度后一直都是35°这是为什么

  因为该温度传感模块测出的温度为表⾯温度,⽽实际上表⾯温度和实际体温是有差距的。

7.结构体,联合体和sizeof方面的知识

  1. 结构体:结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。关于其struct声明的位置,也就是这段代码要放到哪里。同样这也是具有作用域的。这种声明如果放在任何函数的外面,那么则可选标记可以在本文件中,该声明的后面的所有函数都可以使用。如果这种声明在某个函数的内部,则它的标记只能在内部使用,并且在其声明之后。
  2. 联合体:在同一个内存空间中存储不同的数据类型。联合体内数据是按地址对齐的。具体是高位数据还是低位数据要看平台的大小端模式,51是大端,stm32默认是小端,如果其他编译器还请自测。仅仅用了一条减法指令就达到了除法、取余的操作,联合体的应用范围非常广泛,可以用于优化内存使用、处理二进制数据等,在进行高频率定时时尤为有用。但是只能同时访问联合体中的一个成员。
  3. sizeof:sizeof是C语言中保留关键字,也可以认为是一种运算符,单目运算符。sizeof实际上是获取了数据在内存中所占用的存储空间,以字节为单位来计数。

8.C语言考察功底的相关例子

博客园的C语言功底测试问题
宏的一些用法和注意事项

9.STM32中断处理流程

  先中断初始化,然后CPU正常运行程序,产生中断,处理中断内的程序,继续检查中断。具体的介绍这个文章可以看看:具体介绍中断异常和处理过程

10.486有几根线

  RS485通信系统通常采用三根线,分别为信号线,地线和电源线。信号线由两根线组成,分别用于发送和接收数据;地线由一根线组成,主要用于接地和接入外部电源;电源线由一根线组成,主要用于接入外部电源,以给接收器提供电源。

11.串口和并口的区别

这篇文章写的很详细串口和并口的区别

12.传感器上输出引脚是高阻抗好还是低阻抗好

高阻抗好。

  1. 传感器的输出引脚采用高阻抗设计,可以减小对传感器的负载,同时也有利于减小电源消耗,提高系统的灵敏度和精度。
  2. 在设计传感器输出电路时,需要根据具体的应用场景和系统需求进行综合考虑,权衡高阻抗和低阻抗的优缺点,选择合适的方案。

13.C语言头文件的工作原理

  1. 预处理阶段:编译器以C文件作为一 个单元,首先读这个C文件,发现第一句与第二句是包含一个头文件,就会在所有搜索路径中寻找这两个文件;
    补充一个知识点:
    #include <>格式:引用标准库头文件,编译器从标准库目录开始搜索;
    #include ""格式:引用非标准库的头文件,编译器从用户的工作目录开始搜索.
  2. 找到之后,就会将相应头文件中再去处理宏,变量, 函数声明,嵌套的头文件包含等,检测依赖关系,进行宏替换,看是否有重复定义与声明的情况发生,最后将那些文件中所有的东东全部扫描进这个当前的C文件 中,形成一个中间“C文件”;
  3. 编译阶段 :在上一步中相当于将那个头文件中的test变量扫描进了一个中间C文件,那么test变量就变成了这个文件中的一个全局变量,此时就将所有这个中间C文件的所有变量,函数分配空间,将各个函数编译成二进制码,按照特 定目标文件格式生成目标文件,在这种格式的目标文件中进行各个全局变量,函数的符号描述,将这些二进制码按照一定的标准组织成一个目标文件;
  4. 连接阶段 :将上一步成生的各个目标文件,根据一些参数,连接生成最终的可 执行文件,主要的工作就是重定位各个目标文件的函数,变量等,相当于将这个目标文件中的二进制码按一定的规范合到一个文件中再回到C文件与头文件各写什么内容的话题上:理论上来说C文件与头文件里的内容,只要是C语言所支持的,无论写什么都可以的,比如你在头文件中写函数体,只要在任何一个C文件包含此头文件就可以将这个函数编译成目标文件的一部分;

14.C语言指针的简单介绍

  指针是一种单纯的数据类型,本质上指针变量和普通变量没什么区别,指针变量一般用来存储地址,&为取地址操作符,*为取值操作符。

15.正确理解关键字CONST

  首先最常用的就是使用const来修饰一个变量,通过const之后,这个变量的值在初始化后就不会再被改变。

16.CAN总线介绍

  CAN(Controller Area Network),要进行CAN通讯需要专门的CAN收发芯片,单片机与CAN收发芯片进行数据通讯时,普通的高低电平信号,就会被转化为差分信号。差分信号具有抗干扰作用。CAN传输的一帧数据里面,首先是起始位,然后是启示码(用来识别信息发送对象),然后是远程请求或者数据帧的类型,一个是1一个是0,接下来6位是控制码(用于控制数据长度),接下来是16位CRC码(用于确保数据的准确性),然后是两位ACK码,最后是7位结束位。

17.什么是SPI,什么是IIC,什么是UART

  IIC是飞利浦公司开发的一种两线式串行,半双工同步通信总线,可以挂载多个参与通信的器件,常用于板内通信,比如单片机与外围芯片之间短距离,低速的信号传输。IIC有两条线,一条SCL时钟线用于同步,一条SDA数据线用于传输数据。
  IIC通信的一般流程如下:

  1. 主机发送起始位并进行从机寻址
  2. 得到应答后主机开始发送/读取数据位
  3. 数据发送/读取完成,主机发送停止位结束此次通信
      SPI是串行外围设备接口,是一种高速、全双工、同步通信总线,常用于单片机和EEPROM,FLASH,实时时钟,数字信号处理器等器件的通信,它主要是主从方式通信,通常只有一个主机和数个从机。标准SPI有四根线,分别为SCLK:时钟信号,由主机产生,MOSI:主机给从机发送指令或数据的通道,MISO:主机读取从机的状态或数据的通道,CS:从机片选使能信号。
      UART是通用异步收发器,是一种通用串行、异步通信总线,该总线有两条数据线,可以实现全双工的发送和接收,常用于单片机与单片机或外部辅助设备之间的通信。 UART在发送数据时先发送低位后发送高位,当总线处于空闲状态时,线路保持高电平,发送数据时,会先发送一个0.然后依次从低位到高位发送八位数据。八位数据传输完成后会发送一个1.下面说说UART应用的场景,RS232 9针串行接口,一般用于计算机和单片机之间的通信。USB转串口,这个是目前计算机和单片机之间的通信,还有一些控制器中,主辅控制芯片中也会利用UART通信协议进行信号传输。整体来说,UART多用于板间通信。

18.自己的职业规划

这个就根据自己的实际状况来准备。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/646671.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三篇【传奇开心果短博文系列】鸿蒙开发技术点案例示例:添加页面和页面路由

传奇开心果短博文系列 系列短博文目录鸿蒙开发技术点案例示例短博文系列 短博文目录一、前言二、编写第一个页面Index.ets 示例代码三、编写第二个页面Second.ets示例代码四、第一个页面Index.ets 跳转到第二个页面Second.ets 示例代码五、第二个页面Scond.ets返回第一个页面In…

[C#]winform部署yolov7+CRNN实现车牌颜色识别车牌号检测识别

【官方框架地址】 https://github.com/WongKinYiu/yolov7.git 【框架介绍】 Yolov7是一种目标检测算法&#xff0c;全称You Only Look Once version 7。它是继Yolov3和Yolov4之后的又一重要成果&#xff0c;是目标检测领域的一个重要里程碑。 Yolov7在算法结构上继承了其前…

HTML标签(二)

目录 表格标签 表格的主要作用 表格的具体用法 表头单元格标签 表格属性 表格结构标签 合并单元格 合并单元格的方式&#xff1a; 跨行合并&#xff1a; 跨列合并&#xff1a; 列表标签 无序列表 有序列表 自定义列表 表单标签 表单域 表单域的常用属性 表单元素…

如何使用labelme上次的标记结果继续制作图像的标签

众所周知&#xff0c;labelme 软件可以对图像进行标签的制作&#xff0c;本文就来讲解一下如何根据labelme上次的标记结果&#xff0c;继续对图像的标签进行制作。 首先&#xff0c;确保创建的虚拟环境中已经安装了labelme软件&#xff0c;关于labelme的安装在此我就不赘述了&…

[极客大挑战 2019]LoveSQL1

万能密码测试&#xff0c;发现注入点 注意这里#要使用url编码才能正常注入 测试列数&#xff0c;得三列 查看table&#xff0c;一个是geekuser另一个是l0ve1ysq1 查看column&#xff0c;有id&#xff0c;username&#xff0c;password&#xff0c;全部打印出来&#xff0c;…

【医学图像数据增强】切割-拼接(CS-DA)

切割-拼接CS-DA CS-DA 核心思想自然图像和医学图像之间的关键差异CS-DA 步骤确定增强后的数据数量 代码复现 CS-DA 核心思想 论文链接&#xff1a;https://arxiv.org/ftp/arxiv/papers/2210/2210.09099.pdf 大多数用于医学分割的数据增强技术最初是在自然图像上开发的&#x…

如何实现动态代理(俩种方式)

文章目录 基于接口的动态代理&#xff1a;基于类的动态代理&#xff1a; 基于接口的动态代理&#xff1a; 通过Java的反射机制来动态创建代理对象&#xff0c;代理对象实现了一个或多个接口。 Java提供了java.lang.reflect包中的Proxy类和InvocationHandler接口来实现基于接口…

ORM-06-jooq 入门介绍

拓展阅读 The jdbc pool for java.(java 手写 jdbc 数据库连接池实现) The simple mybatis.&#xff08;手写简易版 mybatis&#xff09; JOOQ JOOQ 可以通过数据库直接生成 java 代码&#xff0c;通过 flent-api 进行数据库操作。 SQL builder JOOQ 非常的灵活和强大。你可…

加载服务端发送的模型文件_unity开发进阶

加载服务端发送的模型文件 前言一、服务端搭建二、unity请求文件三、加载模型结语 前言 之前我们学习制作的都是离线状态下的东西&#xff0c;今天我们学习制作一个小demo。 内容就是我们用unity请求后台&#xff0c;接受后台发送过来的模型&#xff0c;然后将模型加载到场景中…

0125-2-Vue深入学习1—mustache模板引擎原理

[mustache] 是 “胡子”的意思&#xff0c;因为它的嵌入标记 {{ }} 旋转过来很像[胡子]&#xff0c;Vue中的 {{ }} 语法也引用了mustache&#xff0c;这也是我深入学习的目的。 1、原始js方式使 数据 变为视图 <ul id"list"></ul><script>var arr …

k8s---安全机制

k8s的安全机制&#xff0c;分布式集群管理工具&#xff0c;就是容器编排。安全机制的核心&#xff1a;APIserver。为整个集群内部通信的中介&#xff0c;也是外控控制的入口。所有的机制都是围绕apiserver来进行设计&#xff1a; 请求api资源&#xff1a; 1、认证 2、鉴权 …

快速上手的AI工具-文心一言绘本创作

前言 大家好晚上好&#xff0c;现在AI技术的发展&#xff0c;它已经渗透到我们生活的各个层面。对于普通人来说&#xff0c;理解并有效利用AI技术不仅能增强个人竞争力&#xff0c;还能在日常生活中带来便利。无论是提高工作效率&#xff0c;还是优化日常任务&#xff0c;AI工具…

js计算皮尔逊相关系数

代码如下; let XGX {correlationCoefficient(pA, pB) {let covXY -pA * pBlet varX pA * (1-pA) let varY (1-pB)* pBlet res covXY / (Math.sqrt(varX*varY, 2))return res},correlation(x,y){x[0.3,50.2,99.5,199.3,299,398];y[0.1,50,99.9,200,300,400];// 计算均值con…

Linux操作系统概念

绪论​&#xff1a; “心灵纯洁的人&#xff0c;生活充满甜蜜和喜悦。——列夫托尔斯泰”&#xff0c;本章的主要内容是介绍了硬件的组成结构冯诺依曼体系结构以及操作系统的概念和操作系统的作用&#xff0c;本章的内容主要是理论他起到承上启下的作用只有理解了操作系统的运行…

SAP创建资产号码和分配资产价值

文章目录 1 Creat new asset2 View asset3 Create old asset4 Transfer value5 Summary 1 Creat new asset T-code(AS01) 2 View asset T-CODE : AS03 3 Create old asset T-code(as91) 4 Transfer value T-code(ABLDT) If there is following information a…

Typora + PicGo + GitHub搭建图床

Typora PicGo GitHub搭建图床 1. Typora下载破解 这一步自行百度 2. PicGo下载 PicGo is Here | PicGo 自行下载安即可 3. GitHub仓库设置 gitHub注册略过&#xff0c;如果不能访问请科学上网 创建仓库 生成访问token 点击右上角头像 -> setting -> 点击左边最…

Hotspot源码解析-第25章-类的初始化

第25章-类的初始化 这一章主要是讲类的初始化操作&#xff0c;后续类加载章节中也会用到这一章的知识&#xff0c;只不过&#xff0c;这里就讲&#xff0c;是因为虚拟在初始化过程中&#xff0c;需要对基础类&#xff0c;比如System/Thread等类进行初始化操作&#xff0c;所以…

第三季《乐队风暴》全国总决赛圆满落幕

2024年1月21日&#xff0c;由广东珠江、盛娱星汇海选联合主办的第三季《乐队风暴》全国海选歌手赛道全国总决赛在广州罗格镇MUSIC LIVE&#xff08;太古仓店&#xff09;正式打响&#xff0c;第三季《乐队风暴》全国海选开启以来共有超8000人报名渴望登上绚丽舞台&#xff0c;从…

二叉搜索树、二叉排序树(查找、插入和删除)——Java版本

1. 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值它的左右子树也分别…

2024年mongodb自建三节点副本集详细教程

环境说明 系统centos7.9 自建服务器或云服务器&#xff0c;硬件要求不低于2核2G内存&#xff0c;20G硬盘&#xff0c;文件系统默认是ext4即可。 生产环境最好单独一个磁盘存放数据库&#xff0c;方便数据备份和还原&#xff0c;避免干扰到其他磁盘的运作。 mongodb 4.4.27 …