你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F051串口问题

[复制链接]
谁是谁的谁520 提问时间:2018-9-19 09:41 /
STM32F051支持两路串口,现在一路485是向上,和上位机通讯,另外一路是向下,接模块(主动上传)。。。
问题:1.和上位机通讯的时候,产品经常会死机。2.取消向下接收模块数据,产品正常。3.取消和上位机通讯,产品可以正常接收模块数据
收藏 评论16 发布时间:2018-9-19 09:41

举报

16个回答
谁是谁的谁520 最优答案 回答时间:2018-9-20 10:58:52
谁是谁的谁520 发表于 2018-9-19 16:54
现象如下,刚开始正常,后面发送没有回应,关闭串口,重新打开,又恢复正常,不过产品应该是重启过,数据 ...

问题已解决,原因是USART_GetFlagStatus和USART_GetITStatus,,,,,获取ORE标记,需用USART_GetFlagStatus,然后清0

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2 结帖奖励

查看全部评分

谁是谁的谁520 回答时间:2018-9-19 14:18:10
void InitUart2Config(void)
{
  USART_InitTypeDef USART_InitStructure; //定义串口初始化结构体
  NVIC_InitTypeDef NVIC_InitStructure;
  USART_ClockInitTypeDef usartClock;
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

  /* Enable the USART Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel         = USART2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd      = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  
  USART_DeInit(USART2);//串口状态到初始状态
  USART_InitStructure.USART_BaudRate            = 9600;   //波特率默认为9600
  USART_InitStructure.USART_WordLength          = USART_WordLength_8b;//8位数据
  USART_InitStructure.USART_StopBits            = USART_StopBits_1;//1个停止位
  USART_InitStructure.USART_Parity              = USART_Parity_No ; //无校验位
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//禁用RTSCTS硬件流控制
  USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;//使能发送接收

  usartClock.USART_Clock   = USART_Clock_Disable; //串口同步时钟禁止
  usartClock.USART_CPOL    = USART_CPOL_Low; //时钟下降沿有效
  usartClock.USART_CPHA    = USART_CPHA_2Edge;//数据在第二个时钟沿捕捉
  usartClock.USART_LastBit = USART_LastBit_Disable;  //最后数据位的时钟脉冲不输出到SCLK引脚
  USART_ClockInit(USART2,&usartClock);//初始化串口时钟
  
  USART_Init(USART2, &USART_InitStructure);//初始化调试串口(串口1)
  USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);  //开启接收字节中断
  USART_ITConfig(USART2,USART_IT_IDLE,ENABLE);  //开启接收空闲中断
  USART_Cmd(USART2, ENABLE);//调试串口(串口1)使能
}
谁是谁的谁520 回答时间:2018-9-19 14:17:34
void InitUart1Config(void)
{
  USART_InitTypeDef USART_InitStructure; //定义串口初始化结构体
  NVIC_InitTypeDef NVIC_InitStructure;
  USART_ClockInitTypeDef usartClock;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

  /* Enable the USART Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel         = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd      = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  
  USART_DeInit(USART1);//串口状态到初始状态
  USART_InitStructure.USART_BaudRate            = BusBaudRate;   //波特率默认为9600
  USART_InitStructure.USART_WordLength          = USART_WordLength_8b;//8位数据
  USART_InitStructure.USART_StopBits            = USART_StopBits_1;//1个停止位
  USART_InitStructure.USART_Parity              = USART_Parity_No ; //无校验位
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//禁用RTSCTS硬件流控制
  USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;//使能发送接收

  usartClock.USART_Clock   = USART_Clock_Disable; //串口同步时钟禁止
  usartClock.USART_CPOL    = USART_CPOL_Low; //时钟下降沿有效
  usartClock.USART_CPHA    = USART_CPHA_2Edge;//数据在第二个时钟沿捕捉
  usartClock.USART_LastBit = USART_LastBit_Disable;//最后数据位的时钟脉冲不输出到SCLK引脚
  USART_ClockInit(USART1,&usartClock);//初始化串口时钟
  
  USART_Init(USART1, &USART_InitStructure);//初始化串口
  USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启接收中断
  USART_Cmd(USART1, ENABLE);//调试串口(串口1)使能
}
谁是谁的谁520 回答时间:2018-9-19 15:31:43
void USART2_IRQHandler(void)
{
  if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET)//接收一字节数据
  {
    if(FlagIdle == 1)
    {
      Com2RevBuff[Com2RecvPtr++]= USART_ReceiveData(USART2);
      if(Com2RevBuff[0] == 0x42)
      {
        if(Com2RecvPtr >= 24)
        {
          FlagIdle = 2;
          Com2RecvPtr = 0;
        }
      }
      else
      {
        Com2RecvPtr = 0;
      }
    }
    else
    {
      USART_ReceiveData(USART2);
      Com2RecvPtr = 0;
    }
  }
  
  if(USART_GetITStatus(USART2,USART_IT_ORE) != RESET)//接收一字节数据
  {
    USART_ClearFlag(USART2, USART_FLAG_ORE);
    USART_ReceiveData(USART2);
  }
}
butterflyspring 回答时间:2018-9-19 12:19:58
你说的死机,是指MCU不运行了?建议你还是调试看看,是MCU真的死机了,还是只是信息没发出去

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

谁是谁的谁520 回答时间:2018-9-19 13:34:05
butterflyspring 发表于 2018-9-19 12:19
你说的死机,是指MCU不运行了?建议你还是调试看看,是MCU真的死机了,还是只是信息没发出去 ...

只要断开上位机发送,产品就会重启,然后恢复正常
wenyangzeng 回答时间:2018-9-19 14:03:35
与上位机进行的485通讯应该判别上位机送来的地址码是否是本机的,如果不是本机的地址码就取消不通讯,否则通讯总线会占用。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

谁是谁的谁520 回答时间:2018-9-19 14:10:11
wenyangzeng 发表于 2018-9-19 14:03
与上位机进行的485通讯应该判别上位机送来的地址码是否是本机的,如果不是本机的地址码就取消不通讯,否则 ...

确实是本机的地址码,就是设备每次都是运行一段时间。刚开始上位机发过来,产品也有返回。。。过一段时间,一直在发相同的命令,就没有回应了。。。。断开上位机发送一下,会看到产品重启,然后又恢复正常。。。。。然后按照上面的逻辑,是不是就会貌似死机的现象
谁是谁的谁520 回答时间:2018-9-19 14:18:33
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1);//配置为TXD、RXD
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_9 | GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
wenyangzeng 回答时间:2018-9-19 15:17:30
谁是谁的谁520 发表于 2018-9-19 14:18
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1);//配置为TXD、RXD
  GPIO_PinAFConfig(GPIOA, GPIO ...

那应该考虑接收中断如果发生溢出需要先读SR,再读DR寄存器

USART_ClearFlag(USART2,USART_FLAG_ORE);        //读SR
USART_ReceiveData(USART2);                                //读DR
谁是谁的谁520 回答时间:2018-9-19 15:32:26
wenyangzeng 发表于 2018-9-19 15:17
那应该考虑接收中断如果发生溢出需要先读SR,再读DR寄存器

USART_ClearFlag(USART2,USART_FLAG_ORE);        // ...

加了一个溢出中断判定,好像还是不行
谁是谁的谁520 回答时间:2018-9-19 15:33:31
{
  if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) != RESET)
  {
    Com1Recv.Buff[Com1Recv.Ptr++] = USART_ReceiveData(USART1);
    if(Com1Recv.Ptr >= MAX_BYTES_COM_RECV)  //溢出了,丢掉
    {
      Com1Recv.Ptr = 0;
    }
  }
  
  if(USART_GetITStatus(USART1,USART_IT_ORE) != RESET)//接收一字节数据
  {
    USART_ClearFlag(USART1, USART_FLAG_ORE);
    USART_ReceiveData(USART1);
  }
}
谁是谁的谁520 回答时间:2018-9-19 15:34:04
串口一是与上位机通讯,,,串口2是接收模块数据,模块一直主动上传
谁是谁的谁520 回答时间:2018-9-19 15:37:34
wenyangzeng 回答时间:2018-9-19 16:30:10
谁是谁的谁520 发表于 2018-9-19 15:34
串口一是与上位机通讯,,,串口2是接收模块数据,模块一直主动上传

ST官方文档可以参考:
UART的断帧检测.pdf (112.24 KB, 下载次数: 6)
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版