发布网友
发布时间:2022-03-24 10:32
共5个回答
热心网友
时间:2022-03-24 12:02
实际上两个函数实现的功能是一样的,都是清除相对应的标志位,只是标志位和中断位含义不一样,是标志位但是不一定会产生中断。例如:
#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;
其实状态位只能有硬件置位,软件只能读和清零,所以这样写也是正确的。
OK,问题总是越辩越清晰的。
热心网友
时间:2022-03-24 13:20
实际上两个函数实现的功能是一样的,都是清除相对应的标志位,只是标志位和中断位含义不一样,是标志位但是不一定会产生中断。例如:
#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;
其实状态位只能有硬件置位,软件只能读和清零,所以这样写也是正确的。
高中数学函数更难,要灵活运用。
一般地,形如y=kx+b(k≠0,k,b是常数),那么y叫做x的一次函数。其中x是自变量,y是因变量,k为一次项系数,其图像为一条直线。当b=0时,y=kx+b即y=kx,原函数变为正比例函数,其函数图像为一条通过原点的直线。所以说正比例函数是一种特殊的一次函数,但一次函数不是正比例函数。
热心网友
时间:2022-03-24 14:54
一个是清除标志,一个是清除中断预处理位,里面函数是一样的,可能是为了兼容其他系列或者为以后升级预留。
一个是清除标志,判断中断是否处理完。
一个是清除中断标志位,根据标志位来执行相应的中断函数。
一个是在入口(是否触发某个中断),一个是在出口(是否完成某个中断)。
热心网友
时间:2022-03-24 16:46
两个清除函数.USART_ClearFlag 清除完成标志位 USART_ClearITPendingBit清除中断标志位
void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG)USART_FLAG_TC/RXNE的值分别是 u16型 二进制5/6位 (对应寄存器TC,RXNE)为1.
USART_IT_TC/RXNE 的值分别是 0x626 0x525 右移8位后分别是 0110 (6) / 0101(5) 0x01 左移 5/6位
热心网友
时间:2022-03-24 18:54
嗯,同步串口,你看看整个函数的实现呢?
另外看看各个标志位的定义和函数的context,应该就明白了。