STM32F10X固件库函数——串口清状态位函数分析
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固件库函数——串口清状态位函数分析的更多相关文章
- STM32F4库函数里面的RCC_DeInit(void)函数分析
void RCC_DeInit(void) { /*Set HSION bit,内部高速时钟使能HSI振荡器打开*/ RCC->CR |=(uint32_t)0x00000001; /*Rese ...
- C标准I/O库函数与Unbuffered I/O函数
一.C标准I/O库函数.Unbuffered I/O函数 1. C标准I/O库函数是如何用系统调用的 fopen(3) 调用open(2)打开制定的文件,返回一个文件描述符(一个int类型的编号),分 ...
- TRIO-basic变量的状态位
TRIO运动控制器在应用中,我们一般会用一个VR寄存器的状态位来控制一些报警信号,这样有利于代码的优化,同时和触摸屏设置报警信息大大的方便和节约时间. 首先测试了一下一个寄存器可以设置多少个状态位. ...
- mysql扩展百分位函数(类似SUM)
mysql扩展百分位函数(类似SUM) 参考:https://my.oschina.net/waterbear/blog/1186744 百度搜索:mysql percentile
- Spark Streaming状态管理函数updateStateByKey和mapWithState
Spark Streaming状态管理函数updateStateByKey和mapWithState 一.状态管理函数 二.mapWithState 2.1关于mapWithState 2.2mapW ...
- Linux-0.11内核源代码分析系列:内存管理get_free_page()函数分析
Linux-0.11内存管理模块是源码中比較难以理解的部分,如今把笔者个人的理解发表 先发Linux-0.11内核内存管理get_free_page()函数分析 有时间再写其它函数或者文件的:) /* ...
- start_amboot()函数分析
一.整体流程 start_amboot()函数是执行完start.S汇编文件后第一个C语言函数,完成的功能自然还是初始化的工作 . 1.全局变量指针r8设定,以及全局变量区清零 2.执行一些类初始化函 ...
- 串口发送端verilog代码分析
串口发送端verilog代码分析 `timescale 1ns / 1ps ////////////////////////////////////////////////////////////// ...
- Linux 串口、usb转串口驱动分析(2-2) 【转】
转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=26807463&id=4186852 Linux 串口.usb转 ...
随机推荐
- Java Map类常用方法
关于Map集合中常用的方法: void clear(); 清空Map boolean containsKey(Object key); 判断Map中是否包含这样的key boolean contain ...
- 在CentOS 7下更改yum源与更新系统
在CentOS 7下更改yum源与更新系统. [1] 首先备份/etc/yum.repos.d/CentOS-Base.repo cp /etc/yum.repos.d/CentOS-Base.rep ...
- Spring课程 Spring入门篇 5-7 advisors
1 简析 1.1 advisor简析(这个不太明白,后续再看吧) 2 代码演练 2.1 环绕通知的综合应用(代码和视频对不上,慕课网讲的本身有问题) 1 简析 1.1 advisor简析( ...
- Java全系列帮助文档下载
JDK(Java Development Kit,Java开发包,Java开发工具)是一个写Java的applet和应用程序的程序开发环境.它由一个处于操作系统层之上的运行环境还有开发者编译,调试和运 ...
- MFC中利用Opencv与C++抓取摄像头进行人脸识别(Mat)
原文:http://blog.csdn.net/mr_curry/article/details/51098311 第一次写博客哈哈,有些小激动,还请各位大神多多包涵~ 最近的项目需要用到人脸识别,作 ...
- 微信小程序开发前期准备
开发文档 官方开发文档 开发IDE 官方工具下载 UI组件 WeUI:是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信内网页和微信小程序量身设计,新手建议使用: ZanUI-WeAp ...
- MyEclipse打开JSP文件报"Failed to create the part's controls"解决方法汇总
有时候,打开别人的开发环境中导过来的项目的JSP文件,会出现“Failed to create the part's controls”的错误! 解决的方法有: 方法1:关闭myeclipse的jsp ...
- Linux ->> UBuntu 14.04 LTE下安装Hadoop 1.2.1(伪分布模式)
Hadoop的运行模式可分为单机模式.伪分布模式和分布模式. 首先无论哪种模式都需要安装JDK的,这一步之前的随笔Ubuntu 14.04 LTE下安装JDK 1.8中已经做了.这里就不多说了. 其次 ...
- js判断客户浏览器类型,版本
在JS中判断浏览器的 类型,估计是每个编辑过页面的开发人员都遇到过的问题.在众多的浏览器产品中,IE.Firefox.Opera.Safari........众多品牌 却标准不一,因此时常需要根据不同 ...
- vscode:配置git
1.下载git,并找到安装git的文件位置,并找到git文件夹下面的Bin文件夹 2.配置环境变量 位置:右击‘计算机’->属性->高级系统设置->环境变量 最后点击确定即可 ...