你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32 F407 ,USART发送数据,TC不能置位

[复制链接]
Wfly. 提问时间:2018-11-15 17:24 /
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;
}


1542273288(1).png
收藏 评论2 发布时间:2018-11-15 17:24

举报

2个回答
废鱼 回答时间:2018-11-16 08:32:21
我一般是这样使用的,没有判断TC这个寄存器。
USART_SendData(USART1, ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET )
{
}

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

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

TIM图片20181226105958_03.jpg

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版