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

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 结帖奖励

查看全部评分

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: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 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: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: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);
  }
}
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版