HAL_I2C_Mem_Write()函数位于stm32fxx_hal_i2c.c文件的2432行,源代码对该函数的解释如下图

HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout );



该函数是通过阻塞模式将一定数量的数据写入目标地址器件中目标寄存器地址中去。

该函数的参数一共有7个,将他们的特性列入下表格:

参数名 参数数据类型 参数解释
hi2c I2C_HandleTypeDef * hi2c是一个结构体指针,它包含了特定I2C设备的配置信息
DevAddress uint16_t 目标器件的地址,七位地址必须左对齐
MemAddress uint16_t 目标器件的目标寄存器地址
MemAddSize uint16_t 目标器件内部寄存器地址数据长度
pData uint8_t* 一个8位的指针,指向待写的数据
Size uint16_t 待传数据的数量
Timeout uint32_t 等待时间
  • 结构体I2C_HandleTypeDef的定义如下图所示

接下来我们看该函数是如何实现功能的:

首先定义了一个32位的变量tickstart,将目前时钟计数的值赋给它,HAL_GetTick()函数实现了取当前时钟计数的功能,我们看它的源代码



HAL_GetTick()函数位于stm32f1xx_hal.c文件中,可以看到HAL_GetTick()函数就完成了一个功能返回uwTick,而uwTick即为时钟计数值,当完成初始化HAL库后,uwTick每1ms增加1,溢出后归零。我们可以在代码的不同位置分别取当前的uwTick的值,将两个值相减即为中间代码运行时间。

再回到源代码:



assert_param()是一个参数校验函数,它的作用是检验输入参数是否符合要求。

接下来判断I2C是否准备好,如果i2c准备就绪,就进入下一环节,如果没有,则返回HAL_BUSY。

如果I2C准备就绪,则等待总线空闲,通过函数I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart)实现,我们来看看此函数的源码:



本函数位于stm32f1xx_hai_i2c.c文件的6876行,它实现了一个这样的功能:判断在一个时间间隔内,某标志位是否等于某值,如果是则返回HAL_OK;如否,则配置hi2c结构体参数并返回HAL_ERROR。

_HAL_LOCK(hi2c)实现了对资源的锁定,我们来看它的源代码



它位于stm32f1xx_hal_def.h文件内,它实现了这样一个功能:判断—_HANDLE_结构体中的成员Lock的值是否等于HAL_LOCKED,如果是,则返回HAL_BUSY,表示资源已被占用;如果否,则给Lock赋值HAL_LOCKED,表示本资源已被占用。

再回到源码:



标蓝的代码实现了这样一个功能:检测I2C是否被使能,如果没被使能,则使能。

下一段代码:

可以看到,注释对这段代码的解释是失能Pos,这个Pos是什么意思呢?让我们看STM32手册里面的解释

stm32fxx_hal_i2c.c解读之HAL_I2C_Mem_Write的更多相关文章

  1. SDWebImage源码解读之SDWebImageDownloaderOperation

    第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...

  2. SDWebImage源码解读 之 NSData+ImageContentType

    第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...

  3. SDWebImage源码解读 之 UIImage+GIF

    第二篇 前言 本篇是和GIF相关的一个UIImage的分类.主要提供了三个方法: + (UIImage *)sd_animatedGIFNamed:(NSString *)name ----- 根据名 ...

  4. SDWebImage源码解读 之 SDWebImageCompat

    第三篇 前言 本篇主要解读SDWebImage的配置文件.正如compat的定义,该配置文件主要是兼容Apple的其他设备.也许我们真实的开发平台只有一个,但考虑各个平台的兼容性,对于框架有着很重要的 ...

  5. SDWebImage源码解读_之SDWebImageDecoder

    第四篇 前言 首先,我们要弄明白一个问题? 为什么要对UIImage进行解码呢?难道不能直接使用吗? 其实不解码也是可以使用的,假如说我们通过imageNamed:来加载image,系统默认会在主线程 ...

  6. SDWebImage源码解读之SDWebImageCache(上)

    第五篇 前言 本篇主要讲解图片缓存类的知识,虽然只涉及了图片方面的缓存的设计,但思想同样适用于别的方面的设计.在架构上来说,缓存算是存储设计的一部分.我们把各种不同的存储内容按照功能进行切割后,图片缓 ...

  7. SDWebImage源码解读之SDWebImageCache(下)

    第六篇 前言 我们在SDWebImageCache(上)中了解了这个缓存类大概的功能是什么?那么接下来就要看看这些功能是如何实现的? 再次强调,不管是图片的缓存还是其他各种不同形式的缓存,在原理上都极 ...

  8. AFNetworking 3.0 源码解读 总结(干货)(下)

    承接上一篇AFNetworking 3.0 源码解读 总结(干货)(上) 21.网络服务类型NSURLRequestNetworkServiceType 示例代码: typedef NS_ENUM(N ...

  9. AFNetworking 3.0 源码解读 总结(干货)(上)

    养成记笔记的习惯,对于一个软件工程师来说,我觉得很重要.记得在知乎上看到过一个问题,说是人类最大的缺点是什么?我个人觉得记忆算是一个缺点.它就像时间一样,会自己消散. 前言 终于写完了 AFNetwo ...

随机推荐

  1. 使用纯 CSS 实现超酷炫的粘性气泡效果

    最近,在 CodePen 上看到这样一个非常有意思的效果: 这个效果的核心难点在于气泡的一种特殊融合效果. 其源代码在:CodePen Demo -- Goey footer,作者主要使用的是 SVG ...

  2. java getway springcloud 记录请求数据

    java getway springcloud 记录请求数据,兼容post请求无参数和response返回无参数 方式1 import com.icar.web.icarutils.util.Clie ...

  3. 开源数据质量解决方案——Apache Griffin入门宝典

    提到格里芬-Griffin,大家想到更多的是篮球明星或者战队名,但在大数据领域Apache Griffin(以下简称Griffin)可是数据质量领域响当当的一哥.先说一句:Griffin是大数据质量监 ...

  4. ASP.NET Core 6.0 基于模型验证的数据验证

    1 前言 在程序中,需要进行数据验证的场景经常存在,且数据验证是有必要的.前端进行数据验证,主要是为了减少服务器请求压力,和提高用户体验:后端进行数据验证,主要是为了保证数据的正确性,保证系统的健壮性 ...

  5. 主线程和创建多线程程序的第一种方式_创建Thread类的子类

    /** * 主线程:执行主方法的线程(main) * 单线程程序:在java程序中只有一个线程 * 执行从main方法开始,从上倒下依次执行 */ public class Demo01MainThr ...

  6. python自带gui插件tkinter使用小结

    1.tkinter简介 Tkinter(即 tk interface,简称"Tk")本质上是对 Tcl/Tk 软件包的 Python 接口封装,它是 Python 官方推荐的 GU ...

  7. Bert不完全手册6. Bert在中文领域的尝试 Bert-WWM & MacBert & ChineseBert

    一章我们来聊聊在中文领域都有哪些预训练模型的改良方案.Bert-WWM,MacBert,ChineseBert主要从3个方向在预训练中补充中文文本的信息:词粒度信息,中文笔画信息,拼音信息.与其说是推 ...

  8. PLC中增益和偏移

    y=kx+b这个直线方程,那么增益就是指k这个斜率,而偏移就是指b. 模拟量转换时一般是不需要设置这两个参数的,只有当外部信号与模块接收的信号在值上有偏差的情况下才会去调整这个参数. 如果的模块信号是 ...

  9. #万答10:mysqldump 是如何实现一致性备份的

    万答10:mysqldump 是如何实现一致性备份的 实验场景 MySQL 8.0.25 InnoDB 实验步骤: 先开启 general_log 观察导出执行过程的变化 set global gen ...

  10. [开源项目]可观测、易使用的SpringBoot线程池

    在开发spring boot应用服务的时候,难免会使用到异步任务及线程池.spring boot的线程池是可以自定义的,所以我们经常会在项目里面看到类似于下面这样的代码 @Bean public Ex ...