STM32串口中 USART_GetITStatus 与 USART_GetFlagStatus的区别
一、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的区别相关推荐
- USART_GetITStatus和USART_GetFlagStatus的区别
USART_GetITStatus()和USART_GetFlagStatus()的区别 都是访问串口的SR状态寄存器,唯一不同是,USART_GetITStatus()会判断中断是否开启,如果没开启 ...
- 关于STM32串口中 0x0a,0x0d的学习
** 以STM32正点原子的串口接收中断 服务程序为例: ** void USART1_IRQHandler(void) //串口1中断服务程序{u8 Res;#ifdef OS_TICKS_PER_ ...
- USART_IT与USART_FLAG,USART_GetITStatus与 USART_GetFlagStatus
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT) : 不仅会判断标志位是否置1,同时还会判断是否使能了相应的中 ...
- STM32中TIM_ClearFlag和TIM_ClearITPendingBit有什么区别
STM32中TIM_ClearFlag和TIM_ClearITPendingBit有什么区别 /*** @brief Clears the TIMx's pending flags.* @param ...
- 422器件与lvds接收器的区别_SPI、I2C、UART三种串行总线的原理、区别
SPI.I2C.串口.我相信如果你是从事的是嵌入式开发,一定会用到这三种通信协议,串口的话因为和波特率有关,所以一般的CPU或者MCU只会配有两个或者三个串口,而数据的传输,的话SPI和I2C用得会比 ...
- SPI、I2C、UART三种串行总线的原理、区别及应用
SPI协议解析,链接如下 https://blog.csdn.net/weiqifa0/article/details/82765892 I2C协议解析,链接如下 https://blog.csdn. ...
- STM32 HAL库与标准库的区别_浅谈句柄、MSP函数、Callback函数
最近笔者开始学习STM32的HAL库,由于以前一直用标准库进行开发,于是发现了HAL库几点好玩的地方,在此分享. 1.句柄 在STM32的标准库中,假设我们要初始化一个外设(这里以USART为例) 我 ...
- stm32,arm9和arm11三者的区别
STM32外设丰富,没有mmu,可以上ucos等小型系统.arm9外设不够丰富,有mmu,可以上linux.如果想上安卓,至少arm11以上才比较合适. arm7是arm公司推出的以V4指令集设计出来 ...
- stm32跑web服务器和协议栈的区别,STM32与LAN9252构建EtherCAT从站(二):使用SSC生成协议栈和XML文件——丁丁的个人网站...
mdi-chevron-left Last:STM32与LAN9252构建EtherCAT从站(一):项目简介 Next:STM32与LAN9252构建EtherCAT从站(三):LAN9252的XM ...
最新文章
- 03-spring bean
- 贾跃亭画了一个8500亿的大饼
- HTML5各种标签总结(HTML、head)
- 远离极限编程 (Don’t do XP)
- Android性能优化——内存泄漏优化
- Redis 数据同步机制分析
- PHP中this,self,parent的区别
- 黑马程序员python笔记_三年Python程序员平时学习笔记总结,对于学习Python非常有帮助...
- c++判断奇偶_第十一届(今年)蓝桥杯省模拟赛 试题+源码 C/C++详解
- Open CV leaning
- 列和相减 L3-L2
- 字符串的排列组合问题
- 如何批量将 Excel 转换为 jpeg、png、bmp 图片
- 51单片机 74LS138译码器流水灯+Proteus仿真
- markdown 设置目录跳转的简单方法
- python中pillow是什么意思_Python-pillow
- 联想Y470 非虚拟机安装苹果Mac OS X Mavericks 10.9.1教程详解(文字+图片),通俗易懂亲自动手——序列二之镜像写入,引导建立
- RJ45接头 和 RJ48接头的区别
- python字符串转json(python字符串转浮点数)
- 大前端CPU优化技术--NEON intrinsics进阶
热门文章
- Keras深度学习实战——使用深度Q学习进行SpaceInvaders游戏
- Spring -Spring的 DI - 依赖注入的 使用学习
- 编写程序,输入圆的半径,并选择计算面积或周长
- 笔记本电池只能充电到95%-99%之间无法充至100%的原因和处理方案
- python爬取今日头条手机app广告_今日头条App广告采集器的实现
- JAVA电子产品购物平台计算机毕业设计Mybatis+系统+数据库+调试部署
- 游戏运营专员的职责有哪些?提高游戏收入的关键是什么?
- 新款iPad发布:Retina显示屏、A5X、高清摄像头、语音听 ...
- cocos creator 发布IOS版本(五)基础通用功能
- 海思3559开发常识储备:相关名词全解