STM32串口多机通信

发布者:亚瑟摩根最新更新时间:2016-06-30 来源: eefocus关键字:STM32  串口  多机通信 手机看文章 扫描二维码
随时随地手机看文章
从设备采用漏极开路方式级联,从设备的串口TX必须配置为漏极开路,不能是推挽方式,如果配置成推挽方式,会导致灌电流过大,低电平低不下去问题

 

STM32 的UART数据寄存器是9位,数据传输先传低位(LSB)

--实际应用发现9位数据大时候有丢包错包问题??

利用USART可以进行多机处理器通信,其原理就是使从机处于静默模式,由主机在需要的时候发送指令唤醒从机,并传输数据。STM32静默模式特点:1、所有接收状态位都不会被设置;2、所有的接收中断都被禁止;3、USART_CR1寄存器中的RWU位被置1,RUW可以硬件自动控制或者在某些条件下由软件写。
  连接方法很简单,主机的TX输出与从机的RX端口直接相连,从机TX端口要经过与门与主机RX端口连接。
多机通信方式有2种:空闲帧唤醒和地址唤醒。
空闲帧唤醒可以同时唤醒所有从机,在从机处于静默模式时发送空闲帧(即所有位均为1的数据),唤醒多个从机,实现多个从机同步。
地址唤醒可以唤醒单个从机,从机静默时发送地址帧,从机自动对比地址,地址配对正确则该从机唤醒,否则继续进入静默。这样只有被寻址者才被激活,来接收数据,减少由未被寻址的接收机器参与带来的多余的USART服务开销。这种模式下,MSB为1的字节被认为是地址,否则被认为是数据(MSB一般为数据传送的最高位,8位传送则MSB为第八位;9位传送则MSB为第九位)。在一个地址字节中,目标接收者的地址放在低4位。这4位会被接收器拿来和设置在USART_CR2寄存器中ADD位中的自身地址比较。当接收到一个和设置地址相匹配的地址字符时,RWU被清除,后面的字节将正常接收。因为RWU位已经被清除,RXEN位会因为接收到地址符被置1。当从机再次接收到地址符,如若地址不匹配则从机再次进入静默模式。
程序实际编写时可以注意以下3部分的设置:
一、设置静默模式:

函数原形
void USART_WakeUpConfig(USART_TypeDef* USARTx, u16 USART_WakeUp)
其中 USART_WakeUp:USART的唤醒方式:
1、USART_WakeUp_IdleLine  空闲总线唤醒
2、USART_WakeUp_AddressMark  地址标记唤醒
   二、地址唤醒中地址设置:
      函数原形
void USART_SetAddress(USART_TypeDef* USARTx, u8 USART_Address)
      其中USART_Address:是设置 USART 节点的地址。
      例如:USART_SetAddress(USART2, 0x5);
   三、是否进入静默:

         函数原形
void USART_ReceiverWakeUpCmd(USART_TypeDef* USARTx, FunctionalState Newstate)
      其中NewState: USART 静默模式的新状态这个参数可以取:ENABLE或者DISABLE。

 

Address mark detection (WAKE=1)
In this mode, bytes are recognized as addresses if their MSB is a ‘1 else they are
considered as data. In an address byte, the address of the targeted receiver is put on the 4
LSB. This 4-bit word is compared by the receiver with its own address which is programmed
in the ADD bits in the USART_CR2 register.
The USART enters mute mode when an address character is received which does not
match its programmed address. In this case, the RWU bit is set by hardware. The RXNE flag
is not set for this address byte and no interrupt nor DMA request is issued as the USART
would have entered mute mode.
It exits from mute mode when an address character is received which matches the
programmed address. Then the RWU bit is cleared and subsequent bytes are received
normally. The RXNE bit is set for the address character since the RWU bit has been cleared.
The RWU bit can be written to as 0 or 1 when the receiver buffer contains no data (RXNE=0
in the USART_SR register). Otherwise the write attempt is ignored.

 

Bit 1 RWU: Receiver wakeup
This bit determines if the USART is in mute mode or not. It is set and cleared by software
and can be cleared by hardware when a wakeup sequence is recognized.
0: Receiver in active mode
1: Receiver in mute mode
Note: 1: Before selecting Mute mode (by setting the RWU bit) the USART must first receive a
data byte, otherwise it cannot function in Mute mode with wakeup by Idle line detection.
2: In Address Mark Detection wakeup configuration (WAKE bit=1) the RWU bit cannot
be modified by software while the RXNE bit is set.

 

Bit 11 WAKE: Wakeup method
This bit determines the USART wakeup method, it is set or cleared by software.
0: Idle Line
1: Address Mark

 

“logically ANDed ” 指的是逻辑上的关系。某些情况下,不需要另外加与门电路。

比如:板上有3个STM32,1主2从,中间未加电平变换芯片(直连),从机的发送脚都配置成open drain输出并带上拉,这种情况下2个从STM32芯片的TX脚可以 直接连到主STM32芯片的RX脚。

如果用了电平变换芯片比如MAX232,一般需要另外加与门电路。

关键字:STM32  串口  多机通信 引用地址:STM32串口多机通信

上一篇:stm32中断向量表初探
下一篇:STM32软件复位(基于库文件V3.5)

推荐阅读最新更新时间:2024-03-16 14:59

错误解决:STM32F103串口1与串口3相同代码却结果不同
在前几天调试openmv时发现同样的代码串口1和串口3的结果却是不一样的,当时着实是把我坑了很久,怎么都找不到原因,用示波器看波形也是没有问题的,在Openedv网站上有位网友指出是我初始化代码的问题,在翻阅参考手册后终于发现了问题。 下列代码为我原本的初始化代码: #include sys.h #include usart.h #include led.h #include usart3.h int theta_err,rho_err; int main(void) { Stm32_Clock_Init(9); //=====系统时钟设置 delay_init(72); //
[单片机]
错误解决:STM32F103<font color='red'>串口</font>1与<font color='red'>串口</font>3相同代码却结果不同
stm32单片GPIO端口的特点及应用解析
一、GPIO的综合描述 stm32每一个GPIO端口拥有2个32bits的configuration寄存器(GPIOx_CRL,GPIOx_CRH),2个32bits的数据寄存器(GPIOx_IDR,GPIOx_ODR),1个32bits的set/reset寄存器(GPIOx_BSRR),1个16bits的reset寄存器(GPIOx_BRR)和1个32bits的Lock寄存器(GPIOx_LCKR)。 (一)每一个IO引脚都可以使用软件配置为以下几种模式: 1. 浮空输入 2. 带上拉输入 3. 带下拉输入 4. 模拟输入 5. 开漏输出——(此模式可实现hotpower说的真双向IO) 6. 推挽输出 7. 复用功能的推挽
[单片机]
STM32中的位带(bitband)操作(转)
支持了位带操作后,可以使用普通的加载/存储指令来对单一的比特进行读写。在 CM3 中,有两个区中实现了位带。其中一个是 SRAM 区的最低 1MB 范围,第二个则是片内外设区的最低 1MB范围。这两个区中的地址除了可以像普通的 RAM 一样使用外,它们还都有自己的 位带别名区 ,位带别名区把每个比特膨胀成一个 32 位的字。当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的。 位带操作的概念其实 30 年前就有了,那还是8051 单片机开创的先河,如今,CM3 将此能力进化,这里的位带操作是 8051 位寻址区的威力大幅加强版。 CM3 使用如下术语来表示位带存储的相关地址: 位带区:
[单片机]
<font color='red'>STM32</font>中的位带(bitband)操作(转)
散列DMA设计的高速串口驱动技术
       1 概 述   由于串口在电报通信、工控和数据采集等领域有着广泛的应用,绝大多数嵌入式处理器都内置了通用异步收发器(UART)。UART数据传输主要通过中断或DMA的方式实现。   中断方式是在接收到数据或需要发送数据时产生中断,在中断服务程序中读写UART的缓冲区(FIFO)实现数据传输。由于串口通信速率一般比较低(典型值不超过115 200 bps),大多数嵌入式系统都采用中断方式来传输串口数据。然而,中断服务程序需要占用CPU的时间,而串口速度的提升也必将导致CPU更频繁地响应UART中断,这势必会造成嵌入式系统的性能下降。   DMA数据传输无需CPU的参与,是一种更加高效的数据传输方式。现有的D
[电源管理]
散列DMA设计的高速<font color='red'>串口</font>驱动技术
学习STM32(3)-电源、时钟、复位电路
Stm32时钟分析 该分析材料大部分来自opendev论坛,我所做的只不过是加上一些自己的分析和整理,由于个人能力有限,纰漏之处在所难免,欢迎指正。 一、硬件上的连接问题 如果使用内部RC振荡器而不使用外部晶振,请按照如下方法处理: 1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。 2)对于少于100脚的产品,有2种接法: i)OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能。 ii)分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出'0'。此方法可以减小功耗并(相对上面i)节省2个外部电阻。 对上图
[单片机]
学习<font color='red'>STM32</font>(3)-电源、时钟、复位电路
完美实现STM32单总线挂多个DS18B20
一般常见的STM32的关于DS18B20的例程都是检测一个传感器,代码一般都是跳过ROM检测,直接获取温度值。这种写法并不适用于单总线上挂载多个DS18B20的情况,Sandeepin的这个代码就是针对这种情况完善的单总线挂多个DS18B20检测,实现获取每个DS18B20的ID和温度。 主要的DS18B20时序代码没变,增加了搜索ROM函数,获取温度时先匹配ID。 核心代码如下: DS18B20.c文件代码: #include DS18B20.h #include Delay.h #include stdio.h // printf用 #define DS18B20_GPIO_NUM
[单片机]
完美实现<font color='red'>STM32</font>单总线挂多个DS18B20
Moser现货供应STMicroelectronics Nucleo 开发板
贸泽电子(Mouser Electronics)现库存并供应 STMicroelectronics 新型 Nucleo 开发板。此类开发板专为欲使用 ST 的 STM32 产品系列(具有 ARM Cortex M0、Cortex M3 及 Cortex M4 微控制器)进行开发的人士而设计,并与多种扩展板兼容。 Mouser提供的 STMicroelectronics 新型 Nucleo 开发板 支持开发及评估 ST 的 32 位 STM32 微控制器。此新型开发板具有其他微控制器开发生态系统所不具有的多项高级特性。除了惯有的按钮、LED 和一个 USB 调试接口的组合外,Nucleo 板还独具特色地配有两组扩展接口。第一
[单片机]
大神教你如何快速使用DMA处理ADC
ADC: 1.STM32内部的ADC模块有三个ADC1,ADC2,ADC3,他们彼此独立,所以可以进行同步采样。 2ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生,要在RCC_CFGR配置,再ADC自己的寄存器中在没有时钟分频的配置位。 3.ADC转换时间: STM32F103xx增强型产,时钟为56MHz时为1μ s( 时钟为72MHz为1.17 μ s) 4.ADC的转换精度默认设置为12位,输入范围:ADC输入范围:V REF-≤ VIN≤ VREF+ 5.共有18个通道,其中外部16个通道,内部两个通道,内部温度传感器连接在ADC1_IN16,内部参考电压V REFINT连接在ADC1_IN17 6
[单片机]
大神教你如何快速使用DMA处理ADC
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved