Wfly. 发表于 2018-11-15 17:24:45

stm32 F407 ,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);
                        
                        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;
}


发表于 2018-11-16 08:32:21

我一般是这样使用的,没有判断TC这个寄存器。
USART_SendData(USART1, ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET )
{
}

nkjiangjian 发表于 2018-11-16 10:42:43

执行USART_SendData(USART1 , buf); 后,数据会传送到发送数据寄存器中,TXE会被置位,发送完才会置位TC。而你这里,数据没有传送到发送数据寄存器,此时TXE是RESET的状态,所以你得程序是在第一句 while(RESET == USART_GetFlagStatus(USART1 , USART_FLAG_TXE));处进入死循环了。


页: [1]
查看完整版本: stm32 F407 ,USART发送数据,TC不能置位