STM32 HAL库IIC驱动

2023-05-16

1. STM32上IIC的一些争议

关于STM32的IIC驱动,网上有很多争论,究竟是使用STM32自带的硬件IIC还是用IO口和软件模拟IIC呢?下面这个图形象展示了这些争论。总结一些:ST为了规避IIC硬件的专利问题,将其设计地有点复杂,但是其提供的标准驱动库并没有很好地适配,导致出现一些BUG。但是下图中那位叫theuit的网友指出了:**“难道ST不知道吗?到底有没有改呢?”**目前,至少从我测试的结果来看,可以得到结论:用HAL库来驱动ST的IIC没问题!
在这里插入图片描述

2. 两种类型的IIC器件与相应的HAL库驱动

首先,我们给出两种IIC器件。

  • 第一种是带器件中带有寄存器的一类,对这一类设备进行读写的时候往往还要指定寄存器地址。如下图是EEPROM器件AT24C02的IIC操作时序,可以看到除了需要DEVICE ADDRESS外,还需要WORD ADDRESS,即前面说的寄存器地址。
    在这里插入图片描述在这里插入图片描述
    对于这一类器件,HAL库提供了如下的驱动函数进行读写:

    // 轮询方式读写
    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);
    HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, 
    									uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
    

    当然,除了轮询方式,还有中断和DMA方式,在此暂不写啦。在使用该函数的时候要注意,入参MemAddSize代表寄存器地址的字节长度,也就是有几个字节,而不是位宽!,其取值可以是 I2C_MEMADD_SIZE_8BIT 或 I2C_MEMADD_SIZE_16BIT,分别代表1和2。 其次,HAL库的这些驱动函数都提供了超时功能,timeout的单位是ms。
    此外,在使用带有EEPROM的IIC器件时,一定要注意,由于写入之后EEPROM本身也需要一定的写入时间,在该写入时间内进行操作是没有响应,或者会出错的,因此在写完之后一定要延时,具体延时多久可以参考数据手册,比如AT24C02就是5ms。
    在这里插入图片描述

  • 第二类器件自然是不带有寄存器的。具体什么器件我还没找到QAQ。HAL库提供的驱动函数如下:

    HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
    HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
    

    可以看到相比对带寄存器的函数版本,就是少了关于寄存器的一些入参啦。

3. 使用IIC的一些易出错点

采用上面的驱动代码实测是可以正常驱动STM32的硬件IIC的。下面给出IIC使用过程中容易出错的一些点,供参考:

  1. IIC的IO口应该配置为开漏输出,且硬件上应该上拉。
    如果你使用的是STM32CubeMx来生成初始化代码,那么你不必担心这个配置,如下所示,初始化代码中会调用HAL_I2C_MspInit对IO进行初始化。
    在这里插入图片描述
    硬件的上拉也是很关键的,IIC的IDLE状态应该是SCL和SDA都是高电平的。不上拉就会导致IIC检测总线一直在busy的状态。
    在这里插入图片描述
  2. IIC的slave address设置。通常的IIC设备采用7bit地址模式,“7bit地址+读写标志位” 构成8bit的地址字节,在使用HAL库驱动IIC的时候,注意入参的DevAddress都是**7bit地址左移一位后作为输入!**当然,有一个例外,STM32CubeMx里的地址设置直接写原值就可以了,该软件会帮你左移一位后生成驱动。
    在这里插入图片描述

4. 参考

  1. STM32的硬件I2C有BUG?看我如何为它正名: http://sa.sogou.com/sgsearch/sgs_tc_news.php?req=6PoO2W_QCKVb8jArz1BgEWLNbmwv7FRLBXjzyzcA5T8WUyvRBQOwNGH9pBchWmTo&user_type=1
  2. STM32F103硬件IIC在HAL库下入坑指南: https://blog.csdn.net/niushijia007/article/details/99671761
  3. STM32CubeIDE HAL库操作IIC (一)配置篇: https://www.it610.com/article/1279687097564807168.htm
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 HAL库IIC驱动 的相关文章

  • c项目makefile多重定义错误

    这个问题是一个对应于创建的repexthis问题 在我的嵌入式 C 项目中 我有两个独立的板 我想为每个板创建两个 c 文件 master c 和 Slave c 其中包含自己的特定main 功能 我使用 stm32cumbemx 生成带有
  • GCC - 如何停止链接 malloc?

    我正在努力将我的代码缩减到最小的骨架大小 我使用的是只有 32k 闪存的 STM32F0 需要很大一部分闪存用于数据存储 我的代码已经有大约 20k 闪存大小 其中一些是由于使用了 STM32 HAL 函数 我可以在以后需要时对其进行解释和
  • 在 MCU 内部 FLASH 中从一个固件跳转到另一个固件

    我目前正在开发针对 STM32F030C8 的引导加载程序固件应用程序 我在分散文件中指定引导加载程序应用程序将占用主内存位置 0x08000000 到 0x08002FFF 扇区 0 到扇区 2 我还编写了一个主固件应用程序 存储在0x0
  • 139-基于stm32单片机老人居家监护报警系统Proteus仿真+源程序

    资料编号 139 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 MQ4传感器 电位器模拟 MQ2传感器 电位器模拟 蜂鸣器 电机 制作一个基于stm32单片机老人居家监护报警系统Proteus仿真 2 通过MQ2传
  • 140-基于stm32单片机智能晾衣杆控制系统Proteus仿真+源程序

    资料编号 140 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 光敏传感器 蜂鸣器 LED灯 制作一个基于stm32单片机智能晾衣杆控制系统Proteus仿真 2 通过光敏传感器
  • HAL库STM32常用外设教程(二)—— GPIO输入\输出

    HAL库STM32常用外设教程 二 GPIO输入 输出 文章目录 HAL库STM32常用外设教程 二 GPIO输入 输出 前言 一 GPIO功能概述 二 GPIO的HAl库驱动 三 GPIO使用示例 1 示例功能 四 代码讲解 五 总结
  • STM32超声波——HC_SR04

    文章目录 一 超声波图片 二 时序图 三 超声波流程 四 单位换算 五 取余计算 六 换算距离 七 超声波代码 一 超声波图片 测量距离 2cm 400cm 二 时序图 1 以下时序图要先提供一个至少10us的脉冲触发信号 告诉单片机我准备
  • STM32F103概要

    The STM32F103x4 STM32F103x6 STM32F103xC STM32F103xD and STM32F103xE are a drop in replacement for STM32F103x8 B medium d
  • STM32 GPIO工作原理详解

    STM32 GPIO介绍 1 STM32引脚说明 GPIO是通用输入 输出端口的简称 是STM32可控制的引脚 GPIO的引脚与外部硬件设备连接 可实现与外部通讯 控制外部硬件或者采集外部硬件数据的功能 以STM32F103ZET6芯片为例
  • VS Code 有没有办法导入 Makefile 项目?

    正如标题所说 我可以从现有的 Makefile 自动填充 c cpp properties json 吗 Edit 对于其他尝试导入 makefile 的人 我找到了一组脚本 它们完全可以实现我想要实现的目标 即通过 VS Code 管理
  • STM32 暂停调试器时冻结外设

    当到达断点或用户暂停代码执行时 调试器可以停止 Cortex 中代码的执行 但是 当皮质停止在暂停状态下执行代码时 调试器是否会冻结其他外设 例如 DMA UART 和定时器 您只能保留时间 r 取决于外围设备 我在进入主函数时调用以下代码
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • STM32F207 I2C 测试失败

    我正在使用 STM32F207 微控制器在 STM3220G EVAL 板上学习嵌入式开发 我尝试通过连接同一芯片上的两个 I2C2 和 I2C3 模块并发送 接收字符来测试 I2C 接口 这是我当前编写的代码 使用 mdk arm 5 i
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • 特殊寄存器

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • 核心耦合内存在 STM32F4xx 上可执行吗?

    尝试从 STM32F429s CCM 运行代码 但每当我命中 CCM 中的第一条指令时 我总是会遇到硬故障 并且 IBUSERR 标志被设置 该指令有效且一致 STM32F4xx 是否可能不允许从 CCM 执行 数据访问效果良好 alios
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re

随机推荐

  • r练习 循环

    使用三种循环 xff0c 输出向量1 100中所有数据 for i in 1 100 print i i 61 1 while i lt 61 100 print i i 61 i 43 1 i 61 1 repeat if i lt 61
  • R逻辑回归 iris数据

    3 29 https www cnblogs com nxld p 6170690 html 很详细 在实际应用中 xff0c Logistic模型主要有三大用途 xff1a 1 xff09 寻找危险因素 xff0c 找到某些影响因变量的
  • 假设检验基础 R语言

    假设检验实例 某车间用一台包装机包装葡萄糖 包得的袋装糖重是一个随机变量 它服从正态分布 当机器正常时 其均值为0 5千克 标准差为0 015千克 某日开工后为检验包装机是否正常 随机地抽取它所包装的糖9袋 称得净重为 千克 0 497 0
  • Mysql 求每组第一名的信息

    Mysql 求每组第一名的信息 xff0c 以下是参考SQL语句 xff1a select h from wom interface health h select max id as id tenant id from wom inter
  • 两正态总体参数的检验

    方差的比较 在 R 中 xff0c 函数 t test 提供了 T 检验和相应的区间估计的功能 t test x y 61 NULL alternative 61 c 34 two sided 34 34 less 34 34 greate
  • R语言设置工作目录

    用 getwd 代码查看当前文件工作路径 xff0c 此处显示的工作路径在C盘 用 setwd 代码重新设置需要的工作路径 xff0c 如图中显示 xff0c 设置工作路径为D盘中的R数据库 xff0c 具体格式是 xff1a E xff1
  • 机器学习简介

    第一章 机器学习简介 机器学习 xff0c 发明计算机算法 xff0c 把数据转化为智能行为 xff08 核心循环的三者 xff1a 现有数据 xff1b 统计方法 xff1b 计算能力 xff09 数据挖掘 xff0c 从大型数据库中产生
  • 机器学习与R语言之 探索和理解数据 使用数据usedcars

    2 3 探索和理解数据 2 3 1 数据的结构 read scv str 数据导入到R后 xff0c 就要开始对数据做一个基本的检查 xff1b 数据的特征和案例 xff1b 理解数据的独特 xff0c 以便后面让模型匹配具体的学习问题 x
  • 机器学习与R语言 多元线性回归insurance.R:保险费

    insurance lt read csv 34 insurance csv 34 stringsAsFactors 61 TRUE str insurance 既然因变量是charges 我们就来看一下它是如何分布的 summary in
  • 各种假设检验实例整理 R语言

    http www cnblogs com ywliao archive 2017 04 17 6724334 html
  • 人机交互大作业考核要求

    考试说明 根据课程特点 xff0c 考试采取大作业形式 为了考试学生的对课程基本理论 基本知识点的考察 xff0c 要求学生调查报告中必须满足下述文档描述要求 xff1b 同时 xff0c 为了充分发挥学生的自我能动性 积极性 创造性 xf
  • 5.2 Great minds think alike!

    So far so good 过得去 xff1b 到目前为止 xff0c 一直都还不错 例句 xff1a The work is rather difficult but so far so good 工作相当困难 xff0c 但到目前为此
  • 统计建模与R软件-第六章 回归分析

    6 1为了估计山上积雪融化后对下游灌溉的影响 xff0c 在山上建立一个观测站 xff0c 测量最大积雪深度X与当年灌溉面积Y xff0c 测得连续10年的数据如表6 17所示 表6 17 10年中最大积雪深度与当年灌溉面积的数据 序号 X
  • 数据降维之主成分分析

    信息过度复杂是多变量数据最大的挑战之一 主成分分析和探索性因子分析是两种用来探索和简化多变量复 杂关系的常用方法 主成分分析 xff08 PCA xff09 是一种数据降维技巧 xff0c 它能将大量相关变量转化为一组很少的不相关变量 xf
  • C/C++复习

    1 C传送参数 xff1a 两种 xff1a 值传递 xff0c 引用传递 xff1a 如下测试code void valuepass int x x 61 x 43 10 void pointerpass int x x 61 x 43
  • 主成分分析之法国经济分析数据详解

    用数据框的形式输入数据 conomy lt data frame x1 61 c 149 3 161 2 171 5 175 5 180 8 190 7 202 1 212 4 226 1 231 9 239 0 x2 61 c 4 2 4
  • 朴素贝叶斯 手机垃圾信息过滤 机器学习与R语言

    Chapter 4 Classification using Naive Bayes Example Filtering spam SMS messages Step 2 Exploring and preparing the data r
  • 子网掩码和IP地址计算网络地址和广播地址的换算

    子网掩码和IP地址计算网络地址和广播地址的换算 已知 IP地址为 xff1a 202 112 14 137 子网掩码 xff1a 255 255 255 224 要求计算出这台主机所在的网络地址和广播地址是 xff1f 解 xff1a 第一
  • 手机浏览器查看vue项目

    在手机浏览器上面我们可以直接查看vue项目 在有网的条件下 xff0c 我们使用指令npm run serve启动一个项目 xff0c 会出现两个网址 xff0c 一个是本地的 xff0c 一个是网络的 在手机浏览器地址栏输入第二个网址 x
  • STM32 HAL库IIC驱动

    1 STM32上IIC的一些争议 关于STM32的IIC驱动 xff0c 网上有很多争论 xff0c 究竟是使用STM32自带的硬件IIC还是用IO口和软件模拟IIC呢 xff1f 下面这个图形象展示了这些争论 总结一些 xff1a ST为