STM32固件库中提供了串口收发的标志位函数,包括USART_GetFlagStatus(…,…);和USART_GetITStatus(…,…);两者容易混淆

区别就在于:前者返回值是中断标志位状态(读SR寄存器),后者返回值是中断发生与否的判断(读CR寄存器),以下主要对这两个函数进行分析。

一、USART_GETFlagStatus(…,…)

20 FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG)
21 {
22   FlagStatus bitstatus = RESET;
23   /* Check the parameters */
24   assert_param(IS_USART_ALL_PERIPH(USARTx));
25   assert_param(IS_USART_FLAG(USART_FLAG));
26   /* The CTS flag is not available for UART4 and UART5 */
27   if (USART_FLAG == USART_FLAG_CTS)
28   {
29     assert_param(IS_USART_123_PERIPH(USARTx));
30   }
31
32   if ((USARTx->SR & USART_FLAG) != (uint16_t)RESET)
33   {
34     bitstatus = SET;
35   }
36   else
37   {
38     bitstatus = RESET;
39   }
40   return bitstatus;
41 }

代码解析

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

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

2.函数使用

函数返回值为SET或RESET,即可直接用于判断
在没有使能相应的中断函数时,通常使用该函数来判断标志位是否置位。
但串口触发中断后,需要清除标志位,由文章后部分描述

二、USART_GetITStatus(…,…)

20 ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)
21 {
22   uint32_t bitpos = 0x00, itmask = 0x00, usartreg = 0x00;
23   ITStatus bitstatus = RESET;
24   /* Check the parameters */
25   assert_param(IS_USART_ALL_PERIPH(USARTx));
26   assert_param(IS_USART_GET_IT(USART_IT));
27   /* The CTS interrupt is not available for UART4 and UART5 */
28   if (USART_IT == USART_IT_CTS)
29   {
30     assert_param(IS_USART_123_PERIPH(USARTx));
31   }
32
33   /* Get the USART register index */
34   usartreg = (((uint8_t)USART_IT) >> 0x05);
35   /* Get the interrupt position */
36   itmask = USART_IT & IT_Mask;
37   itmask = (uint32_t)0x01 << itmask;
38
39   if (usartreg == 0x01) /* The IT  is in CR1 register */
40   {
41     itmask &= USARTx->CR1;
42   }
43   else if (usartreg == 0x02) /* The IT  is in CR2 register */
44   {
45     itmask &= USARTx->CR2;
46   }
47   else /* The IT  is in CR3 register */
48   {
49     itmask &= USARTx->CR3;
50   }
51
52   bitpos = USART_IT >> 0x08;
53   bitpos = (uint32_t)0x01 << bitpos;
54   bitpos &= USARTx->SR;
55   if ((itmask != (uint16_t)RESET)&&(bitpos != (uint16_t)RESET))
56   {
57     bitstatus = SET;
58   }
59   else
60   {
61     bitstatus = RESET;
62   }
63
64   return bitstatus;
65 }

1.代码解析

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

2.函数使用

函数返回值为SET或RESET,即可直接用于判断。
除了可以判断中断标志位外,还能判断是否发生了中断。
但串口触发中断后,需要清除标志位,由文章后部分描述

三、 USART_ClearFlag(…,…)

27 void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG)
28 {
29   /* Check the parameters */
30   assert_param(IS_USART_ALL_PERIPH(USARTx));
31   assert_param(IS_USART_CLEAR_FLAG(USART_FLAG));
32   /* The CTS flag is not available for UART4 and UART5 */
33   if ((USART_FLAG & USART_FLAG_CTS) == USART_FLAG_CTS)
34   {
35     assert_param(IS_USART_123_PERIPH(USARTx));
36   }
37
38   USARTx->SR = (uint16_t)~USART_FLAG;
39 }

1.代码解析

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

2.函数使用

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

四、USART_ClearITPendingBit(…,…)

28 void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT)
29 {
30   uint16_t bitpos = 0x00, itmask = 0x00;
31   /* Check the parameters */
32   assert_param(IS_USART_ALL_PERIPH(USARTx));
33   assert_param(IS_USART_CLEAR_IT(USART_IT));
34   /* The CTS interrupt is not available for UART4 and UART5 */
35   if (USART_IT == USART_IT_CTS)
36   {
37     assert_param(IS_USART_123_PERIPH(USARTx));
38   }
39
40   bitpos = USART_IT >> 0x08;
41   itmask = ((uint16_t)0x01 << (uint16_t)bitpos);
42   USARTx->SR = (uint16_t)~itmask;
43 }

该函数与USART_ClearFlag(…,…);功能相同,都是对SR寄存器某位进行清除,只是概念不一样
例如,常用的参数为USART_IT_RXNE,库中定义的参数为0x0525,进入函数中itmask的值为0x20,取反为0xDF,恰好可以使SR寄存器的RXNE位置零(根据参考手册)。同时根据函数note,USART_FLAG_RXNE也可以通过读DR寄存器进行清位,即调用函数USART_ReceiveData();。

USART_ClearFlag(…,…);和USART_ClearITPendingBit(…,…);的函数说明里面都有各个参数的清位方式说明。

STM32的USART_GetFlagStatus和USART_GetITStatus解析相关推荐

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

    前言 STM32固件库中提供了串口收发的标志位函数,包括USART_GetFlagStatus(-,-);和USART_GetITStatus(-,-);,两者容易混淆,重点区别就在于:前者返回值是中 ...

  2. STM32的USART_GetFlagStatus和USART_GetITStatus

    ITStatus USART_GetIT函数详解 一开始是把USART_IT_RXNE 0x0505 写成2进制,然后只要它的低八位,然后低八位右移5位,然后得到usartreg的值为0b001,然后 ...

  3. STM32 Ymodem 协议及代码解析

    点击左上角的"关注",定期更新 STM32 最新资讯,总有你想要的信息! STM32 Ymodem 协议及代码解析 文章导图: 1. Ymodem 协议传输效果 1.1 发送端软件 ...

  4. STM32 BSRR BRR ODR 寄存器解析(F4系列已经去掉BRR寄存器了)

    STM32 BSRR BRR ODR 寄存器解析(F4系列已经去掉BRR寄存器了) 一.用法 二.解释 三.BSRR.BRR. ODR 之间的关系 G0x0系列GPIO寄存器 F4系列GPIO寄存器( ...

  5. STM32——定位模块ATGM336H,数据解析,提取经纬度

    模块介绍 ATGM336H定位模块支持GPS系统,BDS(北斗)系统,GLONASS(俄罗斯)系统,伽利略卫星导航系统(欧盟).这个模块要拿到室外才能接收到信号,且初次初始化或者隔太久时间没有启用会导 ...

  6. STM32 串口 #pragma import(__use_no_semihosting)解析

    标准库函数的默认输出设备是显示器, 要实现在串口或 LCD 输出,必须重定义标准库函数里调用的与输出 设备相关的函数 . 例如 :printf 输出到串口,需要将 fputc 里面的输出指向串口 (重 ...

  7. stm32驱动NRF24L01_原理+代码解析

    目录 概念 废话篇(24L01简介) 引脚分配 工作模式 通信地址理解(个人疑难点) 原理分析 寄存器赏析 寄存器操作指令 配置寄存器(CONFIG,位置:0X00) 自动应答使能寄存器(EN_AA, ...

  8. 基于STM32的LTC6804驱动代码解析

    在上次项目中用到了LTC6804这块片子,初次使用它的采集精度确实令我惊讶到了,设备用于监测2V的铅酸电池组,硬件上几乎没有加任何滤波,直接读取数据就能达到3mv以下的精度,片子真的很好用. 下面总结 ...

  9. 【STM32】Freemodbus流程解析函数解析详细

     此篇博客将按照Freemodbus的运行流程,对各个函数进行解析(无主机RTU模式), 我将尽我所能解释的尽量清楚,如有错误或者语义模糊处还请在评论区指出,谢谢. 运行流程:freemodbus流程 ...

最新文章

  1. TEASOFT教学软件
  2. 32位CPU和64位CPU 区别
  3. 一生一世一双人,半醉半醒半浮生
  4. hiho一下第91周《Events Arrangement》(前半部分)
  5. hduoj 2602Bone Collector
  6. c语言 五个学生学号 姓名 三门,有五个学生,每个学生的数据包括学号、姓名、三门课的成绩,从键盘输入五个学生的数据,要求打印三门课总平均...
  7. NMAKE makefile内容和功能(1):描述块
  8. c语言新手入门项目代码
  9. ue4蓝图运行顺序_UE4蓝图编程的第一步
  10. 计算机系统操作权限,电脑修改系统时间提示没有操作权限的解决办法
  11. PDF报表 项目实战总结(集成百度地图+遇到的问题)
  12. windows11常用快捷键
  13. 失眠神器哪个最好?每天晚上睡不着的你一定要试试的东西
  14. Mysql中事务是什么?有什么用?
  15. 数组去重——将数组中重复的元素去掉
  16. Linux服务器知识梳理
  17. 在线教育项目02_前端知识(es6、vue)
  18. ACM-音频编解码器管理器
  19. python双星号什么运算_**(双星号/星号)和*(星号/星号)对参数有什么作用?...
  20. 降压式变换电路(Buck电路)详解

热门文章

  1. dv-scroll-board 鼠标移入单元格显示单元格所有数据
  2. 涂子沛:数据爆炸的时代,数据经济有哪些新“蓝海”?
  3. java程序员平时都使用哪些软件??
  4. 职场上罕见张小敬,办公室常常有元载
  5. linux分区4k对齐方法,Ubuntu 系统 SSD固态硬盘检查4K对齐以及开启Trim
  6. 我国网络安全应急体系
  7. 点云配准论文阅读笔记--(4PCS)4-Points Congruent Sets for Robust Pairwise Surface Registration
  8. 版本 000 / 2020 作业计划/数量计划中没有 作业类型 XXX的控制记录
  9. 换脸方法之FaceShifter
  10. 适用于linux的解压工具,Linux系统中常用的压缩和解压缩工具