打印
[应用相关]

STM32G030串口使用偶校验问题

[复制链接]
161|1
手机看帖
扫描二维码
随时随地手机跟帖
楼主
jcky001|  楼主 | 2022-8-15 09:28 | 只看该作者 回帖奖励 |倒序浏览
串口时通过YModem发送.bin文件,无校验时,MCU正常接收数据,成功后闪灯;但使用偶校验时,MCU连第一“C”都没发出来。换了一个简单的开发板,同样的结果,所有操作就改下面两句。STM32F103可以直接改这两个,其它的都不动,但是STM32G303就不行了。
          USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_9B;                                //9位带偶校验;此处设为8B
          USART_InitStruct.Parity = LL_USART_PARITY_EVEN;                                        //偶校验;此处设NONE时串口正常

使用特权

评论回复
沙发
jcky001|  楼主 | 2022-8-16 09:00 | 只看该作者 |阅读模式
在调试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);
}

使用特权

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

本版积分规则

1413

主题

3779

帖子

5

粉丝