一、ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)在判断相应位是否置1(读SR寄存器)前会先判断相应位的中断是否使能(读CR寄存器)。

所以若使用 while(USART_GetITStatus(USART1,USART_IT_TC) != SET); 来进行判断数据是否发送完成,

注意需使能TC中断 USART_ITConfig(USART1, USART_IT_TC, ENABLE);  否则会一直返回0导致死在while里。

/*** @brief  Checks whether the specified USART interrupt has occurred or not.* @param  USARTx: Select the USART or the UART peripheral. *   This parameter can be one of the following values:*   USART1, USART2, USART3, UART4 or UART5.* @param  USART_IT: specifies the USART interrupt source to check.*   This parameter can be one of the following values:*     @arg USART_IT_CTS:  CTS change interrupt (not available for UART4 and UART5)*     @arg USART_IT_LBD:  LIN Break detection interrupt*     @arg USART_IT_TXE:  Tansmit Data Register empty interrupt*     @arg USART_IT_TC:   Transmission complete interrupt*     @arg USART_IT_RXNE: Receive Data register not empty interrupt*     @arg USART_IT_IDLE: Idle line detection interrupt*     @arg USART_IT_ORE:  OverRun Error interrupt*     @arg USART_IT_NE:   Noise Error interrupt*     @arg USART_IT_FE:   Framing Error interrupt*     @arg USART_IT_PE:   Parity Error interrupt* @retval The new state of USART_IT (SET or RESET).*/
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)
{uint32_t bitpos = 0x00, itmask = 0x00, usartreg = 0x00;ITStatus bitstatus = RESET;/* Check the parameters */assert_param(IS_USART_ALL_PERIPH(USARTx));assert_param(IS_USART_GET_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));}   /* Get the USART register index */usartreg = (((uint8_t)USART_IT) >> 0x05);/* Get the interrupt position */itmask = USART_IT & IT_Mask;itmask = (uint32_t)0x01 << itmask;if (usartreg == 0x01) /* The IT  is in CR1 register */{itmask &= USARTx->CR1;}else if (usartreg == 0x02) /* The IT  is in CR2 register */{itmask &= USARTx->CR2;}else /* The IT  is in CR3 register */{itmask &= USARTx->CR3;}bitpos = USART_IT >> 0x08;bitpos = (uint32_t)0x01 << bitpos;bitpos &= USARTx->SR;if ((itmask != (uint16_t)RESET)&&(bitpos != (uint16_t)RESET)){bitstatus = SET;}else{bitstatus = RESET;}return bitstatus;
}

 二、FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG)直接判断相应位是否置1(读SR寄存器),而不会判断相应中断是否开启,通常可用于没开启相应中断时进行判断,比如只使用了串口接收到数据进入中断时,只需使能 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); 无需再使能多余的中断。

void USART1_IRQHandler(void)
{u8 res;if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)//Receive Data register not empty interrupt{res = USART_ReceiveData(USART1); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) != SET);//判断发送缓冲区是否空USART_SendData(USART1,res);while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);//while(USART_GetITStatus(USART1,USART_IT_TC) != SET);//需使能TC中断}USART_ClearFlag(USART1,USART_FLAG_TC);//USART_ClearITPendingBit(USART1,USART_IT_TC); //与USART_ClearFlag同种效果
}
/*** @brief  Checks whether the specified USART flag is set or not.* @param  USARTx: Select the USART or the UART peripheral. *   This parameter can be one of the following values:*   USART1, USART2, USART3, UART4 or UART5.* @param  USART_FLAG: specifies the flag to check.*   This parameter can be one of the following values:*     @arg USART_FLAG_CTS:  CTS Change flag (not available for UART4 and UART5)*     @arg USART_FLAG_LBD:  LIN Break detection flag*     @arg USART_FLAG_TXE:  Transmit data register empty flag*     @arg USART_FLAG_TC:   Transmission Complete flag*     @arg USART_FLAG_RXNE: Receive data register not empty flag*     @arg USART_FLAG_IDLE: Idle Line detection flag*     @arg USART_FLAG_ORE:  OverRun Error flag*     @arg USART_FLAG_NE:   Noise Error flag*     @arg USART_FLAG_FE:   Framing Error flag*     @arg USART_FLAG_PE:   Parity Error flag* @retval The new state of USART_FLAG (SET or RESET).*/
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG)
{FlagStatus bitstatus = RESET;/* Check the parameters */assert_param(IS_USART_ALL_PERIPH(USARTx));assert_param(IS_USART_FLAG(USART_FLAG));/* The CTS flag is not available for UART4 and UART5 */if (USART_FLAG == USART_FLAG_CTS){assert_param(IS_USART_123_PERIPH(USARTx));}  if ((USARTx->SR & USART_FLAG) != (uint16_t)RESET){bitstatus = SET;}else{bitstatus = RESET;}return bitstatus;
}

总结:我认为在GetITStatus和GetFlagStatus不仅在串口中是这种区别,在其他地方比如外部中断中使用也是类似道理。

以上为本人现阶段学习中所认为,若有错误希望指出相互学习谢谢!

STM32串口中 USART_GetITStatus 与 USART_GetFlagStatus的区别相关推荐

  1. USART_GetITStatus和USART_GetFlagStatus的区别

    USART_GetITStatus()和USART_GetFlagStatus()的区别 都是访问串口的SR状态寄存器,唯一不同是,USART_GetITStatus()会判断中断是否开启,如果没开启 ...

  2. 关于STM32串口中 0x0a,0x0d的学习

    ** 以STM32正点原子的串口接收中断 服务程序为例: ** void USART1_IRQHandler(void) //串口1中断服务程序{u8 Res;#ifdef OS_TICKS_PER_ ...

  3. USART_IT与USART_FLAG,USART_GetITStatus与 USART_GetFlagStatus

    ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)  : 不仅会判断标志位是否置1,同时还会判断是否使能了相应的中 ...

  4. STM32中TIM_ClearFlag和TIM_ClearITPendingBit有什么区别

    STM32中TIM_ClearFlag和TIM_ClearITPendingBit有什么区别 /*** @brief Clears the TIMx's pending flags.* @param ...

  5. 422器件与lvds接收器的区别_SPI、I2C、UART三种串行总线的原理、区别

    SPI.I2C.串口.我相信如果你是从事的是嵌入式开发,一定会用到这三种通信协议,串口的话因为和波特率有关,所以一般的CPU或者MCU只会配有两个或者三个串口,而数据的传输,的话SPI和I2C用得会比 ...

  6. SPI、I2C、UART三种串行总线的原理、区别及应用

    SPI协议解析,链接如下 https://blog.csdn.net/weiqifa0/article/details/82765892 I2C协议解析,链接如下 https://blog.csdn. ...

  7. STM32 HAL库与标准库的区别_浅谈句柄、MSP函数、Callback函数

    最近笔者开始学习STM32的HAL库,由于以前一直用标准库进行开发,于是发现了HAL库几点好玩的地方,在此分享. 1.句柄 在STM32的标准库中,假设我们要初始化一个外设(这里以USART为例) 我 ...

  8. stm32,arm9和arm11三者的区别

    STM32外设丰富,没有mmu,可以上ucos等小型系统.arm9外设不够丰富,有mmu,可以上linux.如果想上安卓,至少arm11以上才比较合适. arm7是arm公司推出的以V4指令集设计出来 ...

  9. stm32跑web服务器和协议栈的区别,STM32与LAN9252构建EtherCAT从站(二):使用SSC生成协议栈和XML文件——丁丁的个人网站...

    mdi-chevron-left Last:STM32与LAN9252构建EtherCAT从站(一):项目简介 Next:STM32与LAN9252构建EtherCAT从站(三):LAN9252的XM ...

最新文章

  1. 03-spring bean
  2. 贾跃亭画了一个8500亿的大饼
  3. HTML5各种标签总结(HTML、head)
  4. 远离极限编程 (Don’t do XP)
  5. Android性能优化——内存泄漏优化
  6. Redis 数据同步机制分析
  7. PHP中this,self,parent的区别
  8. 黑马程序员python笔记_三年Python程序员平时学习笔记总结,对于学习Python非常有帮助...
  9. c++判断奇偶_第十一届(今年)蓝桥杯省模拟赛 试题+源码 C/C++详解
  10. Open CV leaning
  11. 列和相减 L3-L2
  12. 字符串的排列组合问题
  13. 如何批量将 Excel 转换为 jpeg、png、bmp 图片
  14. 51单片机 74LS138译码器流水灯+Proteus仿真
  15. markdown 设置目录跳转的简单方法
  16. python中pillow是什么意思_Python-pillow
  17. 联想Y470 非虚拟机安装苹果Mac OS X Mavericks 10.9.1教程详解(文字+图片),通俗易懂亲自动手——序列二之镜像写入,引导建立
  18. RJ45接头 和 RJ48接头的区别
  19. python字符串转json(python字符串转浮点数)
  20. 大前端CPU优化技术--NEON intrinsics进阶

热门文章

  1. Keras深度学习实战——使用深度Q学习进行SpaceInvaders游戏
  2. Spring -Spring的 DI - 依赖注入的 使用学习
  3. 编写程序,输入圆的半径,并选择计算面积或周长
  4. 笔记本电池只能充电到95%-99%之间无法充至100%的原因和处理方案
  5. python爬取今日头条手机app广告_今日头条App广告采集器的实现
  6. JAVA电子产品购物平台计算机毕业设计Mybatis+系统+数据库+调试部署
  7. 游戏运营专员的职责有哪些?提高游戏收入的关键是什么?
  8. 新款iPad发布:Retina显示屏、A5X、高清摄像头、语音听 ...
  9. cocos creator 发布IOS版本(五)基础通用功能
  10. 海思3559开发常识储备:相关名词全解