关于STM32的USART_GetFlagStatus和USART_GetITStatus解析(异步通信)

发布者:绿意盎然最新更新时间:2019-12-03 来源: eefocus关键字:STM32  USART_GetFlagStatus  USART_GetITStatus  异步通信 手机看文章 扫描二维码
随时随地手机看文章

前言


STM32固件库中提供了串口收发的标志位函数,包括USART_GetFlagStatus(…,…);和USART_GetITStatus(…,…);,两者容易混淆,重点区别就在于:前者返回值是中断标志位状态(读SR寄存器),后者返回值是中断发生与否的判断(读CR寄存器),以下主要对这两个函数进行分析。


一、USART_GETFlagStatus(…,…)


/**

  * @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;

}


1.代码解析


该函数用于检测串口中断标志位的状态。 

其中,24、25、29三行用于检测所用参数是否符合该函数的范围。该函数的第一个形参只能是USART1,USART2,USART3,UART4,UART5,第二个形参只能是以下内容: 

 这里写图片描述 

从32行开始,检测SR寄存器的状态,在SET和RESET中进行比较。


2.函数使用


函数返回值为SET或RESET,即可直接用于判断。 

在没有使能相应的中断函数时,通常使用该函数来判断标志位是否置位。 

但串口触发中断后,需要清除标志位,由文章后部分描述。


二、USART_GetITStatus(…,…)


/**

  * @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;  

}


1.代码解析


代码中分别读取串口控制寄存器CR1,CR2,CR3的状态,获取中断发生的动作,返回SET或RESET。 

这里写图片描述

2.函数使用


函数返回值为SET或RESET,即可直接用于判断。 

除了可以判断中断标志位外,还能判断是否发生了中断。 

但串口触发中断后,需要清除标志位,由文章后部分描述。


三、 USART_ClearFlag(…,…);


/**

  * @brief  Clears the USARTx's pending flags.

  * @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 clear.

  *   This parameter can be any combination 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_TC:   Transmission Complete flag.

  *     @arg USART_FLAG_RXNE: Receive data register not empty flag.

  *   

  * @note

  *   - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun 

  *     error) and IDLE (Idle line detected) flags are cleared by software 

  *     sequence: a read operation to USART_SR register (USART_GetFlagStatus()) 

  *     followed by a read operation to USART_DR register (USART_ReceiveData()).

  *   - RXNE flag can be also cleared by a read to the USART_DR register 

  *     (USART_ReceiveData()).

  *   - TC flag can be also cleared by software sequence: a read operation to 

  *     USART_SR register (USART_GetFlagStatus()) followed by a write operation

  *     to USART_DR register (USART_SendData()).

  *   - TXE flag is cleared only by a write to the USART_DR register 

  *     (USART_SendData()).

  * @retval None

  */

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;

}


1.代码解析


该函数用于软件清除标志位。 

例如,常用的参数为USART_FLAG_RXNE,库中定义的参数为0x0020,取反后为0xFFDF,恰好可以使SR寄存器的RXNE位置零(根据参考手册)。同时根据函数note,USART_FLAG_RXNE也可以通过读DR寄存器进行清位,即调用函数USART_ReceiveData();。


2.函数使用


可以用在中断处理函数中对标志位进行清除操作。


四、USART_ClearITPendingBit(…,…);


/**

  * @brief  Clears the USARTx's interrupt pending bits.

  * @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 interrupt pending bit to clear.

  *   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_TC:   Transmission complete interrupt. 

  *     @arg USART_IT_RXNE: Receive Data register not empty interrupt.

  *   

  * @note

  *   - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun 

  *     error) and IDLE (Idle line detected) pending bits are cleared by 

  *     software sequence: a read operation to USART_SR register 

  *     (USART_GetITStatus()) followed by a read operation to USART_DR register 

  *     (USART_ReceiveData()).

  *   - RXNE pending bit can be also cleared by a read to the USART_DR register 

  *     (USART_ReceiveData()).

  *   - TC pending bit can be also cleared by software sequence: a read 

  *     operation to USART_SR register (USART_GetITStatus()) followed by a write 

  *     operation to USART_DR register (USART_SendData()).

  *   - TXE pending bit is cleared only by a write to the USART_DR register 

  *     (USART_SendData()).

  * @retval None

  */

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_ClearFlag(…,…);功能相同,都是对SR寄存器某位进行清除操作,只是概念不一样。 

例如,常用的参数为USART_IT_RXNE,库中定义的参数为0x0525,进入函数中itmask的值为0x20,取反为0xDF,恰好可以使SR寄存器的RXNE位置零(根据参考手册)。同时根据函数note,USART_FLAG_RXNE也可以通过读DR寄存器进行清位,即调用函数USART_ReceiveData();。

[1] [2]
关键字:STM32  USART_GetFlagStatus  USART_GetITStatus  异步通信 引用地址:关于STM32的USART_GetFlagStatus和USART_GetITStatus解析(异步通信)

上一篇:stm8s iar printf打印信息
下一篇:STM32 死在 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)

推荐阅读最新更新时间:2024-11-13 15:42

STM32的内部温度传感器
1、STM32的内部温度传感器 STM32内部温度传感器与ADC的通道16相连,与ADC配 合使用实现温度测量。测量范围–40~125℃,精度 ± 1.5℃ 操作流程: 1)、设置ADC相关参数 // ADC1 configuration ----------------------------- ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_Init
[单片机]
STM32的ADC的原理与使用
一、ADC的原理及定义 Analog-to-Digital Converter的缩写。中文译名:模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。其实就是一个取样、量化、编码的一个过程。 典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。比如电量、光照传感器等常用。 ---------------------------------------------------------------------------------------------------------------------------------------------------------
[单片机]
<font color='red'>STM32</font>的ADC的原理与使用
STM32串口USART通信总结
一、GPIO设置 /**************************************************************************** * Function Name : GPIO_Configuration * Description : * Input : None * Output : None * Return : None ****************************************************************************/ void GPIO_Configuration(void) { RCC_APB2PeriphClo
[单片机]
STM32引脚模式GPIOMode_TypeDef
① 浮空输入_IN_FLOATING //串口输入 ② 带上拉输入_IPU ③ 带下拉输入_IPD ④ 模拟输入_AIN ⑤ 开漏输出_OUT_OD ⑥ 推挽输出_OUT_PP //置位 ⑦ 复用功能的推挽输出_AF_PP //串口输出 ⑧ 复用功能的开漏输出_AF_OD 推挽输出与开漏输出的区别 推挽输出:可以输出高,低电平,连接数字器件; 开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内). 推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止
[单片机]
ST吸引Linux用户使用STM32微控制器免费开发嵌入式应用
意法半导体(STMicroelectronics,简称ST)为包括工程师、学者和业余爱好者等在内的Linux 系统用户拓展了使用广受欢迎的意法半导体STM32微控制器免费开发应用的机会。 大多数Linux发行版都是免费使用的,开源应用软件让技术发烧友对Linux着迷。不过,此前市面上常见的嵌入式计算技术开发工具多数只支持Windows PC平台。 现在,STM32CubeMX配置器及初始化工具和System Workbench for STM32(由Ac6 Tools公司开发的集成开发环境(IDE),得到openSTM32.org社区的支持、可在www.st.com/sw4stm32上下载)已经上市并都能在Linux操
[嵌入式]
ST吸引Linux用户使用<font color='red'>STM32</font>微控制器免费开发嵌入式应用
关于stm32单片机,用id加密,明码安全问题分析
stm32 提供的 id ,可以让我们进行软件加密, 这个功能挺好的, 但是我研究了一下明码加密的弱点, 贴出来,给大家研究一下, 写了一段简单的代码,如下,效验id 程序就是输出 ok1, 来代表id的明码对比, 然后我们生成hex文件, 这个hex文件,就是我们明码加密后的烧写文件, 当这个文件烧写到指定的id 设备上,才能运行 ,我们测试是 输出ok1; 加密过程已经ok, 下面 我们分析一下弱点, 单片机声明的常量, 编译器会进行编译,并固化到flash区域, 基本上大多数单片机编译器都是这么做的, 所以
[单片机]
关于<font color='red'>stm32</font>单片机,用id加密,明码安全问题分析
基于STM32的平衡小车设计过程分享(2)
一、简介 续上文,电机驱动部分完成,接下来我们给他加上一个OLED的显示功能和MPU6050的姿态检测功能 二、姿态角显示开发 2.1 MPU6050简介 MPU6050是一种集成了3轴陀螺仪和3轴加速度计的数字运动处理器。它由英飞凌公司开发,可用于测量物体的角速度、加速度和方向,广泛应用于机器人、无人机、游戏手柄、智能手机和运动监测等领域。MPU6050采用I2C接口进行通信,具有低功耗、高精度、小尺寸等特点,是一款非常优秀的运动传感器。 2.2 OLED简介 OLED(Organic Light Emitting Diode)是有机发光二极管,是一种新型的显示技术。与传统的液晶显示屏相比,OLED显示
[单片机]
基于<font color='red'>STM32</font>的平衡小车设计过程分享(2)
STM32-2-GPIO
最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多: (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉输入 (5)GPIO_Mode_Out_OD 开漏输出 (6)GPIO_Mode_Out_PP 推挽输出 (7)GPIO_Mode_AF_OD 复用开漏输出 (8)GPIO_Mode_AF_PP 复用推挽输出 对于刚入门的新手,我想这几个概念是必须得搞清楚的,平时接触的最多的也就是推挽输出、开漏输出、上拉输入这三种,但一直未曾对这些做过归纳。因此,在这里做一个总
[单片机]
STM32-2-GPIO
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved