STM32F10X固件库函数——串口清状态位函数分析

最近在测试串口热插拔功能的时候,意外发现STM32F10X的串口库函数中,清理串口状态位函数稍稍有点不解。下面是改函数的源码:

/*******************************************************************************

* Function Name  : USART_ClearFlag

* Description    : Clears the USARTx's pending flags.

* Input          : - USARTx: Select the USART or theUART peripheral.

*                    This parameter can be oneof the following values:

*                     - USART1, USART2, USART3,UART4 or UART5.

*                  - USART_FLAG: specifies theflag to clear.

*                    This parameter can be anycombination of the following values:

*                       - USART_FLAG_CTS:  CTS Change flag (not available for

*                                          UART4and UART5).

*                       - USART_FLAG_LBD:  LIN Break detection flag.

*                       - USART_FLAG_TC:   Transmission Complete flag.

*                       - USART_FLAG_RXNE:Receive data register not empty flag.

*                       - USART_FLAG_IDLE: IdleLine detection flag.

*                       - USART_FLAG_ORE:  OverRun Error flag.

*                       - USART_FLAG_NE:   Noise Error flag.

*                       - USART_FLAG_FE:   Framing Error flag.

*                       - USART_FLAG_PE:   Parity Error flag.

*

*                    Note: - For IDLE, ORE, NE, FE and PE flagsuser has to read

*                          the USART DR registerafter calling this function.

*                          - TXE flag can't becleared by this function, it's

*                          cleared only by a writeto the USART DR register.

* Output         : None

* Return         : None

*******************************************************************************/

void USART_ClearFlag(USART_TypeDef* USARTx,u16 USART_FLAG)

{

/*Check the parameters */

assert_param(IS_USART_ALL_PERIPH(USARTx));

assert_param(IS_USART_CLEAR_FLAG(USART_FLAG));

assert_param(IS_USART_PERIPH_FLAG(USARTx, USART_FLAG)); /* The CTS flagis not available for UART4 and UART5 */

USARTx->SR =(u16)~USART_FLAG;

}

这些标志位的宏定义如下:

#define USART_FLAG_CTS                       ((u16)0x0200)

#define USART_FLAG_LBD                       ((u16)0x0100)

#define USART_FLAG_TXE                       ((u16)0x0080)

#define USART_FLAG_TC                        ((u16)0x0040)

#define USART_FLAG_RXNE                      ((u16)0x0020)

#define USART_FLAG_IDLE                      ((u16)0x0010)

#define USART_FLAG_ORE                       ((u16)0x0008)

#define USART_FLAG_NE                        ((u16)0x0004)

#define USART_FLAG_FE                        ((u16)0x0002)

#define USART_FLAG_PE                        ((u16)0x0001)

每一个宏定义对应着串口状态寄存器的一个状态位,我奇怪的是最后一句赋值操作:

USARTx->SR= (u16)~USART_FLAG;
 

执行完以后,不是将串口的其它状态位都赋为1了吗?为何不干脆写成下面的,
 USARTx->SR&= (u16)~USART_FLAG;

这样原来的状态位就可以保持不变了。

纠结了半天,觉得不可能是库函数有错误,翻看芯片手册,如下所示,10个状态位对应着不同的中断。关键的是这10个状态位都有这样一个说明,该位在某种条件下被硬件置高,由软件清0。

难道由硬件置高的状态位,软件对其写0,没有任何的影响,不会误操作引起中断?实际使用中,也确实没有发现带来什么坏处,软件写1以后,通过查看寄存器位发现没有改变。

STM32F10X固件库函数——串口清状态位函数分析的更多相关文章

  1. STM32F4库函数里面的RCC_DeInit(void)函数分析

    void RCC_DeInit(void) { /*Set HSION bit,内部高速时钟使能HSI振荡器打开*/ RCC->CR |=(uint32_t)0x00000001; /*Rese ...

  2. C标准I/O库函数与Unbuffered I/O函数

    一.C标准I/O库函数.Unbuffered I/O函数 1. C标准I/O库函数是如何用系统调用的 fopen(3) 调用open(2)打开制定的文件,返回一个文件描述符(一个int类型的编号),分 ...

  3. TRIO-basic变量的状态位

    TRIO运动控制器在应用中,我们一般会用一个VR寄存器的状态位来控制一些报警信号,这样有利于代码的优化,同时和触摸屏设置报警信息大大的方便和节约时间. 首先测试了一下一个寄存器可以设置多少个状态位. ...

  4. mysql扩展百分位函数(类似SUM)

    mysql扩展百分位函数(类似SUM) 参考:https://my.oschina.net/waterbear/blog/1186744 百度搜索:mysql percentile

  5. Spark Streaming状态管理函数updateStateByKey和mapWithState

    Spark Streaming状态管理函数updateStateByKey和mapWithState 一.状态管理函数 二.mapWithState 2.1关于mapWithState 2.2mapW ...

  6. Linux-0.11内核源代码分析系列:内存管理get_free_page()函数分析

    Linux-0.11内存管理模块是源码中比較难以理解的部分,如今把笔者个人的理解发表 先发Linux-0.11内核内存管理get_free_page()函数分析 有时间再写其它函数或者文件的:) /* ...

  7. start_amboot()函数分析

    一.整体流程 start_amboot()函数是执行完start.S汇编文件后第一个C语言函数,完成的功能自然还是初始化的工作 . 1.全局变量指针r8设定,以及全局变量区清零 2.执行一些类初始化函 ...

  8. 串口发送端verilog代码分析

    串口发送端verilog代码分析 `timescale 1ns / 1ps ////////////////////////////////////////////////////////////// ...

  9. Linux 串口、usb转串口驱动分析(2-2) 【转】

    转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=26807463&id=4186852 Linux 串口.usb转 ...

随机推荐

  1. C# javascript 全选按钮

    function selectAll(checkbox) {                  $('input[type=checkbox]').attr('checked', $(checkbox ...

  2. python生成html表格

    最近做一个小工具,需要将统计数据生成html表格.在网上搜罗一圈后发现用pandas生成表格非常好用.代码如下: import pandas as pd def convertToHtml(resul ...

  3. python 多进程数据交互及共享

    多线程和多进程最大的不同在于,多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响,而多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改,因此,线程之间共享数据最 ...

  4. 2 (自我拓展)部署花的识别模型(学习tensorflow实战google深度学习框架)

    kaggle竞赛的inception模型已经能够提取图像很好的特征,后续训练出一个针对当前图片数据的全连接层,进行花的识别和分类.这里见书即可,不再赘述. 书中使用google参加Kaggle竞赛的i ...

  5. 微信公众号 报token验证失败

    最近两天一直碰到token验证失败的问题,如下图所示 然后上网疯狂的搜索答案,碰到的人还真不少,原因大概有这几个: 1)服务器URL未实名认证 2)token重名(基本不可能) 3)服务器部署的项目 ...

  6. SQL Server ->> Enable Instant File Initialization(开启文件及时初始化)

    我们在安装SQL Server的时候会在指定SQL Server各个服务的运行启动账户的账户的时候看到底下有一个选项写着“Grant Perform Volume Maintenance Task p ...

  7. easyui学习笔记7—在手风琴中显示表格

    在这一篇中我们看看如何在手风琴里面显示表格数据的. 1.先看看引用的资源 <link rel="stylesheet" type="text/css" h ...

  8. SAP专家培训之Netweaver ABAP内存管理和内存调优最佳实践

    培训者:SAP成都研究院开发人员Jerry Wang 1. Understanding Memory Objects in ABAP Note1: DATA itab WITH HEADER LINE ...

  9. SAP S/4HANA使用ABAP获得生产订单的状态

    在S/4HANA里,我们如何根据一个销售订单的行项目,查看对应的生产订单状态? 双击行项目: 点击Schedule line: 这里就能看到生产订单的ID和状态了. 其中订单的状态存储在表vsaufk ...

  10. oracle中的分区表

    oracle中的分区表在系统中使用的频率不小,在一些数据量大的系统中更是频繁出现. 提到分区表,首先就要理解下什么是分区.其实所谓的分区简单来说就是分区域,分区表就是将一张表分区域存放. 那么分区域中 ...