在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; 不过状态位只能由硬件置位,软件可以读和清零,所以这样写也是可以的。
标志位和中断位的区别:USART_ClearFlag和USART_ClearITPendingBit
最新推荐文章于 2025-03-18 10:27:27 发布