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. ecs CentOS 7 安装 mariadb

    检查之前是否已经安装 rpm -qa | grep mariadb 如果已安装,卸载 yum remove mysql mysql-server mysql-libs compat-mysql51 开 ...

  2. JS实现九九乘法表和时间问候语

    编码 小练习,练习使用循环实现一个九九乘法表 第一步,最低要求:在Console中按行输出 n * m = t 然后,尝试在网页中,使用table来实现一个九九乘法表 <!DOCTYPE htm ...

  3. 子级用css float浮动 而父级不能自适应高度解决方法

    解决子级对象使用css float浮动 而父级div不能自适应高度,不能被父级内容撑开解决方法,父级div没有高度解决方法. 当在对象内的盒子使用了float后,导致对象本身不能被撑开自适应高度,这个 ...

  4. 软件项目技术点(1)——Tween算法及缓动效果

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 Tween算法及缓动效果 软件里在切换步序时需要有过渡动画效果,从当前位置的画面缓动到目标位置的画面.动画效果可重新查看文章系列第一篇 ...

  5. lianxi

    package dududu; public class qiqiqi { public static void main(String[] args) { // TODO 自动生成的方法存根 ; ; ...

  6. 安装Chrome driver/ IE driver

    2014-08-15 11:38 22100人阅读 评论(0) 收藏 举报  分类: python基础学习(97)  >>>安装Chrome driver chrome driver ...

  7. 关于Flume以及Kafka理解

  8. 10.符号链接&创建链接

    在我们到处查看时,我们可能会看到一个目录,列出像这样的一条信息: lrwxrwxrwx 1 root root 11 2007-08-11 07:34 libc.so.6 -> libc-2.6 ...

  9. html5自我总结

    2017年7月30日 合抱之木,生于毫末.九层之台,起于累土.软件行业要熟记和训练的东西有很多,在此,写一下如何快速搭建html及自我见解(这里只介绍我自己用到的,还有部分存在但是用不到的就不讲解了) ...

  10. 深入解读TPC-C指标

    深入解读TPC-C指标 TPC(Transactionprocessing Performance Council,事务处理性能委员会)是由数十家会员公司创建的非盈利组织,总部设在美国.TPC的成员主 ...