STM32-I2C_CheckEvent-标志位自动清除理解
STM32里I2C_CheckEvent函数我们应该是相当熟悉了,在每次发送数据后我们都需要检验相应的EVx(x = 0,1,2,,,)事件是否有发送。
函数定义如下:
ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT)
{
uint32_t lastevent = ;
uint32_t flag1 = , flag2 = ;
ErrorStatus status = ERROR; /* Check the parameters */
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
assert_param(IS_I2C_EVENT(I2C_EVENT)); /* Read the I2Cx status register */
flag1 = I2Cx->SR1;
flag2 = I2Cx->SR2;
flag2 = flag2 << ; /* Get the last event value from I2C status register */
lastevent = (flag1 | flag2) & FLAG_Mask; /* Check whether the last event contains the I2C_EVENT */
if ((lastevent & I2C_EVENT) == I2C_EVENT)
{
/* SUCCESS: last event is equal to I2C_EVENT */
status = SUCCESS;
}
else
{
/* ERROR: last event is different from I2C_EVENT */
status = ERROR;
}
/* Return status */
return status;
}
该函数第一个参数是输入需要检查的I2Cx(x = 1,2,3,4,5)外设,第二个参数是检查的事件,如下所示:
I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED : EV1
I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED : EV1
I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED : EV1
I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED : EV1
I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED : EV1
I2C_EVENT_SLAVE_BYTE_RECEIVED : EV2
(I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_DUALF) : EV2
(I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_GENCALL) : EV2
I2C_EVENT_SLAVE_BYTE_TRANSMITTED : EV3
(I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_DUALF) : EV3
(I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL) : EV3
I2C_EVENT_SLAVE_ACK_FAILURE : EV3_2
I2C_EVENT_SLAVE_STOP_DETECTED : EV4
I2C_EVENT_MASTER_MODE_SELECT : EV5
I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED : EV6
I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED : EV6
I2C_EVENT_MASTER_BYTE_RECEIVED : EV7
I2C_EVENT_MASTER_BYTE_TRANSMITTING : EV8
I2C_EVENT_MASTER_BYTE_TRANSMITTED : EV8_2
I2C_EVENT_MASTER_MODE_ADDRESS10 : EV9
本文就举里面常用的一些事件为例,来分析该函数为什么能够自动清除标志位。包含EV5,EV6,EV8以及EV7事件。
在使用I2C发送数据时我们会用到EV5,EV6,EV8事件,事件名称及定义如下:
/*I2C_EVENT_MASTER_MODE_SELECT : EV5*/
#define I2C_EVENT_MASTER_MODE_SELECT ((uint32_t)0x00030001) /* BUSY, MSL and SB flag */ /*I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED : EV6 */
#define I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ((uint32_t)0x00070082) /* BUSY, MSL, ADDR and TRA flags */
/*I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED : EV6*/
#define I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ((uint32_t)0x00030002) /* BUSY, MSL and ADDR flags */ /*I2C_EVENT_MASTER_BYTE_TRANSMITTING : EV8*/
#define I2C_EVENT_MASTER_BYTE_TRANSMITTING ((uint32_t)0x00070080) /* TRA, BUSY, MSL, TXE flags */
/*I2C_EVENT_MASTER_BYTE_TRANSMITTED : EV8_2*/
#define I2C_EVENT_MASTER_BYTE_TRANSMITTED ((uint32_t)0x00070084) /* TRA, BUSY, MSL, TXE and BTF flags */
- 根据I2C_CheckEvent函数的定义,事件的高16位为I2C外设的SR2寄存器,低16位为I2C外设的SR1寄存器。
- 先来看看 I2C_EVENT_MASTER_MODE_SELECT,宏定义为,0x00030001,对应的SR1和SR2寄存器如下所示:

其中MSL为1表为主模式,BUSY为1表总线忙碌,


这两位一般都是在产生STOP信号的时候置0,其他时候都为1。
看看SB位如何清零,

我们在Check_Event函数里面读取了SR1寄存器,我们在发送了起始信号之后就需要发送设备地址进行访问,在I2C_Send7bitAddress函数里面我们访问了数据寄存器SD,于是在下一次检测标志位之前SB被清除。
- 再来看看两个EV6事件 I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED 和 I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED,这两者的区别就是一个用于发送模式,另一个用于接受模式,发送模式为0x00070082,




TRA数据单元一般产生STOP信号后清除,至于ADDR位,在I2C_CheckEvent函数里面,我们是顺序地读取了SR1和SR2寄存器,于是ADDR位被清除。对于TxE位,我们下一步能会进行数据发送操作,也就是使用I2C_SendData函数访问DR数据寄存器,于是TxE也被清除。
- 还有一个EV8事件 I2C_EVENT_MASTER_BYTE_TRANSMITTED, 定义为0x00070084,

此处只讨论BTF位的清除,

也是访问SR1寄存器和对数据寄存器的读或写可以清除该位,因此BTF位也被清除。
至于I2C_CheckEvent里面其他事件所设计的位清除,我就不一一举例了,可以按照这个思路,参考STM32F10x-中文参考手册自己一步步的查看。
I2C_ChencEvent比I2C_GetFlagStatus函数好的一点就是它检测了与事件相关的所有寄存器位,而后者只检测提供的标志位。
STM32-I2C_CheckEvent-标志位自动清除理解的更多相关文章
- stm32串口——标志位学习
/* 在USART的发送端有2个寄存器,一个是程序可以看到的USART_DR寄存器,另一个是程序看不到的移位寄存器,对应USART数据发送有两个标志,一个是TXE=发送数据寄存器空,另一个是TC=发送 ...
- STM32的RTC中断标志只能手动清除
背景: 最近在做一个stm32的项目,其中用到RTC的实时时钟功能.时钟源采用外部32.768K晶振,时钟预分频设置为32767,目的是为了产生1秒的中断,然后在中断处理函数中更新实时年月日时分秒. ...
- STM32 串口固件库中定义的几个中断标志位什么意思?
在stm32f10x_usart.h中以上几个宏,很没有规律,诈一看还真不知道为什么会这么定义,其实通过代码就很容易明白: D7~D5:代表中断标志位对应的中断使能位在 CR1.CR2还是CR3寄存器 ...
- 汇编语言标志位 含义 NV UP EI NG NZ AC PE CY
缩写原意: Overflow of = OV NV [No Overflow] Direction df = DN (decrement) UP (increment) Interrupt if = ...
- 【.net程序破解】实战之标志位破解绕过注册法
今天有时间玩了下一个不错的软件Advanced System Cleaner,可惜要注册 于是想办法给破解了,这是跟之前不同的地方,属于.NET破解教程: 软件地址 - http://www.crsk ...
- 嵌入式单片机,ATmega328P,外部中断INT0,INT1,INT2,中断标志位介绍
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 从点击Button到弹出一个MessageBox, 背后发生了什么(每个UI线程都有一个ThreadInfo结构, 里面包含4个队列和一些标志位)
思考一个最简单的程序行为:我们的Dialog上有一个Button, 当用户用鼠标点击这个Button时, 我们弹出一个MessageBox. 这个看似简单的行为, 谁能说清楚它是如何运行起来的,背 ...
- python正则表达式模块re:正则表达式常用字符、常用可选标志位、group与groups、match、search、sub、split,findall、compile、特殊字符转义
本文内容: 正则表达式常用字符. 常用可选标志位. group与groups. match. search. sub. split findall. compile 特殊字符转义 一些现实例子 首发时 ...
- 汇编 OD 标志位 置位相关指令
知识点: l 标志位 置位相关指令 l 标志寄存器PSW 标志寄存器PSW(程序状态字寄存器PSW) 标志寄存器PSW是一个16为的寄存器.它反映了CPU运算的状态特征并且存放某些控制标志. ...
随机推荐
- [Erlang-0016][aque_tcp] 一个 Erlang TCP 组件
项目地址:https://github.com/liangjingyang/aque_tcp 欢迎任何形式的转载,但请务必注明出处:http://www.cnblogs.com/liangjingya ...
- jQuery.media.js的使用方法
该插件可以播放多种类型的多媒体文件包括:Flash, Quicktime, Windows Media Player, Real Player, MP3, Silverlight, PDF等,前提 ...
- 我们检测到您的浏览器不兼容传输层安全协议 (TLS) 1.1 或更高版本,此协议在 Internet 上用于确保您通信的安全性。
早上使用.Net WebClient类采集亚马逊数据,返回http 400 Bad Request错误,内容里面有“我们检测到您的浏览器不兼容传输层安全协议 (TLS) 1.1 或更高版本,此协议在 ...
- Qt单元测试浅析
Qt单元测试框架,使用于基于Qt的应用程序和库,先从一个简单的demo工程说起吧. 我们可以通过QtCreator来创建一个简单的Qt单元测试工程,夏天到了,这个demo工程的名字就叫Summer好了 ...
- Oracle PL/SQL编程
一.PL/SQL简介 1.概念:PL/SQL是Oracle在标准SQL语言上的过程性扩展. 2.优点和特性 提高应用程序的运行性能 提供模块化的程序设计功能 允许定义标示符 具有过程语言控制结构 具备 ...
- SYN012型B码时统
SYN012型B码时统 产品概述 SYN012型B码时统是由西安同步电子科技有限公司精心设计.自行研发生产的一款通用性时统终端,内置高精度恒温晶振,接收GPS北斗双模卫星信号,10MHz外部参考 ...
- Spring Boot之Actuator的端点
Spring Boot Actuator的关键特性是在应用程序里提供众多Web端点,通过它们了解应用程序 运行时的内部状况.有了Actuator,你可以知道Bean在Spring应用程序上下文里是如何 ...
- HTML连载16-颜色控制属性2&标签选择器
一.颜色控制属性(上接连载15) (4)十六进制 在前端开发中通过十六进制来表示颜色,其实本质就是RGB,十六进制中是通过每两位表示一个颜色. 例如:#FFEE00,其中FF代表的是R,EE代表的G, ...
- Spring Boot:整合Swagger文档
综合概述 spring-boot作为当前最为流行的Java web开发脚手架,越来越多的开发者选择用其来构建企业级的RESTFul API接口.这些接口不但会服务于传统的web端(b/s),也会服务于 ...
- JCS学习记录 --Java Caching System
Java Caching System--JCS 缓存工具 //jcs版本 jcs-1.3.jar //jcs--cache.ccf缓存配置文件 cache.ccf //所依赖的jar包concurr ...