常见通信协议有哪些,特点分别是什么?
答:
有usart,i2c,spi,can,usb等等。
UART(Universal Asynchronous Receiver/Transmitter)是一种异步串行通信协议,用于设备间的数据传输。它采用全双工通信(可同时收发),仅需TX(发送)和RX(接收)两根信号线,无需共享时钟信号,依靠预定的波特率实现同步。
关键特性
异步通信:无公共时钟,依赖固定的波特率(如9600、115200bps)。
帧格式:每帧包含起始位(低电平)、5-9位数据、可选的校验位和停止位(高电平)。
电平标准:
TTL电平:+3.3V/+5V表示逻辑1,0V表示逻辑0(直接用于MCU通信)。
RS-232:±3~15V表示信号(需电平转换芯片)。
RS-485:±1.5~6V差分(A-B>+200mV=1)
全双工:可同时收发数据。
无时钟线:需严格匹配波特率,防止误差累积,故不宜长时间连续传输。
USART(通用异步/同步收发器)
在UART基础上增加同步模式(带时钟信号CLK),如SPI、I2C,适用于高速通信场景。
应用场景:嵌入式设备、传感器、工业控制、调试接口(如USB转串口)。
I2C(Inter-Integrated Circuit)是一种同步、半双工、串行通信协议,由Philips(现NXP)开发,用于短距离设备间通信。它仅需两根信号线(SCL时钟线 + SDA数据线),支持多主多从架构,广泛用于传感器、EEPROM、显示屏等低速外设。
关键特性
同步通信:依赖共享时钟(SCL),由主设备控制时序。
半双工:同一时间只能发送或接收数据。
多设备总线:支持地址寻址(7位/10位),同一总线可挂载多个从设备(默认上限128个)。
开漏输出:总线需外接上拉电阻,支持“线与”逻辑,避免冲突。
速率模式:
标准模式(100kbps)
快速模式(400kbps)
高速模式(3.4Mbps)
通信流程
起始条件(START):SCL高电平时,SDA由高→低。
地址帧:主设备发送7/10位从机地址 + 1位读写方向(0写,1读)。
数据帧:每8位数据后跟随1位应答(ACK/NACK)。
停止条件(STOP):SCL高电平时,SDA由低→高。
优缺点
优点:引脚少、支持多设备、硬件简单。
缺点:速率较低、需上拉电阻、地址冲突需避免。
典型应用:温湿度传感器(如SHT30)、OLED屏幕(SSD1306)、RTC时钟(DS3231)等。
SPI(Serial Peripheral Interface)是一种高速、全双工、同步串行通信协议,由Motorola提出,广泛用于MCU与Flash、ADC、显示屏等外设的通信。其采用主从架构,通过4线制(或3线简化版)实现数据交换,以硬件简单、速率高著称。
关键特性
同步通信:依赖主设备提供的时钟(SCK),速率可达数十MHz(远高于I2C/UART)。
全双工:可同时发送和接收数据(MOSI + MISO)。
4线制标准接口:
SCK(Serial Clock):主设备输出的时钟信号。
MOSI(Master Out Slave In):主设备发送数据线。
MISO(Master In Slave Out):从设备返回数据线。
SS/CS(Slave Select):从设备片选信号(低电平有效)。
注:3线制可省去MISO或MOSI,实现半双工。
无寻址机制:通过片选(CS)选择从设备,每增加一个从机需额外占用1个GPIO。
灵活的数据格式:可配置时钟极性(CPOL)和相位(CPHA),适应不同设备时序。
通信流程
片选激活:主设备拉低目标从机的CS引脚。
时钟同步:主设备生成SCK,在上升沿或下降沿采样数据(由CPOL/CPHA决定)。
数据交换:
主设备通过MOSI发送数据,从机通过MISO返回数据(同时进行)。
片选释放:通信完成后拉高CS。
优缺点
优点 缺点 速率高(MHz级) 引脚占用多(每从机需1个CS) 全双工通信 无硬件级冲突检测(依赖软件) 协议简单,无复杂寻址 传输距离短(通常<1m) 支持多从机(需多CS引脚) 无标准错误校验机制 典型应用场景
高速存储:Flash(W25Q128)、SD卡。
传感器:高精度ADC(ADS131M04)、陀螺仪(MPU6050)。
显示模块:TFT屏(ILI9341)、OLED驱动芯片。
无线通信:RF模块(nRF24L01)、蓝牙芯片。
对比UART/I2C:SPI适合高速、点对点或多从机场景,但功耗和引脚开销较大。
GPIO的几种工作模式?
答:
STM32 的 GPIO(通用输入/输出)支持 8 种工作模式,可配置为 4 种输入模式 + 2 种输出模式 + 2 种复用功能模式,适用于不同应用场景。
1. 输入模式(4 种)
(1) 浮空输入(GPIO_Mode_IN_FLOATING)
特点:引脚悬空(无内部上拉/下拉),电平完全由外部电路决定。
应用:用于读取外部信号(如按键检测、UART RX)。
注意:易受干扰,需外部上/下拉电阻稳定电平。
(2) 上拉输入(GPIO_Mode_IPU)
特点:内部接上拉电阻(默认高电平),外部拉低时读 0。
应用:按键检测(按键接地)、避免悬空干扰。
(3) 下拉输入(GPIO_Mode_IPD)
特点:内部接下拉电阻(默认低电平),外部拉高时读 1。
应用:按键检测(按键接 VCC)、避免悬空干扰。
(4) 模拟输入(GPIO_Mode_AIN)
特点:关闭施密特触发器,直接连接 ADC/DAC,用于模拟信号采集。
应用:ADC 电压检测、DAC 输出。
2. 输出模式(2 种)
(5) 开漏输出(GPIO_Mode_OUT_OD)
特点:
只能输出低电平(MOS 管导通)或高阻态(MOS 管关闭)。
输出高电平时需外部上拉电阻。
应用:
I2C(SDA/SCL 需开漏 + 上拉)。
电平转换(如 3.3V ↔ 5V)。
(6) 推挽输出(GPIO_Mode_OUT_PP)
特点:
可输出高电平(PMOS 导通)或低电平(NMOS 导通)。
驱动能力强,无需外部上拉。
应用:
驱动 LED、蜂鸣器、SPI(MOSI/SCK)。
高速数字信号(如 PWM)。
3. 复用功能模式(2 种)
(7) 开漏复用输出(GPIO_Mode_AF_OD)
特点:
类似开漏输出,但由片上外设(如 I2C、USART)控制。
应用:
I2C(SDA/SCL)。
部分 USART(TX)。
(8) 推挽复用输出(GPIO_Mode_AF_PP)
特点:
类似推挽输出,但由片上外设(如 SPI、PWM)控制。
应用:
SPI(MOSI/SCK)、USART(TX)。
定时器 PWM 输出。
总结对比
模式
特点
典型应用
IN_FLOATING
悬空输入,易受干扰
UART RX、按键(需外接电阻)
IPU
内部上拉,默认高电平
按键(接地触发)
IPD
内部下拉,默认低电平
按键(接 VCC 触发)
AIN
模拟信号输入
ADC/DAC
OUT_OD
开漏输出,需外接上拉
I2C、电平转换
OUT_PP
推挽输出,驱动能力强
LED、SPI、PWM
AF_OD
外设控制的开漏输出
I2C、USART
AF_PP
外设控制的推挽输出
SPI、PWM、USART
适用场景建议:
数字输入:优先选 IPU/IPD(抗干扰)。
模拟信号:必须用 AIN。
I2C:必须用 AF_OD 或 OUT_OD + 上拉。
高速驱动(SPI/PWM):用 AF_PP 或 OUT_PP。
问:既然提到了施密特触发器,说一下吧
答案
单稳态触发器是一种具有一个稳态和一个暂稳态的脉冲整形电路,特点是需要外部触发信号才能翻转,且暂态持续时间由外部RC元件决定,之后自动返回稳态。
开漏输出和推挽输出的区别和应用场景分别是哪些?
1. 工作原理区别
特性
开漏输出(OD)
推挽输出(PP)
输出结构
仅NMOS管(只能拉低,高电平靠外部上拉)
PMOS + NMOS(可主动拉高或拉低)
高电平输出
高阻态(需外部上拉电阻)
直接输出高电平(VCC)
低电平输出
NMOS导通,拉低到GND
NMOS导通,拉低到GND
驱动能力
依赖外部上拉电阻,电流受限
强驱动(高低电平均可主动输出)
电平转换
支持不同电压设备(如3.3V↔5V)
仅支持相同电压域
总线冲突保护
支持“线与”逻辑(多设备共享总线)
直接短路风险(需避免多设备同时驱动)
2. 典型应用场景
(1)开漏输出的适用场景
I2C通信:SDA/SCL线必须开漏 + 上拉,支持多主设备共享总线。
电平转换:连接不同电压设备(如3.3V MCU与5V传感器)。
中断信号:多个设备的中断线可并联(线与逻辑)。
高电压驱动:外部上拉至更高电压(如12V继电器控制)。
(2)推挽输出的适用场景
高速数字信号:SPI、USART(TX)、PWM等需快速切换的场景。
驱动负载:LED、蜂鸣器、电机等需强电流驱动的设备。
单主设备总线:如单向通信的SPI MOSI/SCK线。
3. 关键选择依据
选开漏(OD):
需要多设备共享总线(如I2C)。
需电平转换或高电压输出。
避免总线冲突(线与逻辑)。
选推挽(PP):
需要高速、强驱动能力(如SPI、PWM)。
单主设备控制,无需总线共享。
说一下你常用的单片机,有什么特点,为什么要使用他,主频是多少?
stm32g431rbt6,最高主频可以达到170mhz,内置3个运算放大器和比较器,具备cordic硬件加速计算,内置刹车输入功能,专门为电机控制设计
是否会计算串口的波特率?
串口通信的波特率决定了每秒传输的比特数(bps),其计算与 时钟源、分频系数 相关。STM32 等单片机通常通过 USART 时钟分频 来生成目标波特率。
对于大多数单片机(如STM32),串口波特率的计算公式为:
其中:
fUSART_CLKfUSART_CLK:USART 模块的时钟频率(如 APB 总线时钟)。
USARTDIV:分频系数(16位整数 + 小数部分,写入波特率寄存器)。
串口如何接收不定长的数据?
使用串口中断+DMA的方式,串口中断+DMA接收不定长数据的原理是:DMA自动将串口接收的数据搬运到缓冲区,同时使能串口空闲中断;当数据停止传输时触发空闲中断,此时通过DMA传输计数器计算出已接收的数据长度,即可获取完整的不定长数据帧,处理完成后重新初始化DMA继续接收。这种方式既利用DMA减轻CPU负担,又通过空闲中断准确判断帧结束位置。
嵌入式基于ROM运行和基于RAM运行有什么区别?
存储介质
ROM运行:代码直接从只读存储器(如Flash)执行,无需加载到RAM。
RAM运行:代码需先拷贝至随机存取存储器(RAM)再执行。
速度
ROM:读取速度较慢(受Flash访问延迟影响),但掉电数据不丢失。
RAM:运行速度更快(无等待周期),适合实时性要求高的代码,但掉电后数据消失。
用途
ROM:存储固件、启动代码等永久性内容。
RAM:存放运行时变量、堆栈或需频繁修改的代码(如动态加载模块)。
初始化
ROM:上电即执行,无需额外操作。
RAM:需通过Bootloader或启动代码将程序从ROM加载至RAM。
说一下stm32boot启动模式有哪些?
主闪存启动(Main Flash Memory)
配置:
BOOT0=0
,BOOT1=X
(X表示任意电平)。启动地址:
0x0800 0000
(Flash存储器的起始地址)。特点:
这是最常见的启动模式,程序存储在内部Flash中,复位后直接从Flash运行。
适用于正常程序运行,支持JTAG/SWD调试和程序烧录156。
系统存储器启动(System Memory)
配置:
BOOT0=1
,BOOT1=0
。启动地址:
0x1FFF 0000
(系统存储器的起始地址)。特点:
该模式下运行的是ST预置的BootLoader(ISP程序),通常用于串口(UART)或USB下载程序到Flash。
适用于Flash损坏或需要重新烧录固件的情况,但操作较繁琐(需手动切换BOOT引脚)136。
内置SRAM启动(Embedded SRAM)
配置:
BOOT0=1
,BOOT1=1
。启动地址:
0x2000 0000
(SRAM的起始地址)。特点:
程序在RAM中运行,掉电后数据丢失,主要用于调试或快速测试代码。
可减少Flash擦写次数,但需预先通过调试器(如ST-Link)加载程序到SRAM
中断介绍一下
中断是计算机系统中一种重要的机制,指当外部事件(如硬件信号)或内部事件(如程序异常)发生时,暂停当前任务,转而处理该事件,处理完成后恢复原任务的过程。
stm32的启动流程
1. 硬件上电与复位
复位信号:STM32 上电或按下复位键时,硬件复位电路产生低电平复位信号(NRST),CPU 从初始状态开始执行。
时钟初始化:内部高速时钟(HSI)默认启动,作为初始时钟源(后续可切换为外部晶振 HSE/PLL)。
2. 启动模式选择(Bootloader)
STM32 通过 BOOT0/BOOT1 引脚 决定启动位置(复位后采样引脚电平):
BOOT1 BOOT0 启动模式 用途 0 0 主闪存(Flash) 正常用户程序 0 1 系统存储器(Bootloader) 串口/USB 下载固件 1 1 内置 SRAM 调试或临时运行代码 注意:多数应用选择
BOOT0=0
,从 Flash 启动。
3. 执行启动文件(Startup File)
从 Flash 启动时,CPU 首先执行预编译的启动文件(如
startup_stm32fxxx.s
,汇编编写),关键步骤:(1) 初始化栈指针(SP)
从 Flash 的 首地址(0x08000000) 读取
MSP
(主栈指针)值,赋值给 SP。该值由链接脚本定义(如
_estack
,指向 RAM 末尾)。(2) 跳转到复位向量
从 Flash 的 第二地址(0x08000004) 读取复位向量(Reset_Handler 函数地址),并跳转执行。
(3) 复位处理函数(Reset_Handler)
初始化 .data 段:将已初始化的全局变量从 Flash 拷贝到 RAM。
清零 .bss 段:将未初始化的全局变量(如
int a;
)所在 RAM 区域清零。调用 SystemInit():配置时钟树(如 PLL 倍频)、FPU(如果启用)。
跳转到 main():最终进入用户程序的
main()
函数。
4. 时钟与硬件初始化(SystemInit())
时钟配置:根据
SystemInit()
(通常位于system_stm32fxxx.c
)初始化 HSI/HSE/PLL,设置 SYSCLK。中断向量表重定位:将中断向量表地址指向 Flash 或 RAM(可选)。
其他外设初始化:如 FPU、电源管理等(依赖芯片型号)。
5. 进入用户程序(main())
完成上述步骤后,CPU 正式执行用户代码
pid讲解下
PID(Proportional-Integral-Derivative)是一种经典的闭环控制算法,通过实时计算误差(目标值与实际值之差)的比例(P)、积分(I)、微分(D)三个分量的加权和,生成控制信号,使系统输出快速、稳定地趋近目标值。
单片机最小系统板的组成
STM32的最小系统的硬件组成主要有:电源电路、复位电路、时钟电路、调试接口电路、启动电路。
说一下spi最快通信速率是多少
spi最快通信速率跟外设总线频率有关,一般为外设总线频率/2,比如f103的apb1的外设总线上挂载了spi,其pclk为36mhz,所以f103最快spi速率为18mhz