ClearFlag()和ClearITPendingBit()的区别及用法解析

相信部分小伙伴在学习中断时对这两个函数有点懵,乍一看,这两个函数好像没啥区别,但其实还是有细微的区别的,它体现了编程逻辑的严谨,为啥这么说呢,请往下看。
首先我们看看两者的作用:
ClearFlag():清除中断标志位
ClearITPendingBit():清除中断待处理位

在这里,想要明白两个函数的区别就得明白标志位和待处理位是啥:

标志位是事件发生与否的判断依据,用于支持函数的运行,如果事件发生,则该位至1,但是这不一定会产生中断,查阅手册USART寄存器(下图)可以看到,事件发生后,标志位TXE置1,但是想要产生中断,还得将TXEIE位置1(使能中断)。

待处理位是控制中断发生的标志,如果该位置1(前提是相应标志位置1和中断已使能),则会产生中断,进入中断服务函数,而且在中断服务函数中必须手动将该位置0,否则程序会一直执行该中断。
了解完标志位和待处理位的区别,我们就能发现这两个函数的相似之处:ClearFlag()清除了标志位,中断自然不能发生,所以 ClearITPendingBit()和ClearFlag()的作用都是清除中断,在中断服务函数中任选一个使用就行了,更重要的是掌握标志位和待处理位的区别,有兴趣的小伙伴可以看看两个函数的定义。

void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_CLEAR_FLAG(USART_FLAG));

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

void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT)
{
  uint16_t bitpos = 0x00, itmask = 0x00;
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_CLEAR_IT(USART_IT)); 

  /* The CTS interrupt is not available for UART4 and UART5 */
  if (USART_IT == USART_IT_CTS)
  {
    assert_param(IS_USART_1236_PERIPH(USARTx));
  } 
    
  bitpos = USART_IT >> 0x08;
  itmask = ((uint16_t)0x01 << (uint16_t)bitpos);
  USARTx->SR = (uint16_t)~itmask;
}

物联沃分享整理
物联沃-IOTWORD物联网 » ClearFlag()和ClearITPendingBit()的区别及用法解析

发表评论