嵌入式软件开发岗面试题

1、单片机IO口开漏输出和推挽输出有什么区别?

 答:

开漏输出:开漏输出只能输出低电平,如果要输出高电平必须通过上拉电阻才能实现。就类似于三极管的集电极输出。

推挽输出:推挽输出既可以输出低电平,也可以输出高电平,可以直接驱动功耗不大的数字器件。导通损耗小、效率高、既提高电路的负载能力,又提高开关速度。

2、单片机里定时器有什么作用和优势?

答:

作用:计数器、延时、输入捕获(解码和测量时间间隔)、输出比较(主要输出PWM波)、单脉冲输出、触发中断(对其他模块进行操作)

优势:不需要CPU参与,精确

3、什么是Nyquist采样定理?如果需要通过512点FFT分析200-10KHz信号频谱,频谱分辨率不低于40Hz,此时采样频率需在什么范围?

答:

频率分辨率可以理解为在使用DFT时,在频率轴上的所能得到的最小频率间隔f0=fs/N=1/NTs=1/T,其中N为采样点数,fs为采样频率,Ts为采样间隔。所以采样频率不低于20480hz.与采样频率的不低于20000hz综合得不低于20480hz

4、已知单片机内置12位精度的ADC,单片机工作电压3.3V,ADC基准电压3V,请计算ADC采样的电压最小分辨率是多少?如果单片机ADC输入口电压为1V,则采样得到的值是多少?

 答:

电压最小分辨率为3/409 V (2^12=4096)

采样值为1*(4093/3)

5、同步通信和异步通信有什么区别?UART、SPI和I2C分别属于什么类型的通信方式?

答:

同步通信需要相同频率的时钟,逐字符发送接收,发一个收一个,收一个发一个,不能有间隙。

异步通信可以任意间隙,接受端随时准备,发送端任意时刻发送 ,需要加停止位和开始位。

UART异步通信 全双工 2线 RX TX

I2C 同步通信 半双工 2线 SDA SCL

SPI 同步通信 全双工 3线或四线 MOSI MISO SCLK SS(片选)

6、简述通过I2C接口读取设备X的寄存器Y的值的过程

答:

发送起始信号——发送设备X地址+读写位0(w)——读取ACK——发送寄存器地址Y——读取ACK——重复起始信号——发送设备X地址+读写位1(R)——读取ACK——读取数据——发送NACK——发送停止信号

7、中断是什么?请简述单片机中断处理的过程

答:

CPU在正常执行程序的过程中,由于内部/外部事件的触发或程序的预先安排引起CPU暂时中断当前正在运行的程序,而转去执行中断服务子程序,待中断服务子程序执行完毕后,CPU继续执行原来的程序,这一过程称为中断;

中断请求——中断判断——中断响应——中断服务——中断返回

8、相比于正常子函数,中断服务函数有什么特点和需要注意的地方?

答:

1.相比正常的子函数,中断函数服务函数中不能有耗时的操作,最不能在中断服务函数中有延时函数。

2.不能有引起中断睡眠的函数。

3.不能递归调用自身。

4.在中断服务函数中不能出现可重入函数。比如printf。

5.中断服务函数中没有参数以及没有返回值。

9、对于char型变量 a,写两段代码分别将 a的 bit 6置1和置0

答:

a |= (1 << 6);
a &= ~(1 << 6);

10、请写一段代码,可以将输入为”0.0.0.0”—“255.255.255.255”的字符串转换为int型整数数组。

输入:”255.255.255.255”

输出:255 255 255 255 (数组)

答:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
	char arry[20];
	int res[4] = {0};
	gets(arry);
	int len = strlen(arry);
	int i = 0, count = 0;
	while (i < len) {
		if (arry[i] == '.') {
			count++;
			i++;
		}
		res[count] *= 10;
		res[count] += (arry[i] - '0');
		i++;
	}
	for (int j = 0; j < 4; j++) {
		printf("%d ", res[j]);
	}
}

猜你喜欢

转载自blog.csdn.net/imysy_22_/article/details/126601384