STM32 串口多处理器通信
1.原理分析
-
串口通信原理
STM32的USART全称为通用同步异步收发器,能够灵活实现同步、异步、半双工、全双工的数据交换。由于通信时数据按照bit的方式在一根数据线上传输,所以也被称为串行接口,简称串口。
关于STM32的通信特点与原理介绍,网上优秀博主的介绍不计其数,有兴趣深入了解可点击此链接网址:STM32串口通信原理介绍 。本文主要介绍多处理器通信的原理与实现流程。 -
多处理器通信(以下简称多机通信)
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地址时,注意避免地址重复错误。
注意:处于静音模式下的从机一旦被激活,都需要从新进入,串口不会默认自动重新进入静音模式。
- 函数分析
-
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)
地址标记检测可以直接配置进入静音模式。
-
LL库函数
LL库在此不做过多的解释,配置流程都是一样的,只不过函数名会有所区别。
上图是设置进入静音模式的模式和地址,使能多处理器通信模式,最后一行代码申请进入静音模式。上面使用的是地址标记的方法,所以不需要接收至少一个字节。下面的代码块使用的是空闲线路检测法,必须至少接收一个字节才能进入静音模式成功。
红框内是配置多机通信用到的函数,从函数名即可看出它的意义。这里不重复解释。因为CSDN无法直接上传本人的工程代码(估计是因为工程里面有官方的库函数文件,有许可证权限),有需要源码的朋友可私聊我。
本人也是初入职场的小白,工作任务繁忙,文笔有限,难免纰漏,请大家多多斧正。