欢迎光临
我们一直在努力

STM32 串口、I2C与DMA的理解

一、 串口是个“大家族”,USART是它的“常用成员”
 

可以把 “串口” 理解成 “手机的通信功能” ——是个大概念,包含发短信、打电话、微信语音等多种方式。而 STM32 里常说的 USART/UART,就是串口家族里 最常用的“发短信”功能:
– USART:既能发“短信”(异步通信),也能搞“实时对讲”(同步通信),功能全;
– UART:只能发“短信”(异步通信),是 USART 的简化;

 对比项                  I2C的SDA/SCL                                                       串口的TX/RX
数量    2根线,分工明确(SCL定节奏,SDA传数据)    2根线,分工固定(TX只发,RX只收)
方向    SDA双向,SCL单向(主设备→从设备)                 TX单向输出,RX单向输入
上拉电阻    必须接(开漏输出特性)                                         不用接(推挽输出)
控制权    SCL由主设备独占,从设备不能改                       TX/RX由两台设备各自控制,平等
通信模式    同步(靠SCL时钟同步)                                          异步(靠波特率同步)
 

二、核心区别:I2C和串口USART就是“会议室聊天”和“两人打电话”

 
两者都是单片机的 “聊天规则”(通信协议) ——就像人和人说话要讲普通话/方言,机器之间聊天也要按固定规矩来,不然就鸡同鸭讲。
 
1. 串口(USART):一对一“打电话”
 
生活例子:你和你闺蜜单独打电话,两人对着说
– 接线简单:就两根线(TX发送、RX接收),你说的话走TX线传给闺蜜,闺蜜说的走RX线传给你;
– 通信方式:全双工 —— 你说话的时候,闺蜜也能插嘴,两边能同时说(比如打电话时你俩互怼,不用等对方说完);
– 角色平等:默认无主从,两台单片机连上线,设置好相同的“语速”(波特率),就能直接聊;- 适用远距离传数据(比如单片机给电脑发消息、蓝牙模块通信),像打电话能跨城市,距离比I2C远。
 
2. I2C:多对一“会议室开会”
 
生活例子:公司会议室里,老板主持开会,3个员工听指挥。老板让员工A汇报,A才敢说;让员工B拿文件,B才行动。
 
– 接线更省:只有两根线(SDA数据线=说话的内容,SCL时钟线=老板的“节奏指挥”);
– 角色分明:主从模式 —— 必须有一个“老大”(主设备,比如STM32),剩下的都是“小弟”(从设备,比如传感器、显示屏);
老大负责发“开会指令”(时钟信号),小弟们只能听指令做事,不能主动说话;
– 通信方式:半双工 —— 同一时间,要么老大说话小弟听,要么小弟说话老大听,不能同时聊(像开会时,老板说话员工就得闭嘴,员工汇报老板就听);
– 适用场景:近距离多个设备通信(比如STM32同时连温湿度传感器、OLED屏),像会议室里人多但距离近,省接线。

I2C的核心优势是 「一根总线挂多个设备,省接线」,适合近距离(几米以内)、多设备通信:
 
1. STM32驱动I2C外设传感器:比如温湿度传感器DHT11是单总线,但SHT30、AHT20是I2C接口——STM32通过I2C给传感器发「读取温度」指令,传感器回传数据;
2. STM32控制I2C接口显示屏:比如0.96寸OLED屏(SSD1306驱动芯片),只用SDA/SCL两根线就能和STM32连接,显示文字、图形;
3. STM32读写I2C存储芯片:比如EEPROM芯片AT24C02,用来掉电保存数据(比如保存用户设置的参数,断电后数据不丢失)。
 
软件I2C vs 硬件I2C
 
– 硬件I2C(STM32内部I2C外设)
操作步骤(书面化流程):
① 配置GPIO引脚为「复用开漏输出模式」+ 上拉电阻(I2C总线要求开漏输出,上拉电阻保证总线空闲时为高电平);
② 配置I2C参数:主设备模式、时钟频率(比如100kHz标准模式、400kHz快速模式)、从设备地址(如果STM32当从设备才需要设);
③ 启动通信:主设备发送「起始信号」(SCL高电平时,SDA从高拉低);
④ 发送从设备地址+读写方向位(比如「0x48+写」=0x90,「0x48+读」=0x91);
⑤ 等待从设备应答(ACK):从设备收到地址后,会拉低SDA一个时钟周期表示响应;
⑥ 读写数据:写数据就往数据寄存器塞值,读数据就从寄存器取,每传一个字节都要等应答;
⑦ 发送「停止信号」(SCL高电平时,SDA从低拉高),结束通信。
优点:CPU不用管时序,效率高;缺点:硬件I2C对时序要求极严,新手容易出现「丢应答」「通信失败」,而且STM32的硬件I2C数量更少(比如F103C8T6只有2个I2C)。

– 软件I2C(GPIO模拟)
操作步骤(书面化流程):
① 选两个普通GPIO引脚(比如PB6=SCL,PB7=SDA),配置为推挽输出(SCL)+ 上拉输入(SDA);
② 用代码手动模拟I2C的所有时序:
– 起始信号:写代码让SCL=1→SDA=1→SDA=0→SCL=0;
– 发送地址:循环把地址的每一位(共8位)赋值给SDA,然后拉高低SCL产生时钟脉冲;
– 检测应答:拉低SCL,读取SDA电平,如果是低电平就是应答成功;
– 数据传输:和发送地址同理,逐位发送/接收;
– 停止信号:写代码让SCL=0→SDA=0→SCL=1→SDA=1。
优点:时序灵活,新手容易调通,引脚随便选;缺点:CPU要全程参与,占用运算资源。

 
三、关键概念:同步/异步、全双工/半双工

 
1. 同步通信 vs 异步通信 —— 说话要不要“打拍子”
 
– 同步通信(比如I2C):
像 大合唱 —— 必须有个指挥(I2C的SCL时钟线),所有人跟着指挥的拍子唱,节奏完全一致;
优点:不容易出错;缺点:必须多一根“指挥线”(时钟线)。
– 异步通信(比如串口USART):
像 打电话 —— 没有指挥,但是得提前约定好“说话速度”(波特率,比如9600、115200),你说一句等对方反应,不用实时打拍子;
优点:少一根线,接线简单;缺点:两边“语速”必须一模一样,不然就听岔了。
 
2. 全双工 vs 半双工 —— 能不能同时说话
 
– 全双工(串口):同时说 —— 打电话时你和闺蜜能同时怼对方,互不耽误;
– 半双工(I2C):轮流说 —— 开会时老板和员工不能同时说话,得一个一个来
 

3.主从模式:谁是“话事人”

– 主从模式 I2C专属核心规则
就像 班长和同学 —— 班长(主设备,STM32)说了算,同学(从设备,传感器)只能听指令。
比如STM32要读温湿度传感器的数据,必须先给传感器发“我要读数据”的指令,传感器才会把数据传过来;传感器绝对不会主动给STM32发消息

信号线       英文全称             中文名称                                              核心作用    
SDA    Serial Data Line    串行数据线    专门传输数据内容(比如传感器的温度值、OLED屏的显示指令)   
SCL    Serial Clock Line    串行时钟线    专门传输时钟节拍(主设备控制节奏,告诉从设备“什么时候读/写数据”)     
 

SCL:主设备的“专属指挥棒”,从设备只能“听话”
 
SCL的节奏完全由主设备控制(比如STM32),从设备(比如传感器、OLED屏)没有任何控制权:
– 主设备想发数据了,就通过SCL引脚输出一串“高低高低”的脉冲(时钟信号);
– 从设备必须盯着SCL的脉冲——SCL跳一下,从设备才敢读/写SDA上的一位数据;
– 只要主设备停发时钟脉冲,从设备就只能“原地待命”

STM32(主)要读SHT30传感器(从)的温度:
① STM32先拉低SCL(拍一下节拍器),SHT30就知道“要准备数据了”;
② STM32拉高SCL(再拍一下),SHT30就把温度数据的第一位放到SDA上;
③ 重复8次,就能读完1字节的温度数据——全程SCL的节奏由STM32说了算
 
SDA:双向传输的“数据通道”,主从设备都能“读写”

SDA是双向线——主设备可以通过它给从设备发指令(比如“读取温度”),从设备也可以通过它给主设备回传数据(比如“25℃”)。
但注意:SDA的传输方向由SCL的节奏控制,且同一时间只能单向传输(这就是I2C的半双工特性)。
 
STM32给OLED屏(SSD1306)发“显示字符A”的指令:
① 主设备(STM32)控制SCL发时钟脉冲,同时把“显示指令”的二进制数逐位放到SDA上(此时SDA是“主→从”方向);
② OLED屏跟着SCL的节奏,逐位读取SDA上的指令,读完后在SDA上拉低电平(发一个“应答信号ACK”),告诉STM32“我收到了”;
③ 全程SDA只负责传指令,不会同时传其他数据

四、软件/硬件读写

 
1. 硬件读写:用“专业聊天工具”(硬件外设)
 
STM32 芯片里,专门给 I2C 和串口(USART)设计了 “聊天专用模块”(硬件外设) —— 你只要告诉这个模块“要发什么内容”,它就会自动按协议规则把数据发出去,不用CPU一直盯着。
比如:
 
– 用硬件I2C:STM32的I2C外设自动生成时钟信号、处理主从应答,CPU发完指令就能去干别的活;
– 用硬件串口:USART外设自动加“起始/停止信号”,CPU不用管细节,效率高。
 
2. 软件读写:用“手动传话”(GPIO口模拟)
 
如果不想用硬件模块,也能 “假装”自己是I2C/串口 —— 用普通的GPIO引脚,通过代码控制引脚的高低电平,模仿协议的时序(比如手动造I2C的时钟信号、串口的波特率)。
比如:
– 软件I2C:用两个普通GPIO口,一个模拟SCL时钟线(一会儿高一会儿低),一个模拟SDA数据线传数据,完全靠代码“手动指挥”;
– 软件串口:同理,用两个GPIO口模仿TX/RX的高低电平变化,实现通信。
 
– 平时咱们用的“串口助手调试”,都是用 硬件USART(效率高,一般串口都是硬件读写);
– 只有当硬件USART不够用的时候(比如STM32的串口全被占了),才会用 软件串口(用GPIO模拟,效率低,适合简单通信)。

五、和DMA的关系:让效率翻倍
 

DMA(直接存储器访问),是STM32的另一个核心片上外设,和I2C、串口是「协作关系」,作用是 「解放CPU,实现数据的高速批量传输」
 
1. 没有DMA时,I2C/串口的痛点
比如用串口接收100个字节的数据:
– 没有DMA:每收到1个字节,就会触发一次中断,CPU要中断当前工作,去读取数据寄存器,再把数据存到内存——100个字节就要触发100次中断,CPU累得要死
 
2. 有了DMA后,相当于「快递站自动分拣」
DMA就像快递站的自动分拣机器人,可以直接在「I2C/串口的数据寄存器」和「STM32的内存(RAM)」之间搬运数据,全程不用CPU插手:
– 串口+DMA:你告诉DMA「要接收100个字节,存到内存地址0x20000000开始的区域」,之后串口收到的数据会被DMA自动搬到内存,100个字节传完后,DMA才给CPU发一个「传输完成」的信号,CPU再去处理数据;
– I2C+DMA:同理,STM32给I2C从设备发批量数据(比如给OLED屏发一屏显示数据)时,DMA可以自动把内存里的显示数据搬到I2C的数据寄存器,CPU全程可以去执行其他任务。
 
3. 核心结论
DMA不是通信协议,也不是和I2C/串口并列的外设,而是给所有需要批量传输数据的外设(包括I2C、串口、SPI等)提供「数据搬运服务」的工具,目的是提升STM32的运行效率

赞(0)
未经允许不得转载:171主机测评 » STM32 串口、I2C与DMA的理解
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址