在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;
不过状态位只能由硬件置位,软件可以读和清零,所以这样写也是可以的。
相关文章
- 03-04基础拾遗:除了&和&&的区别,你还要知道位运算的这5个运算符
- 03-04标志位和中断位的区别:USART_ClearFlag和USART_ClearITPendingBit
- 03-0416位和32位的80X86汇编语言的区别
- 03-04系统64位和32位的区别
- 03-04字符串怎么换行 || 字符串中使用单引号时应该怎么写 || 保留两位小数 || 数字0在if中的意思是false || 什么情况下会会报undefined || null和undefined的区别 ||
- 03-04java中&和&&的区别 位运算
- 03-04X86(32位)与X64(64位)有什么区别,如何选择对应的操作系统和应用程序?
- 03-04Windows内核开发-9-32位和64位的区别