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. Java使用反射来获取成员变量泛型信息

    Java通过指定类对应的Class对象,程序可以获得该类里包括的所有Field,不管该Field使用private修饰,还是使用public修饰.获得了Field对象后,就可以很容易的获得该Field ...

  2. IDEA 自动生成serialVersionUID

    场景:刚转到用IDEA,因为需要生成serialVersionUID,并没有自动生成. 转自:http://blog.csdn.net/liuzongl2012/article/details/451 ...

  3. Java 使用Log4J进行日志操作

    使用Log4J进行日志操作   Log4J简介   Log4J是Apache的一个开放源代码项目,它是一个日志操作包,通过使用Log4J,可以指定日志信息输出的目的地,如控制台.文件.CUI组件.NT ...

  4. jq重复切换类名

    //重复切换类名"active"$(".probability-rules header").toggleClass("active");

  5. google离线小恐龙-备份

    开启方法: 地址栏输入: chrome://dino 空格开始

  6. 个体商户POS机遭遇禁刷 职业养卡人称自有对策

    “套现猛于虎也”,这对于信用卡业而言无异于一大命门,信用卡套现金额的规模如同滚雪球般愈演愈烈.记者昨日采访银行业内了解到,虽然为防套现将根据规定关闭个体商户POS机刷信用卡的功能,但职业“养卡人”不以 ...

  7. jQuery Validate 无法验证 chosen-select元素

    chosen-select元素执行了chosen()方法后,为select元素加上了style="display: none;"进行隐藏,然后重新构造了一个看起来像select的下 ...

  8. ubuntu 安装nodejs和git

    1.安装curl sudo apt-get install curl 2.安装nodejs 和 npm curl -sL https://deb.nodesource.com/setup_8.x | ...

  9. C# Request获取URL常见用法

    如果测试的url地址是http://www.test.com/testweb/default.aspx, 结果如下: Request.ApplicationPath: /testweb Request ...

  10. UIScrollView中的手势

    UIScrollView中的手势 UIScrollView自带了两个手势,分别为: UIPanGestureRecognizer UIPinchGestureRecognizer 他们都是readon ...