STM32 串口多处理器通信

文章目录[隐藏]

STM32 串口多处理器通信

1.原理分析

  1. 串口通信原理
    STM32的USART全称为通用同步异步收发器,能够灵活实现同步、异步、半双工、全双工的数据交换。由于通信时数据按照bit的方式在一根数据线上传输,所以也被称为串行接口,简称串口。
    关于STM32的通信特点与原理介绍,网上优秀博主的介绍不计其数,有兴趣深入了解可点击此链接网址:STM32串口通信原理介绍 。本文主要介绍多处理器通信的原理与实现流程。
  2. 多处理器通信(以下简称多机通信)
    USART进行多处理器通信(多个USART连接在一个网络中),其中一个 USART 可以是主 USART,其 TX 输出与其它 USART 的 RX 输入相连接。其它 USART 为 从 USART,其各自的 TX 输出在逻辑上通过与运算连在一起,并与主 USART 的 RX 输入相连接。
    关于多设备(从机)挂载在同一条总线的通信方式十分常见,MCU常见的有CAN总线、I2C总线、SPI总线、串行总线,串口多处理器通信类似于这类总线。
    使用总线挂载多设备是为了节约外设资源、简化硬件电路设计,方便管理多设备通信,切记匆与总线多设备可以同时通信混淆。总线某时刻只有一组设备在通信,其他设备要等待总线空闲时才可申请发起通信。
    总线通信可有或可无主从机之分,这里只介绍主从机的概念:
    划分主从机主要确定一个中心站,方便通过中心站接收从机的状态、数据进行处理、给从机发送控制命令。如此,从机必须要有一个ID或者类节点地址去区分它们,以便主机通过这个唯一的ID区分是哪个从机、从机通过ID确认主机在给谁发信号。
    总线从机的节点地址一般通过DIP开关、从机主动设置或者动态分配方式,本串口多机通信则是通过从机主动设置节点地址。
    理论上,串口多机通信的所有从设备都可以收到主机串口发出的所有数据,相当于每个MCU都被迫接收、处理主机数据。无疑,这增加了未被寻址的从设备USART服务开销。而理想的主从设备通信时,肯定是主机每次只与被寻址的从设备通信,其他未寻址的从设备当个旁观者(那凉快那待,不是!)。所以引出了串口多机通信的静音模式。
    静音模式与停止模式是两个不同的概念:静音模式针对通信过程而言,不是为了降低功耗,只为了做到一对一通信和减少第三者的函数服务开销。 停止模式是针对MCU的低功耗而言,在停止模式外设禁止运行。
    2.1 串口多处理器通信类型
    STM32 MCU的串口多机通信的静音功能将未被寻址的器件置于静音模式下,在静音模式下:
    ● 不得将接收状态位置 1。
    ● 禁止任何接收中断。
    ● USART_CR1 寄存器中的 RWU 位置 1。RWU 可由硬件自动控制,或在特定条件下由软
    件写入。
    根据 USART_CR1 寄存器中 WAKE 位的设置,USART 可使用以下两种方法进入或退出静
    音模式:
    ● 如果 WAKE 位被复位,则进行空闲线路检测,
    ● 如果 WAKE 位置 1,则进行地址标记检测。
    空闲线路检测(WAKE = 0)
    当向 RWU 位写入 1 时,USART 进入静音模式。 当检测到空闲帧时,它会被唤醒。此时 RWU 位会由硬件清零,但 USART_SR 寄存器中的 IDLE 位不会置 1。还可通过软件向 RWU 位写入 0。
    注意:必须要等串口接收至少一个字节都,才能进入空闲检测线路下的静音模式,否则进入静音模式失败,也就不会执行空闲线路检测。
    注意:空闲帧与数据线路拉高不一样,空闲帧为数据发送或者接收完成后的空闲字符,可以理解为整个帧周期内电平均为“1”,它的出现为数据发送完成之后。数据线路拉高只是无数据时处于高电平的状态,可以是数据之前或之后。
    在这里插入图片描述
    如图,在接收到数据1后进入静音模式,数据2、3、4对于串口而言都被屏蔽了,也就不会再接收处理,这样的静音模式持续到数据发送完成,出现一个空闲帧,所有静音模式下的串口被一同唤醒,所以静音模式是针对通信过程而言,总线空闲后,所有从机串口处于激活模式。
    空闲线路检测一般用于同步唤醒的所有从机,方便主机同时向所有从机发出对所有从机有效的指令。利用数据1的特性,可以选择前若干位数据(一般1字节即可)作为从机的唯一ID,还可以根实际情况需要规定公共ID、对某组从机规定公共组ID等,实现与Modbus协议一样的一主控制多从的功能,但减少了Modbus协议层的硬件电路。
    地址标记检测 (WAKE=1)
    在此模式下,如果字节的 MSB 为 1,则将这些字节识别为地址,否则将其识别为数据。在
    地址字节中,目标接收器的地址位于 4 个 LSB 上。接收器会将此 4 位字与其地址进行比
    较,该接收器的地址在 USART_CR2 寄存器的 ADD 位中进行设置。
    当接收到与其编程地址不匹配的地址字符时,USART 会进入静音模式。此时,RWU 位将由硬件置 1。由于当时 USART 已经进入了静音模式,所以 RXNE 标志不会针对此地址字节置 1,也不会发出中断或 DMA 请求。
    当接收到与编程地址匹配的地址字符时,它会退出静音模式。然后 RWU 位被清零,可以开始正常接收后续字节。由于 RWU 位已清零,RXNE 位会针对地址字符 置 1。
    注意:当接收器的缓冲区不包含任何数据(USART_SR 寄存器中 RXNE=0)时,可向 RWU 位写 入 0 或 1。否则会忽略写尝试。
    在这里插入图片描述

如上图,地址标记检测法是为每个串口从机设置了一个节点地址,节点地址可以采用 4bit 或 7bit,通过控制寄存器(USART_CR)的其中4bit或7bit来设置,具体哪些bit根据型号系列和寄存器而定。进入静音模式后,接收的第一个字节会默认与从机的节点地址对比,如果地址一致,则恢复激活模式,否则保持静音模式。
节点地址的设置

如上图,STM32G070RBT6 MCU是用USART_CR2寄存器的[31:24]位来设置地址的,这些位共一个字节,可以根据需要设置4bit或7bit地址。4bit的有效地址仅有16个,7bit有128个。
如果串口接收的第一个字节最高位(7)为1,代表地址,否则为数据。如果为地址,则进行地址匹配检测,成功则串口激活,否则保持静音。
如果节点地址为4bit,则ADD[3:0]有效,串口接收的第一个字节为地址的情况下,只使用该字节的[3:0]进行地址匹配,所以,如果地址为0x2,发送0xf2 或 0x92 都可以匹配成功。所以在设置4bit地址时,注意避免地址重复错误。
注意:处于静音模式下的从机一旦被激活,都需要从新进入,串口不会默认自动重新进入静音模式。

  1. 函数分析
  2. HAL库函数
    HAL库函数以STM32G070RBT6为例,使用上位机串口助手模拟主机,一个STM32G070RBT6核心板为从机,模拟串口多机通信的过程。实际串口多机通信只需要实现从机的TX引脚相与即可(即从机TX脚配置为开漏输出,连接到一起)。
    1.1串口初始化配置
    在这里插入图片描述

串口初始化的参数与通常的串口通信参数一致,只是初始化函数由HAL_UART_Init 改变为HAL_MultiProcessor_Init。初始化后使能多机通信(HAL_MultiProcessor_EnableMuteMode),然后根据多机通信类型进入静音模式(HAL_MultiProcessor_EnterMuteMode)。
HAL库涉及的函数就3个,如果需要配置7bit节点地址,增加一个设置节点地址长度的函数HAL_MultiProcessorEx_AddressLength_Set。
1.2 空闲线路检测(WAKE = 0)
执行下方红框内的函数,对多机通信的清除标志位、唤醒方法和使能多机通信模式进行了设置,接下来就是等待至少一个字节后进入静音模式。
在这里插入图片描述

进入静音模式:在中断进入静音模式。
在这里插入图片描述

1.3 地址标记检测(WAKE = 1)
地址标记检测可以直接配置进入静音模式。
在这里插入图片描述
在这里插入图片描述

  1. LL库函数
    LL库在此不做过多的解释,配置流程都是一样的,只不过函数名会有所区别。
    在这里插入图片描述

上图是设置进入静音模式的模式和地址,使能多处理器通信模式,最后一行代码申请进入静音模式。上面使用的是地址标记的方法,所以不需要接收至少一个字节。下面的代码块使用的是空闲线路检测法,必须至少接收一个字节才能进入静音模式成功。
在这里插入图片描述

红框内是配置多机通信用到的函数,从函数名即可看出它的意义。这里不重复解释。因为CSDN无法直接上传本人的工程代码(估计是因为工程里面有官方的库函数文件,有许可证权限),有需要源码的朋友可私聊我。

本人也是初入职场的小白,工作任务繁忙,文笔有限,难免纰漏,请大家多多斧正。

版权声明:本文为CSDN博主「派大星不爱敲代码」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43495491/article/details/121478658

生成海报
点赞 0

派大星不爱敲代码

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

RT-Thread Studio移植LAN8720A驱动

RTT网络协议栈驱动移植(霸天虎) 1、新建工程 ​ 工程路径不含中文路径名,工程名用纯英文不含任何符号。 2、用CubeMx配置板子外设 2.1、配置时钟 ​ 按照自己板子配置相应时钟。

Lin总线通信在STM32作为主机代码以及从机程序

距离上次做资料准备已经过去六天了。最近在学车,上周末就没有开电脑。这周开始进行了Lin通信的代码整理,目前是可以正常通信的了,采用的是增强型校验方式。后期再进一步跟进研究。。。更新一博,留

4路红外循迹模块使用教程

4路红外循迹模块使用教程 个人原创博客:点击浏览模块详细信息: 工作电压:DC 3.3V~5V 工作电流:尽量选择1A以上电源供电 工作温度:-10℃~50℃ 安装孔

HAL库串口中断

一,配置串口初始化 void MX_USART1_UART_Init(void) {huart1.Instance USART1;huart1.Init.BaudRate 115200;huart1.Init.WordLen