首页 > 技术文章 > 关于USART_ClearITPendingBith和 USART_ClearFlag的区别

baiji 2019-07-19 19:02 原文

int fputc(int ch,FILE *p)
{
	
	USART_SendData(USART1,(u8)ch);
	while(USART_GetITStatus(USART1,USART_IT_TXE) != SET);
	return ch;
}

  今天学到printf实验,结果跑半天就是不知道程序卡在哪个地方,比较板子的源码发现,我的这两个语句用错了,虽然题目不是写的是这个,但道理是一样,所以解释一下

USART_GetITStatus(USART1,USART_IT_TXE)
USART_GetFlagStatus(USART1,USART_FLAG_TXE

第一个是获取中断标志位,而我的程序并不是中断服务函数,所以一直卡在这个循环上,而第二个只是单纯处理完或者获得标志位,和中断无关,所以一定要记住其他的不是中断的函数一定要使用第二个

若是在中断服务函数中,则两者并无区别,可以随意替换

void USART1_IRQHander(void)
{
    u8 r;
    
    if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET)
    {
        r = USART_ReceiveData(USART1);
        USART_SendData(USART1,r);
      while(USART_GetITStatus(USART1,USART_IT_TC) != SET);
    }
    USART_ClearITPendingBit(USART1,USART_FLAG_TC);
}

 

推荐阅读