问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

USART_ClearFlag和USART_ClearITPendingBit区别

发布网友 发布时间: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)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_CLEAR_FLAG(USART_FLAG));
  /* The CTS flag is not available for UART4 and UART5 */
  if ((USART_FLAG & USART_FLAG_CTS) == USART_FLAG_CTS)
  {
    assert_param(IS_USART_123_PERIPH(USARTx));
  } 
  USARTx->SR = (uint16_t)~USART_FLAG;
}
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT)
{
  uint16_t bitpos = 0x00, itmask = 0x00;
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_CLEAR_IT(USART_IT));
  /* The CTS interrupt is not available for UART4 and UART5 */
  if (USART_IT == USART_IT_CTS)
  {
       assert_param(IS_USART_123_PERIPH(USARTx));
  }   
  bitpos = USART_IT >> 0x08;
  itmask = ((uint16_t)0x01 << (uint16_t)bitpos);
  USARTx->SR = (uint16_t)~itmask;
}

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,应该就明白了。
USART_ClearFlag和USART_ClearITPendingBit区别

实际上两个函数实现的功能是一样的,都是清除相对应的标志位,只是标志位和中断位含义不一样,是标志位但是不一定会产生中断。例如:define ADC_IT_EOC ((uint16_t)0x0220)define ADC_IT_AWD ((uint16_t)0x0140)define ADC_IT_JEOC ((uint16_t)0x0480)这是中断位,可以产生中断...

STM32 USART接收中断程序问题

void USART1_IRQHandler(void)接收中断函数中一直循环,可能是你中断函数的处理程序太多了,导致延时太大,建议你直接在中断处理函数里只放些标志位,中断就改变标志位,在主循环中根据标志位处理判断。并且最好再提高系统时钟频率。你用的115200的速度,有点高! 追问 我发现USART_ClearITPendingBit(USART1,USART_IT_RXNE)...

STM32查询串口中断标志位失败怎么回事?

uint8_t Usart2_RecvByte(void){ while (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET){} LED0=!LED0;return USART_ReceiveData(USART2);}

stm32 f103串口接收中断后回不了主程序,一直在USART2_IRQHandler()中循 ...

USART_ClearITPendingBit(USART2, USART_IT_RXNE);

C语言函数中什么是输出参数?举个简单例子?

C里没有类似于C#的指定ref,out的输入输出参数 它是通过不同的传递参数类型决定其输入输出参数的 如果是传值参数,只能用于输入参数 如果是引用或指针类型,则即可用于输入也可用于输出 如 int fun( int a, int&amp; b, int* c )a 作为输入参数 b和c 可输入也可输出 ...

stm8l152串口中断怎么写

//结束 } } } // PrepareOutputBuffer();} if(USART_GetFlagStatus(UART4, USART_FLAG_ORE)==SET) //溢出清标志 { USART_ClearFlag(EVAL_COM1,USART_FLAG_ORE);//读SR USART_ReceiveData(EVAL_COM1);//读DR } USART_ClearITPendingBit(UART4, USART_IT_RXNE);} ...

如何用dma控制usart发送数据

USART_SendData(USART1,'a');delay_ms(1000);printf("argjiarjfgio\r\n");if(SET == DMA_GetFlagStatus(DMA2_Stream7,DMA_FLAG_TCIF7)){ DMA_ClearFlag(DMA2_Stream7,DMA_FLAG_TCIF7);//DMA_Cmd(DMA2_Stream7,DISABLE);for(i = 0;i&lt;20;i++)usart_tx_buf[i] = i+51;DMA_Cmd...

STM上了操作系统后硬件复位为什么不能重启

USART_ClearITPendingBit(USART3,USART_IT_RXNE);data = (u8)USART_ReceiveData(USART3);} if (USART_GetFlagStatus(USART3, USART_FLAG_PE) != RESET){ USART_ReceiveData(USART3);USART_ClearFlag(USART3, USART_FLAG_PE);} if (USART_GetFlagStatus(USART3, USART_FLAG_ORE) != RESET){ U...

关于stm32串口使用DMA接收数据的问题

USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE); //使能串口2的DMA发送 /*等待DMA传输完成,实际应用中,传输数据期间,可以执行另外的任务 */ while(1){ if(DMA_GetFlagStatus(DMA1_FLAG_TC7)!=RESET)//判断通道7传输完成 { SZ_STM32_LED1Toggle();SZ_STM32_LED2Toggle();DMA_ClearFlag(...

stm32什么触发串口接收中断

USART_IT_RXNE) != RESET) //判断是否有中断 { RxData = USART_ReceiveData(USART1);if(RxData == 0x00 ){ GPIO_SetBits(GPIOB, GPIO_Pin_15);} else { GPIO_ResetBits(GPIOB, GPIO_Pin_15);} } USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除接收终端标志位 } ...

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
学画宝典:中国画技法·石榴图书信息 学画宝典·中国画技法:工笔羊内容简介 中国画技法:木棉花图书信息 中国画技法:麻雀图书信息 吴秉钧福州市美术家协会常务理事 学画宝典·中国画技法:工笔羊图书信息 学画宝典·中国画技法:牵牛花图书信息 学画宝典·中国画技法:杜鹃百合作者简介 苹果电脑录屏功能在哪?教你轻松找到它 苹果电脑录屏不了,可以试试这些方法! stm32can通信和串口的区别 stm32板的usart2设置与usart1有什么区别啊 UART和串口到底有什么区别? 请问MSP430的usart分软件usart和硬件usart,这两种形式在使用中有什么区别吗? USARTs UARTs 有什么区别? usart和uart电平信号 stm32 f405 uart 和usart 的区别 UART与USART有区别么? USART与UART有什么区别? USB3.1究竟比USB3.0接口快多少 usb3.0接口能接3.1吗 usb3.0和usb3.1的区别 usb3.0和3.1差别大吗?有什么区别? USB3.1 Gen1是USB3.0,Gen2才是真3.1吗,和雷电口有什么不同? USB3.1和USB3.0有什么区别,有接口图片吗?接口区别 usb3.1可以用3.0接口吗 usb3.1接口和3.0的区别 usb3.1和3.0的区别,usb3.1有什么优点 usb3.0与usb3.1通用吗?与usb2.0呢? usb3.0和usb3.1接口的区别 stm32f103zet6的UART5使用DMA的问题 SCI 和 UART是什么关系?接口和协议的差别? UART包括什么? USB与USART有什么不同 UART,串口,RS232,RS485等等,之间有什么联系和区别? UART是什么? 请问uart和ttl有什么区别? 怎么识别uart和ttl区别 都是有VCC RX TX GND 分别说明USART在发送期间和接收期间有几种中断事件 什么是USART中的停止位 做cc2530 串口uart0发送字符串时候为什么串口助手中什么也没有 拼多多买完东西老推荐怎么去除? 拼多多怎么清除根据喜好推荐? 拼多多这个精选推荐怎么关闭? 拼多多精选推荐怎么关 拼多多里的关注里推荐店铺怎么删除? 拼多多推广怎么关闭智能推广 拼多多行家帮你选动态怎么关闭 拼多多果园怎么样关闭同城推荐答题拼多多怎样关闭同城推荐? 拼多多精选推荐点击了不想看多久能解除 为什么拼多多老是给我推荐一些女性私密衣物,我是男的,看到后就会那啥了,怎么关闭这些推荐? 拼多多平价菜场推荐如何删除
  • 焦点

最新推荐

猜你喜欢

热门推荐