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. javaweb之EL自定义函数

    1.什么是EL自定义函数 EL自定义函数是在EL表达式中调用的某个java类的静态方法,这个静态方法需在web应用程序中进行配置才可以被EL表达式调用.EL自定义函数可以扩展EL表达式的功能,让EL表 ...

  2. freemarker生成word,表格分页

    在做项目的过程中,使用到了freemarker生成word.又有一个需求,明细的要确定有多少页,这就用到了换页的xml标签了,找了我好久 <w:p ><w:r><w:br ...

  3. 手贱--npm 误改全局安装路径

    修改全局安装命令: 通过 npm config set prefix "目录路径" 来设置. 通过 npm config get prefix 来获取当前设置的目录. 我的node ...

  4. 1-3 Sass 语法、编译、调试

    Sass 语法格式 这里说的 Sass 语法是 Sass 的最初语法格式,他是通过 tab 键控制缩进的一种语法规则,而且这种缩进要求非常严格.另外其不带有任何的分号和大括号.常常把这种格式称为 Sa ...

  5. Oracle基础之Merge into

    Merge into语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句. 通过MERGE语句,根据一张表或多表联合查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDA ...

  6. Microsoft.Exchange 发邮件

    //Microsoft.Exchange.WebServices.dll ExchangeService service = new ExchangeService(); // 获取身份验证, 能够尝 ...

  7. java Maven项目右键没有maven菜单项的解决方案!

    修改项目.project文件,确保有maven2Builder和maven2Nature2个标签: <?xml version="1.0" encoding="UT ...

  8. C++的虚析构

    最近准备复习一遍所有的知识点,先从基础开始做起,用几分钟写个继承和析构吧. 父类为A,子类为B,代码如下: class A { public: A() { cout << "构造 ...

  9. Python学习---Python下[字符串]的学习

    字符串[不可变] 重点方法: in count() center(50,'*') startswith('h') endwith('h') find('r') : 找不到返回 -1 index('r' ...

  10. PHP error_log 实际运用

    PHP的error_log()函数合理用起来还真方便呢,来看下这个函数: error_log(message,type,destination,headers); 参数 描述 message 必需.规 ...