打印
[应用相关]

STM32多机通信问题

[复制链接]
760|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
逢dududu必shu|  楼主 | 2021-8-5 22:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
利用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位中的自身地址比较。当接收到一个和设置地址相匹配的地址字符时,RWN被清除,后面的字节将正常接收。因为RWU位已经被清除,RXEN位会因为接收到地址符被置1。当从机再次接收到地址符,如若地址不匹配则从机再次进入静默模式。

使用特权

评论回复
沙发
逢dududu必shu|  楼主 | 2021-8-5 22:12 | 只看该作者
程序实际编写时可以注意以下3部分的设置:
一、设置静默模式:

函数原形
void USART_WakeUpConfig(USART_TypeDef* USARTx, u16 USART_WakeUp)
其中 USART_WakeUp:USART的唤醒方式:
1、USART_WakeUp_IdleLine  空闲总线唤醒
2、USART_WakeUp_AddressMark  地址标记唤醒

使用特权

评论回复
板凳
逢dududu必shu|  楼主 | 2021-8-5 22:12 | 只看该作者
#define USART_WakeUp_IdleLine                ((uint16_t)0x0000)

#define USART_WakeUp_AddressMark             ((uint16_t)0x0800)

#define CR1_WAKE_Mask             ((uint16_t)0xF7FF)

void USART_WakeUpConfig(USART_TypeDef* USARTx, uint16_t USART_WakeUp)

{



  assert_param(IS_USART_ALL_PERIPH(USARTx));

  assert_param(IS_USART_WAKEUP(USART_WakeUp));



  USARTx->CR1 &= CR1_WAKE_Mask;    (uint16_t)0xF7FF

  USARTx->CR1 |= USART_WakeUp;       (uint16_t)0x0800

}

使用特权

评论回复
地板
逢dududu必shu|  楼主 | 2021-8-5 22:13 | 只看该作者


   二、地址唤醒中地址设置:
      函数原形
void USART_SetAddress(USART_TypeDef* USARTx, u8 USART_Address)
      其中USART_Address:是设置 USART 节点的地址。
      例如:USART_SetAddress(USART2, 0x5);

void USART_SetAddress(USART_TypeDef* USARTx, uint8_t USART_Address)

{



  assert_param(IS_USART_ALL_PERIPH(USARTx));

  assert_param(IS_USART_ADDRESS(USART_Address));

   



  USARTx->CR2 &= CR2_Address_Mask;  (uint16_t)0xFFF0



  USARTx->CR2 |= USART_Address;

}

使用特权

评论回复
5
逢dududu必shu|  楼主 | 2021-8-5 22:14 | 只看该作者
三、是否进入静默:

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

使用特权

评论回复
6
逢dududu必shu|  楼主 | 2021-8-5 22:15 | 只看该作者
void USART_ReceiverWakeUpCmd(USART_TypeDef* USARTx, FunctionalState NewState)

{



  assert_param(IS_USART_ALL_PERIPH(USARTx));

  assert_param(IS_FUNCTIONAL_STATE(NewState));



  if (NewState != DISABLE)

  {

   

    USARTx->CR1 |= CR1_RWU_Set;

  }

  else

  {

   

    USARTx->CR1 &= CR1_RWU_Reset;

  }

}

使用特权

评论回复
7
guijial511| | 2021-8-6 07:47 | 只看该作者
学习了,感谢分享。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

451

帖子

0

粉丝