STM32
直播中

周棠亨

9年用户 1161经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

stm32F407 USART发送数据,TC不能置位是怎么回事?

void sndMsg(const char *buf , int count)
{
                int iLoop;
        
                for(iLoop = 0 ; iLoop < count ; iLoop++)
                {
                        while(RESET == USART_GetFlagStatus(USART1 , USART_FLAG_TXE));
                        
                        USART_SendData(USART1 , buf[iLoop]);  
                        
                        while(RESET == USART_GetFlagStatus(USART1 , USART_FLAG_TC));   //程序在这里死循环   
                }
}


FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG)
{
  FlagStatus bitstatus = RESET;
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_FLAG(USART_FLAG));

  /* The CTS flag is not available for UART4 and UART5 */
  if (USART_FLAG == USART_FLAG_CTS)
  {
    assert_param(IS_USART_1236_PERIPH(USARTx));
  }

  if ((USARTx->SR   USART_FLAG) != (uint16_t)RESET)         //原因:SR寄存器值为0x80,TXE置位,但此时TC没有置位,移位寄存器数据没有发送完成
  {
    bitstatus = SET;
  }
  else
  {
    bitstatus = RESET;
  }
  return bitstatus;
}



回帖(1)

张宇

2024-4-25 16:58:04
在STM32F407中,USART(通用同步/异步接收/发送器)用于实现串行通信。TC(传输完成)是一个标志位,用于指示USART数据寄存器的传输是否完成。在您提供的代码片段中,您尝试通过一个循环发送一定数量的字符。但是,您没有提供完整的代码,因此我将提供一个完整的示例来说明如何使用USART发送数据并检查TC标志位。

首先,确保您已经正确配置了USART接口。以下是一些关键步骤:

1. 时钟使能:确保为USART接口使能了时钟。
2. GPIO配置:将用于USART通信的GPIO引脚配置为替代功能。
3. USART配置:配置USART的波特率、数据位、停止位等参数。

接下来,提供一个完整的发送函数示例:

```c
#include "stm32f407xx.h"

void USART_SendData(USART_TypeDef *USARTx, uint8_t *buf, int count) {
    int iLoop;
    for (iLoop = 0; iLoop < count; iLoop++) {
        // 等待数据发送完成
        while (!(USARTx->SR & USART_SR_TXE));

        // 发送数据
        USARTx->DR = buf[iLoop];
    }

    // 等待传输完成
    while (!(USARTx->SR & USART_SR_TC));
}
```

在这个示例中,我们首先检查USART_SR_TXE(传输寄存器空)标志位,以确保传输寄存器已经准备好接收新数据。然后,我们将数据写入USART_DR(数据寄存器)以发送数据。在循环结束后,我们再次检查USART_SR_TC(传输完成)标志位,以确保所有数据都已发送完毕。

请注意,这个示例使用了宏定义来访问寄存器,您需要根据实际使用的USART接口(例如USART1、USART2等)替换USART_TypeDef *USARTx。

如果您仍然遇到TC标志位无法置位的问题,请检查以下几点:

1. 确保您的USART配置正确,包括波特率、数据位、停止位等。
2. 确保GPIO引脚已正确配置为USART功能。
3. 检查您的串行通信目标设备是否已正确连接并正常工作。

希望这些信息能帮助您解决问题。如果您需要更多帮助,请提供更详细的代码和问题描述。
举报

更多回帖

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