STM32串口通信死在 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

STM32 死在 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

,我使能了啊、USART_Cmd(USART1, ENABLE);

我还是死在了这里求指教

而且我单独直接使用USART_SendData这个函数发送也不行

  • 以下回答由chatgpt基于相关博客总结生成:

    根据参考资料中提到的USART_FLAG_TXE的作用,可以判断出程序一直卡在while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)这一行是因为发送缓冲区还未空,所以无法向其中补充新的数据。因此,我们可以通过以下步骤来解决问题:

    1. 确认USART1是否正确使能,可以使用以下代码:
      USART_InitTypeDef USART_InitStructure;
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//使能USART1
      USART_InitStructure.USART_BaudRate = 115200;
      USART_InitStructure.USART_WordLength = USART_WordLength_8b;
      USART_InitStructure.USART_StopBits = USART_StopBits_1;
      USART_InitStructure.USART_Parity = USART_Parity_No;
      USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
      USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
      USART_Init(USART1, &USART_InitStructure);
      USART_Cmd(USART1, ENABLE);
    
    1. 在发送数据之前,先检查USART_FLAG_TXE是否为SET,只有在该标志位为SET的情况下,才能向发送缓冲区写入数据,相当于判断发送缓冲区是否为空,可以使用如下代码:
      while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //等待发送缓冲区为空
      USART_SendData(USART1, data);//向发送缓冲区写入数据
    

    或者使用中断的方式发送数据,等待缓冲区为空的中断,例如:

      NVIC_InitTypeDef NVIC_InitStructure;
      USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //使能中断
      NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //指定中断通道
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);
    

    在USART1_IRQHandler函数中检查USART_FLAG_TXE是否为SET,如果是,则调用USART_SendData函数向发送缓冲区写入数据。

    1. 如果以上两种方法仍不能解决问题,可以尝试使用USART_FLAG_TC标志位来检查数据是否发送完成,如果发送完成,则可以继续向发送缓冲区写入数据,例如:
      while (1) {
        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//等待发送缓冲区为空
        USART_SendData(USART1, data);//向发送缓冲区写入数据
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//等待数据发送完成
      }
    

USART1时钟使能了吗?