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;
}

  • 26
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值