嵌入式面试问题
1.讲一下STM32的时钟系统
现总结下:首先是时钟源输入时钟信号到单片机,然后单片机对输入的时钟信号进行倍频和分频处理,再将处理后的时钟信号输出至系统,外设或外部接口。
先看这张图,最外面的线上的方格是时钟相关的外部接口,OSC接口用于连接外部石英晶振时钟电路,最下面的接口用于内部时钟信号的输出。如图所示:
然后我们介绍时钟源输入,单片机需要通过其产生的时钟信号来控制电路工作。最常见的时钟电路有RC和OSC两种时钟电路。RC时钟精度低且体积小,OSC正好相反。因此单片机往往内置RC时钟,若需要更高精度则需要外界OSC时钟。
我们现在对时钟电路进行逐个分析:先介绍RC电路,如图所示,上面写了8MHz,HSI,RC。分别表示了时钟频率,时钟类型(高速内部时钟),RC表示电阻电容震荡器时钟电路。如图所示:
在看第二个,由此可知,时钟频率的范围是4-16MHz,它的类型是外部的高速石英晶振时钟。第三个,时钟类型LSE就是低速石英晶振时钟,频率是32.768KHz。第四个,时钟类型是内部的低速阻容时钟,频率为40KHz。如图所示:
我们继续看时钟系统手册,绿色竖着的梯形结构是选择器开关。他的作用是:在多个时钟输入的同时,选择一个作为输出。宽边的为输入时钟信号部分,窄边的为选择后的输出信号。然后介绍黄色框线标注的部分为预分频器,它的作用是用于将输入的时钟信号进行分频输出。接着介绍红色框线部分,它是倍频器,起作用是完成倍频功能,将输入的时钟源进行倍频输出。最后看蓝色框线标注的部分,它是数字信号电路里的与门。用来控制时钟信号的导通与否。默认为了降低功耗为关闭状态,即控制端为低电平,当需要使用外设时,会通过程序让其下端也就是控制端处于高电平,使上端的时钟信号导通。时钟系统图如下:
接下来介绍时钟系统的线路连接,从图中我们可以看到,内部高速阻容时钟输出一共有三个部分,第一个是提供给flash编程接口,第二个是通过系统时钟的选择器到达系统时钟。第三个是想通过二分频之后,通过锁相环的选择器进入锁相环。外部高速石英晶振时钟有四个输出,第一个是直接通过系统时钟的选择器到达系统时钟。第二个是通过第一个选择器之后再通过橙色的这条线到达锁相环,第三个是二分频之后通过选择器再通过橙色的这条路线到达锁相环。第四个是经过128分配之后至实时时钟。外部低速石英晶振时钟,它只有一个,就是直接输出至实时时钟。内部的低速阻容时钟,它有两条输出路线,第一个是直接到达实时时钟,直接输出至独立看门狗。如图所示:
然后我们讲下重点锁相环,来看锁相环的输入及输出。首先锁相环的第一个输入是内部的高速时钟二分频之后输入到锁相环,即红色最下面那一条线,第二个输入是外部高速时钟,即蓝色的第二条再通过棕色那条,第三个输入是外部高速时钟二分频,即蓝色的第三条,那条除以2的再经过棕色那条。它的输出主要有两部分,第一部分是预分频后至USB接口,也就是上面的那条黄色路线。第二部分是直接到达系统时钟,即下面的那条黄色路线。示意图如下:
接着来讲系统时钟的输入输出,首先系统时钟的额输入部分有三种选择,第一是内部高速时钟,即红色的第二条线。第二是倍频器,即黄色的下面那条线。第三个输入是外部高速时钟,即蓝色的第一条线。它的输出有三个部分,第一个是IIS2,也就是集成电路内置的音频总线。第二是IIS3,第三个是AHB总线的预分频器。最后讲下主时钟输出,它的输入有四个部分,第一个是倍频器,第二个是内部高速时钟,第三个是内部高速时钟,第四个是系统时钟。主时钟的输出只有一个就是外部接口。上述示意图如下:
这样子就理清了时钟主体部分及主体路线的作用。
2.C语言中堆和栈的区别
堆栈和内存的共同特点就是空间都是在内存上,也就说都是在ram上。
- 堆是一个动态的概念,栈是一个静态的概念。
- 栈是在编译的时候确定的,堆是在运行的时候确定的。
- 栈的大小在编译的时候就已经定好了,堆的大小有可能是一个动态变化的概念,取决于程序运行计算到那一步的具体的数据。一般都是根据使用需求来选择堆或者栈。
- 从访问效率上来说,因为堆是动态的,栈是静态的,所以堆的速度要慢。
- 再看另外一个特点就是访问权限方面,栈在访问权限上面的特点如下,一个函数的调用,访问的数据都是在栈上的。这个函数调用以后,它栈上的数据无法被另一个函数访问。简单来说就是不同函数之间的栈数据不能共享,这个原则也适用于多线程。堆是不一样的,堆是在程序进程中的堆,只要在这个进程上,所有的线程都可以访问这个堆上的数据。堆上的数据申请访问之后,在不同的语言下,可能处理的环境也是不一样的。
- 然后说下使用堆和使用栈的环境条件,当你对于上次的数据不确定,那就用堆而不知栈,但你确定的话,由于效率的问题,肯定要用栈,因为他会极大的提高你的运行速度,如果使用的是特别庞大的内存,一般不去用栈而是用堆,因为用完了要赶快释放掉。
3.GPIO的输出方式
输出的方式由控制器和两个MOS管组成,这两个mos管一个为Nmos,一个为Pmos,根据两个mos管的开关情况来设置输出模式。
- 推挽输出:IO口高电平时,电流输出,IO口低电平时,电流流进
- 开漏输出:Q1一直关闭,根据Q2改变IO的电压,接一个上拉电阻,当Q2关闭时,为高阻态,外接接口就可以被上拉到目标电压。
4.单片机上电之后不运行
- 先检查电源电压的问题,用万用表测量接地引脚和电源引脚之间的电压。
- 检查复位引脚电压是否正常。测一下按下和松开复位按键的电压值。
- 检查晶振是否起震,用示波器看晶振引脚的波形。
- 如果电源不稳定的话,可以在电源引脚和接地引脚之间接一个0.1uf的电容改善一下。
5.举例你用过的单片机和主要参数
这里我就以我用过的STM32单片机为例,
STM32C8T6的参数
- 是一个基于ARM Cortex—M3内核的32位微控制器
- 程序存储容量是64KB,需要电压2V-3.6V,工作温度为-40°-85°。
- 37个GPIO
- 2个12bitADC合计12路通道,外部通道:PA0-PA7+PB0-PB1,内部通道:温度传感器通道,内部参考电压通道。
- 4个定时器,其中TM1带死区(死区就是在上半桥关断后,延迟一段时间再打开下半桥或在下半桥关断后,延迟一段时间再打开上半桥,从而避免功率元件烧毁。这段延迟时间就是死区。)插入,常用于PWM控制电机。
- 通信窗口:两个IIC,两个SPI,3个USART,一个CAN
- 系统时钟,内部时钟最高可倍频到64MHz,外部时钟最高可倍频到72MHz。
STM32F407VET6的参数
- 基于ARN Cortex—M4内核的323位微控制器
- 存储容量512KB闪存,192KBSRAM,
- 12位精度,16通道ADC
- 3个IIC,3个SPI,3个USART,1个CAN
- 外部晶振最高180MHz
6.一个温度传感器按照正确的使用方式和参数指标对人体测量温度后一直都是35°这是为什么
因为该温度传感模块测出的温度为表⾯温度,⽽实际上表⾯温度和实际体温是有差距的。
7.结构体,联合体和sizeof方面的知识
- 结构体:结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。关于其struct声明的位置,也就是这段代码要放到哪里。同样这也是具有作用域的。这种声明如果放在任何函数的外面,那么则可选标记可以在本文件中,该声明的后面的所有函数都可以使用。如果这种声明在某个函数的内部,则它的标记只能在内部使用,并且在其声明之后。
- 联合体:在同一个内存空间中存储不同的数据类型。联合体内数据是按地址对齐的。具体是高位数据还是低位数据要看平台的大小端模式,51是大端,stm32默认是小端,如果其他编译器还请自测。仅仅用了一条减法指令就达到了除法、取余的操作,联合体的应用范围非常广泛,可以用于优化内存使用、处理二进制数据等,在进行高频率定时时尤为有用。但是只能同时访问联合体中的一个成员。
- sizeof:sizeof是C语言中保留关键字,也可以认为是一种运算符,单目运算符。sizeof实际上是获取了数据在内存中所占用的存储空间,以字节为单位来计数。
8.C语言考察功底的相关例子
博客园的C语言功底测试问题
宏的一些用法和注意事项
9.STM32中断处理流程
先中断初始化,然后CPU正常运行程序,产生中断,处理中断内的程序,继续检查中断。具体的介绍这个文章可以看看:具体介绍中断异常和处理过程
10.486有几根线
RS485通信系统通常采用三根线,分别为信号线,地线和电源线。信号线由两根线组成,分别用于发送和接收数据;地线由一根线组成,主要用于接地和接入外部电源;电源线由一根线组成,主要用于接入外部电源,以给接收器提供电源。
11.串口和并口的区别
这篇文章写的很详细串口和并口的区别
12.传感器上输出引脚是高阻抗好还是低阻抗好
高阻抗好。
- 传感器的输出引脚采用高阻抗设计,可以减小对传感器的负载,同时也有利于减小电源消耗,提高系统的灵敏度和精度。
- 在设计传感器输出电路时,需要根据具体的应用场景和系统需求进行综合考虑,权衡高阻抗和低阻抗的优缺点,选择合适的方案。
13.C语言头文件的工作原理
- 预处理阶段:编译器以C文件作为一 个单元,首先读这个C文件,发现第一句与第二句是包含一个头文件,就会在所有搜索路径中寻找这两个文件;
补充一个知识点:
#include <>格式:引用标准库头文件,编译器从标准库目录开始搜索;
#include ""格式:引用非标准库的头文件,编译器从用户的工作目录开始搜索. - 找到之后,就会将相应头文件中再去处理宏,变量, 函数声明,嵌套的头文件包含等,检测依赖关系,进行宏替换,看是否有重复定义与声明的情况发生,最后将那些文件中所有的东东全部扫描进这个当前的C文件 中,形成一个中间“C文件”;
- 编译阶段 :在上一步中相当于将那个头文件中的test变量扫描进了一个中间C文件,那么test变量就变成了这个文件中的一个全局变量,此时就将所有这个中间C文件的所有变量,函数分配空间,将各个函数编译成二进制码,按照特 定目标文件格式生成目标文件,在这种格式的目标文件中进行各个全局变量,函数的符号描述,将这些二进制码按照一定的标准组织成一个目标文件;
- 连接阶段 :将上一步成生的各个目标文件,根据一些参数,连接生成最终的可 执行文件,主要的工作就是重定位各个目标文件的函数,变量等,相当于将这个目标文件中的二进制码按一定的规范合到一个文件中再回到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通信的一般流程如下:文章来源:https://www.toymoban.com/news/detail-821559.html
- 主机发送起始位并进行从机寻址
- 得到应答后主机开始发送/读取数据位
- 数据发送/读取完成,主机发送停止位结束此次通信
SPI是串行外围设备接口,是一种高速、全双工、同步通信总线,常用于单片机和EEPROM,FLASH,实时时钟,数字信号处理器等器件的通信,它主要是主从方式通信,通常只有一个主机和数个从机。标准SPI有四根线,分别为SCLK:时钟信号,由主机产生,MOSI:主机给从机发送指令或数据的通道,MISO:主机读取从机的状态或数据的通道,CS:从机片选使能信号。
UART是通用异步收发器,是一种通用串行、异步通信总线,该总线有两条数据线,可以实现全双工的发送和接收,常用于单片机与单片机或外部辅助设备之间的通信。 UART在发送数据时先发送低位后发送高位,当总线处于空闲状态时,线路保持高电平,发送数据时,会先发送一个0.然后依次从低位到高位发送八位数据。八位数据传输完成后会发送一个1.下面说说UART应用的场景,RS232 9针串行接口,一般用于计算机和单片机之间的通信。USB转串口,这个是目前计算机和单片机之间的通信,还有一些控制器中,主辅控制芯片中也会利用UART通信协议进行信号传输。整体来说,UART多用于板间通信。
18.自己的职业规划
这个就根据自己的实际状况来准备。文章来源地址https://www.toymoban.com/news/detail-821559.html
到了这里,关于嵌入式面试提问的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!