STM32
直播中

王秀兰

7年用户 1361经验值
私信 关注
[问答]

STM32G030串口使用偶校验,串口不能正常通讯的原因?

在调试STM32G030串口时,串口设置8位数据、1位停止位、无校验时,串口通讯正常;但如果串口设置9位数据、1位停止位、偶校验时,串口不能正常通讯,有哪位高手看下问题出在哪吗?代码如下:
void MX_USART1_UART_Init(void)
{

          LL_USART_InitTypeDef USART_InitStruct = {0};
          LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

         //初始化串口时钟
          LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1);
          LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);
              

//RS485发送接收控制IO初始化,输出端口
        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_NO;
          LL_GPIO_Init(RS485_CTRL_GPIO_Port,  GPIO_InitStruct);
         

/***** USART1 GPIO Configuration *******************
PA9   ------> USART1_TX
PA10   ------> USART1_RX
******************************************************/
          GPIO_InitStruct.Pin = Usart1_TXD_Pin;
          GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
          GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
          GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
          GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
          GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
          LL_GPIO_Init(Usart1_TXD_GPIO_Port,  GPIO_InitStruct);

          GPIO_InitStruct.Pin = Usart1_RXD_Pin;
          GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
          GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
          GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
          GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
          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_9B;                                //9位带偶校验;此处设为8B
          USART_InitStruct.StopBits = LL_USART_STOPBITS_1;                                        //1位停止位
          USART_InitStruct.Parity = LL_USART_PARITY_EVEN;                                        //偶校验;此处设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_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))))
          {
          }

        SetRS485Status(RS485_RECEIVE_DATA_STATUS);
         
}


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

        Datatemp = LL_USART_ReceiveData8(USART1);
}

回帖(1)

陈丽

2024-3-26 18:10:30
根据您提供的代码,可能存在以下问题导致串口不能正常通讯:

1. 代码中没有设置奇偶校验使能的配置。当您需要使用偶校验时,应该在初始化函数中添加如下代码:

```
USART_InitStruct.Parity = LL_USART_PARITY_EVEN;
```

2. 代码中可能没有正确配置GPIO引脚作为USART的功能引脚。请确保初始化函数中的如下代码正确设置了USART引脚:

```
/* USART1 GPIO Configuration  
  PA9     ------> USART1_TX
  PA10     ------> USART1_RX
  */
GPIO_InitStruct.Pin = LL_GPIO_PIN_9|LL_GPIO_PIN_10;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
```

请根据以上提示检查您的代码,确保正确配置奇偶校验和GPIO引脚,并且与要实现的通讯协议一致。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分