标志位和中断位的区别:USART_ClearFlag和USART_ClearITPendingBit


在STM32的函数库中,这两个函数实现的功能其实是一样的,都是清除对应的标志位,但是标志位和中断位的含义不一样,不是所有的标志位都可以产生中断。查看源代码如下:
#define ADC_IT_EOC                                 ((uint16_t)0x0220)
#define ADC_IT_AWD                                 ((uint16_t)0x0140)
#define ADC_IT_JEOC                                ((uint16_t)0x0480)
这是定义的中断位,可以产生中断
#define ADC_FLAG_AWD                               ((uint8_t)0x01)
#define ADC_FLAG_EOC                               ((uint8_t)0x02)
#define ADC_FLAG_JEOC                              ((uint8_t)0x04)
#define ADC_FLAG_JSTRT                             ((uint8_t)0x08)
#define ADC_FLAG_STRT                              ((uint8_t)0x10)
这是定义的标志位,二者对比可以发现有的标志位不能产生中断
标志位在程序中可以作为判定条件,支持程序的运行,中断则是跳转到中断函数执行。两个函数实现的功能是一样的,在中断程序中可以用两个中的任一个。区分两个函数是为了更清晰的显示函数库的严谨。
再具体分析下面的中断位和标志位:
#define ADC_IT_EOC                                 ((uint16_t)0x0220)
#define ADC_FLAG_EOC                               ((uint8_t)0x02)
这两个数值不同是因为标志位只是为了清除标志位而设的,而中断位设置成这个值是因为在其他函数中这一位还有其他用途。而且还要注意:
void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG)
{
     /* Check the parameters */
     assert_param(IS_ADC_ALL_PERIPH(ADCx));
     assert_param(IS_ADC_CLEAR_FLAG(ADC_FLAG));
     /* Clear the selected ADC flags */
     ADCx->SR = ~(uint32_t)ADC_FLAG;
}
这一句ADCx->SR = ~(uint32_t)ADC_FLAG;应该是ADCx->SR &= ~(uint32_t)ADC_FLAG;
不过状态位只能由硬件置位,软件可以读和清零,所以这样写也是可以的。

你可能感兴趣的:(嵌入式系统)