请选择 进入手机版 | 继续访问电脑版

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

STM32G030串口能中断,但接收数据错误

[复制链接]
hhccxw 提问时间:2022-8-12 20:55 / 未解决
使用STM32G030接收和发送RS485的数据,发送数据正常,接收数据时串口能进中断,但数据不正确(RXD和TXD外部都有上拉电阻10K)。使用USB转串口设备RXD脚接到MCU的RXD口(TTL电平),USB转串口设备能接收正确数据,看有没哪位高手帮忙分析下,代码如下:

void USART1_IRQHandler(void)
{
        u8 UartData;
       
        if( LL_USART_IsActiveFlag_RXNE(USART1) == RESET )                                        //未检测到串口中断
                return;

        UartData=LL_USART_ReceiveData8(USART1);                                   //读取数据
        LL_USART_RequestRxDataFlush(USART1);
        USART1_SendByte(UartData);                

        if( (UartData==0x88)||(UartData==0x99)||(UartData==0xAA)||(UartData==0xBB)||(UartData==0xCC))
                LL_GPIO_TogglePin(MCU_RUN_LED_GPIO_Port,MCU_RUN_LED_Pin);       
}

void MX_USART1_UART_Init(void)
{

  LL_USART_InitTypeDef USART_InitStruct = {0};

  LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* Peripheral clock enable */
  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1);

  LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);
  GPIO_InitStruct.Pin = RS485_CTRL_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  LL_GPIO_Init(RS485_CTRL_GPIO_Port, &GPIO_InitStruct);

  LL_GPIO_ResetOutputPin(RS485_CTRL_GPIO_Port,RS485_CTRL_Pin);

  /***** USART1 GPIO Configuration *******************
  PA9   ------> USART1_TX
  PA10   ------> USART1_RX
  ******************************************************/

  LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);
  GPIO_InitStruct.Pin = Usart1_TXD_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
  LL_GPIO_Init(Usart1_TXD_GPIO_Port, &GPIO_InitStruct);

  LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);
  GPIO_InitStruct.Pin = Usart1_RXD_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
  LL_GPIO_Init(Usart1_RXD_GPIO_Port, &GPIO_InitStruct);

  /* USART1 interrupt Init */
  NVIC_SetPriority(USART1_IRQn, 1);
  NVIC_EnableIRQ(USART1_IRQn);

  USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1;
  USART_InitStruct.BaudRate = BAUDRATE;
  USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
  USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
  USART_InitStruct.Parity = LL_USART_PARITY_NONE;
  USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
  USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
  USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
  LL_USART_Init(USART1, &USART_InitStruct);
  LL_USART_SetTXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8);
  LL_USART_SetRXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8);
  LL_USART_DisableFIFO(USART1);
  //LL_USART_EnableFIFO(USART1);
  LL_USART_ConfigAsyncMode(USART1);

  LL_USART_Enable(USART1);
  LL_USART_EnableIT_RXNE(USART1);
  LL_USART_EnableIT_PE(USART1);

  /* Polling USART1 initialisation */
  while((!(LL_USART_IsActiveFlag_TEACK(USART1))) || (!(LL_USART_IsActiveFlag_REACK(USART1))))
  {
  }

}


void USART1_SendByte(u8 newData)
{
        LL_GPIO_SetOutputPin (RS485_CTRL_GPIO_Port,RS485_CTRL_Pin);
       
        while( LL_USART_IsActiveFlag_TC(USART1)==0 );                        //等待串口旧数据发送完成               
                LL_USART_TransmitData8(USART1,newData);                          //数据从串口发送出去
        while( LL_USART_IsActiveFlag_TC(USART1)==0 );                        //等待串口旧数据发送完成               

        LL_GPIO_ResetOutputPin(RS485_CTRL_GPIO_Port,RS485_CTRL_Pin);
}


收藏 评论5 发布时间:2022-8-12 20:55

举报

5个回答
老牛洋车 回答时间:2022-8-13 08:15:00
直接使用UART能接收么?如果可以的话则很可能是RS485电平转换模块的问题。
hhccxw 回答时间:2022-8-13 09:10:43
老牛洋车 发表于 2022-8-13 08:15
直接使用UART能接收么?如果可以的话则很可能是RS485电平转换模块的问题。
...

用USB转串口的设备能正常接收,波特率为57600,我把波特率调低到38400和9600就可以了,调高了配置的Speed也不行,目前没找到问题出在哪里。
废鱼 回答时间:2022-8-13 10:51:53
串口和485之间是如何连接的?建议加个485的转换芯片。要串口是否支持直接连接485。
hhccxw 回答时间:2022-8-13 15:10:02
刚用最小开发板测试了下,开发板可以使用57600波特率使用YModem协议升级;但更换到RS485的板子就有问题,“C”能发出来,后续就停了。改回波特率为38400就成功,其它配置:8位数据、1位停止位、无校验(不能配置带校验,否则不成功,这问题单独发了个帖子)。RS485通过芯片——》光耦隔离——》MCU的TXD和RXD。
huanying 回答时间:2022-8-14 11:37:56
hhccxw 发表于 2022-8-13 15:10
刚用最小开发板测试了下,开发板可以使用57600波特率使用YModem协议升级;但更换到RS485的板子就有问题,“ ...

485是半双工 不能同时收发 ,你要留意
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版