
以下是我对标志位和中断位的看法:在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;不过状态位只能由硬件置位,软件可以读和清零,所以这样写也是可以的。; z' T& k v( v, |7 k4 u |