嵌入式知识点1
- 单片机IO口开漏输出和推挽输出有什么区别?
1.开漏输出只能输出低电平无法输出高电平,需要借助外部上拉电阻输出高电平完成对外驱动
2.推挽输出可以真正的输出高电平和低电平,在两种电平下都有驱动能力
3.推挽输出负载能力强,开漏输出的灌电流大适合做电流型的驱动
- 单片机里定时器有什么作用和优势?
作用:计数器、延时、输入捕获(用作解码或者测量时间间隔)、输出比较(多用于产生pwm波形)、单脉冲输出、触发中断。
优势:不需要CPU参与,精确
- 什么是Nyquist采样定理?如果需要通过512点FFT分析200-10KHz信号频谱,频谱分辨率不低于40Hz,此时采样频率需在什么范围?
用来描述给定带宽的最高传输速率,要从抽样信号中无失真的恢复原信号,抽样频率应大于两倍信号最高频率。
FFT频谱分辨率等于fs(采样频率)/N(采样点数),因此采样频率需大于 512*40=20480Hz
- 已知单片机内置12位精度的ADC,单片机工作电压3.3V,ADC基准电压3V,请计算ADC采样的电压最小分辨率是多少?如果单片机ADC输入口电压为1V,则采样得到的值是多少?
12位ADC,2的12次方=4096,分辨率3/4096,1V的AD值对应(1/3)*(4096)=1365
- 同步通信和异步通信有什么区别?UART、SPI和I2C分别属于什么类型的通信方式?
同步通信需要相同频率的时钟,逐字符发送接收,发一个收一个,收一个发一个,不能有间隙。
异步通信可以任意间隙,接受端随时准备,发送端任意时刻发送 ,需要加停止位和开始位
同步通信需要一根时钟线,并且通信双方的时钟频率要严格同步,系统搭建相对较复杂,其中时钟的作用就是判断收发数据的进程,定位当前传输的数据
异步通信可以不要时钟线,系统较为简单,由于缺少定位数据的时钟线,所以必须在传输的数据帧前后加上开始、结束等冗余字符。
UART属于异步,SPI和I2C属于同步通信
- 简述通过I2C接口读取设备X的寄存器Y的值的过程
主机发起通信,将读命令和寄存器Y的地址发给设备X;设备X读取判断读命令,根据寄存器Y的地址将寄存器y的值通过设备X的I2C输出到buff,主机再次发起通信读取数据
- 中断是什么?请简述单片机中断处理的过程
中断就是单片机在遇到某些触发条件时,暂时放下当前的工作,转而去执行对应的中断服务函数,当中断函数处理完毕后,又回到刚才跳转的地方,继续执行程序。
中断处理的过程:第一步:保护现场,将当前位置的PC地址压栈;第二步:跳转到中断服务程序,执行中断服务程序;第三步:恢复现场,将栈顶的值回送给PC;第四步:跳转到被中断的位置开始执行下一指令。
- 相比于正常子函数,中断服务函数有什么特点和需要注意的地方?
1.无参数值,无返回值
2.不能出现可重入函数,比如printf
3.不能递归调用本身
中断函数中不宜写太多的代码,尽量避免耗时的运算,防止程序卡在中断服务程序中,导致系统崩溃
- 对于char型变量 a,写两段代码分别将 a的 bit 6置1和置0
#define BITSET (0X01<<6)
void bitSet(unsigned char a)
{
a |= BITSET;
}
void bitClear(unsigned char a)
{
a &= ~BITSET;
}
- 请写一段代码,可以将输入为”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\t", res[j]);
}
}