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运算的状态特征并且存放某些控制标志. ...
随机推荐
- Android零基础入门第77节:Activity任务栈和启动模式
通过前面的学习,Activity的基本使用都已掌握,接下来一起来学习更高级的一些内容. Android采用任务栈(Task)的方式来管理Activity的实例.当启动一个应用时,Android就会为之 ...
- 阻止系统自动睡眠的小软件,附C#制作过程(执行SetThreadExecutionState API函数,让系统误判)
因为有时下载东西的时候,不想让电脑自动深入睡眠,所以就开启了离开模式.这样不但不节能环保,而且到真正想要睡眠的时候就是一翻蛋疼. 改过自新,关闭了离开模式,同时无操作30分钟后也会进入睡眠模式.但是在 ...
- Qt浅谈之二十七进程间通信之QtDBus good
一.简介 DBus的出现,使得Linux进程间通信更加便捷,不仅可以和用户空间应用程序进行通信,而且还可以和内核的程序进行通信,DBus使得Linux变得更加智能,更加具有交互性. DB ...
- Java的String类字符串的拆分
在java编程中,有时候我们需要把一个字符串按照某个特定字符.字母等作为截点分割这个字符串, 这样我们就可以使用这个字符串的一部分或者把所有截取的内容保存到数组里等操作. public class S ...
- hive -e和hive -f的区别(转)
大家都知道,hive -f 后面指定的是一个文件,然后文件里面直接写sql,就可以运行hive的sql,hive -e 后面是直接用双引号拼接hivesql,然后就可以执行命令. 但是,有这么一个东西 ...
- ES 21 - Elasticsearch的高级检索语法 (包括term、prefix、wildcard、fuzzy、boost等)
目录 1 term query - 索引词检索 1.1 term query - 不分词检索 1.2 terms query - in检索 2 prefix query - 前缀检索 3 wildca ...
- .Net上传文件处理三大范式,及开发注意事项
最近工作内容涉及到一点前端的内容,把学习到的内容记录下来,在今后的开发过程中,不要犯错.本篇只针对一些刚入职的小白及前端开发人员,大牛请绕道!~ 刚开始我们先不讲上传文件的防范问题,先通过一个例子,让 ...
- Sqoop 简介与安装
一.Sqoop 简介 Sqoop是一个常用的数据迁移工具,主要用于在不同存储系统之间实现数据的导入与导出: 导入数据:从MySQL,Oracle等关系型数据库中导入数据到HDFS.Hive.HBase ...
- 使用git提交时报错:error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large
Delta compression using up to 4 threads.Compressing objects: 100% (2364/2364), done.Writing objects: ...
- 【转载】一起来学Spring Cloud | Eureka Client注册到Eureka Server的秘密
LZ看到这篇文章感觉写得比较详细,理解以后,便转载到自己博客中,留作以后回顾学习用,喝水不忘挖井人,内容来自于李刚的博客:http://www.spring4all.com/article/180 一 ...