STM32硬件接口I2C应用(基于HMC5883L)

目录

概述

1 STM32Cube控制配置I2C

1.1 I2C参数配置

1.2 使用STM32Cube产生工程

2 HAL库函数介绍

2.1 初始化函数

2.2 写数据函数

 2.3 读数据函数

3 认识HMC5883L

3.1 HMC5883L功能介绍

3.2 HMC5883L的寄存器

4 HMC5883L驱动程序实现

4.1 驱动函数实现

4.2 完整驱动代码

5 测试

6 逻辑分析仪捕捉波形


概述

本文主要介绍STM32F4的内部I2C接口的使用方法,包括使用STM32Cube配置i2c接口函数,还介绍了STM32 HAL库中的接口函数,为了验证接口函数的是否能够正常工作,还使用HMC5883L
作为device,以I2C接口作为通信接口,以实现该芯片数据的读写操作。

1 STM32Cube控制配置I2C

STM32CubeMX 版本: 6.11

HAL库版本: STM32Cube_FW_F4_V1.27.1

1.1 I2C参数配置

STM32F407 的标准I2C接口最大支持100K工作频率,笔者选择最大工作频100k,以配置I2C的参数。

I2C使用的GPIO接口如下:

使用MCU类型和HAL库的版本

1.2 使用STM32Cube产生工程

 在配置完成项目后,点击GENERATE生成项目,打开项目后项目目录如下,和I2C相关的代码如下:

代码第40行:选择I2C2作为硬件接口

代码第41行:I2C通信速率为100K

代码第44行:定义地址位7bit

2 HAL库函数介绍

STM32 HAL库函数数量很多,本文仅介绍笔者使用的一些函数接口。其他函数在使用的时候在具体研究,而不许把每个函数搞清楚才去应用。

2.1 初始化函数

函数原型:

HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c);

参数介绍

hi2c:  指向I2C_HandleTypeDef结构体的指针,该结构体包含指定I2C的配置信息。

 一个使用案例: 如果已经初始化完成hi2c结构,初始化时,直接调用该结构体即可。

2.2 写数据函数

函数原型:

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)

参数介绍:

hi2c:  指向I2C_HandleTypeDef结构体的指针,该结构体包含指定I2C的配置信息。

DevAddress: 目标设备地址:设备的7位地址值在调用接口之前,必须将数据表向左移动

MemAddress:内存地址

MemAddSize:内存地址大小

pData:            写数据指针

Size:               写数据大小

Timeout:         写数据超时时间

 2.3 读数据函数

函数原型:

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)

参数介绍:

hi2c:  指向I2C_HandleTypeDef结构体的指针,该结构体包含指定I2C的配置信息。

DevAddress: 目标设备地址:设备的7位地址值在调用接口之前,必须将数据表向左移动

MemAddress:内存地址

MemAddSize:内存地址大小

pData:            读数据指针

Size:               读数据大小

Timeout:         读数据超时时间

3 认识HMC5883L

3.1 HMC5883L功能介绍

霍尼韦尔HMC5883L是一款表面贴装的多芯片模块,专为低场磁传感设计,具有数字接口,适用于低成本罗盘和磁强计等应用。HMC5883L包括我们最先进的高分辨率HMC118X系列磁阻传感器,以及包含放大、自动消磁带驱动器、偏移抵消和12位ADC的ASIC,可实现1°至2°罗盘航向精度。I2C串行总线允许简单的接口。HMC5883L是3.0 × 3.0 × 0.9mm表面贴装16引脚无引线芯片载体(LCC)。

HMC5883L采用霍尼韦尔的各向异性磁阻(AMR)技术,与其他磁传感器技术相比具有优势。这些各向异性定向传感器具有高精度的轴内灵敏度和线性度。这些传感器的固态结构具有非常低的交叉轴灵敏度,旨在测量地球磁场的方向和大小,从毫高斯到8高斯。霍尼韦尔的磁传感器是业内最灵敏、最可靠的低场传感器之一。

3.2 HMC5883L的寄存器

该设备通过许多片上寄存器进行控制和配置,这些寄存器将在本节中描述。在以下描述中,除另有说明外,set表示逻辑1,reset或clear表示逻辑0。

4 HMC5883L驱动程序实现

4.1 驱动函数实现

1)写寄存器函数

代码第25行: 调用HAL_I2C_Mem_Write实现写寄存器功能

2)读寄存器函数

代码第37行: 调用HAL_I2C_Mem_Read实现读寄存器功能

4.2 完整驱动代码

1)创建hmc5883l.c文件,编写如下代码

/* USER CODE BEGIN Header */
/**
******************************************************************************
* File Name            : hmc5883l.c
* Description          : I2C drive based on STM32F4
* STM32 HAL library ver: STM32Cube_FW_F4_V1.27.1
* 
******************************************************************************
* @attention
*
* Copyright (c) 2024~2029 mingfei.tang
* All rights reserved.
*
*************************************************************************
*/
/* USER CODE END Header */
#include "hmc5883l.h"HMC5883L_T g_tMag;static uint8_t hmc5883L_WeReg( uint16_t regAdd, uint8_t *pData, uint16_t Size )
{HAL_StatusTypeDef status;status = HAL_I2C_Mem_Write( &hi2c2, HMC5883L_SLAVE_ADDRESS, regAdd, I2C_MEMADD_SIZE_8BIT, pData, Size, 1000);if( status == HAL_OK)return HMC5883L_OK;elsereturn HMC5883L_ERROR; 
}static uint8_t hmc5883L_RdReg( uint16_t regAdd, uint8_t *pData, uint16_t Size )
{HAL_StatusTypeDef status;status = HAL_I2C_Mem_Read( &hi2c2, HMC5883L_SLAVE_ADDRESS, regAdd, I2C_MEMADD_SIZE_8BIT, pData, Size, 1000);if( status == HAL_OK)return HMC5883L_OK;elsereturn HMC5883L_ERROR; 
}void hmc5883L_WriteByte(uint8_t _ucRegAddr, uint8_t _ucRegData)
{hmc5883L_WeReg( _ucRegAddr, &_ucRegData, 1);
}uint8_t hmc5883L_ReadByte(uint8_t _ucRegAddr)
{uint8_t _ucRegData;hmc5883L_RdReg( _ucRegAddr, &_ucRegData, 1);return  _ucRegData;
}void hmc5883l_Init(void)
{/* 设置Mode寄存器 */#if 1hmc5883L_WriteByte(0x00, 0x70);hmc5883L_WriteByte(0x01, 0x20);hmc5883L_WriteByte(0x02, 0x00);#else    /* 自校准模式 */hmc5883L_WriteByte(0x00, 0x70 + 2);hmc5883L_WriteByte(0x01, 0x20);hmc5883L_WriteByte(0x02, 0x00);#endifg_tMag.CfgRegA = hmc5883L_ReadByte(0);g_tMag.CfgRegB = hmc5883L_ReadByte(1);g_tMag.ModeReg = hmc5883L_ReadByte(2);g_tMag.IDReg[0] = hmc5883L_ReadByte(10);g_tMag.IDReg[1] = hmc5883L_ReadByte(11);g_tMag.IDReg[2] = hmc5883L_ReadByte(12);g_tMag.IDReg[3] = 0;/* 设置最小最大值初值 */g_tMag.X_Min = 4096;g_tMag.X_Max = -4096;g_tMag.Y_Min = 4096;g_tMag.Y_Max = -4096;g_tMag.Z_Min = 4096;g_tMag.Z_Max = -4096;
}void hmc5883l_ReadData(void)
{uint8_t ucReadBuf[7];hmc5883L_RdReg( DATA_OUT_X, ucReadBuf, 7);/* 将读出的数据保存到全局结构体变量 */g_tMag.X = (int16_t)((ucReadBuf[0] << 8) + ucReadBuf[1]);g_tMag.Z = (int16_t)((ucReadBuf[2] << 8) + ucReadBuf[3]);g_tMag.Y = (int16_t)((ucReadBuf[4] << 8) + ucReadBuf[5]);g_tMag.Status = ucReadBuf[6];/* 统计最大值和最小值 */if ((g_tMag.X > - 2048) && (g_tMag.X < 2048)){if (g_tMag.X > g_tMag.X_Max){g_tMag.X_Max = g_tMag.X;}if (g_tMag.X < g_tMag.X_Min){g_tMag.X_Min = g_tMag.X;}    }if ((g_tMag.Y > - 2048) && (g_tMag.Y < 2048)){if (g_tMag.Y > g_tMag.Y_Max){g_tMag.Y_Max = g_tMag.Y;}if (g_tMag.Y < g_tMag.Y_Min){g_tMag.Y_Min = g_tMag.Y;}    }if ((g_tMag.Z > - 2048) && (g_tMag.Z < 2048)){if (g_tMag.Z > g_tMag.Z_Max){g_tMag.Z_Max = g_tMag.Z;}if (g_tMag.Z < g_tMag.Z_Min){g_tMag.Z_Min = g_tMag.Z;}    }
}void hmc5883l_test( void )
{hmc5883l_Init();while(1){hmc5883l_ReadData();printf("X=%5d(%5d,%5d),Y=%6d(%5d,%5d),Z=%6d(%5d,%5d)\r",g_tMag.X, g_tMag.X_Min, g_tMag.X_Max,g_tMag.Y, g_tMag.Y_Min, g_tMag.Y_Max,g_tMag.Z, g_tMag.Z_Min, g_tMag.Z_Max);HAL_Delay(100);}
}/* End of this file */

2)创建hmc5883l.h,编写如下代码

/* USER CODE BEGIN Header */
/********************************************************************************* File Name          : hmc5883l.h* Description        : I2C drive based on STM32F4* ******************************************************************************* @attention** Copyright (c) 2024~2029 mingfei.tang* All rights reserved.***************************************************************************/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __HMC5883L_H
#define __HMC5883L_H#ifdef __cplusplusextern "C" {
#endif#include "stdio.h"
#include "main.h"#define HMC5883L_OK               1
#define HMC5883L_ERROR            0#define bsp_DelayMS               HAL_Delay
#define HMC5883L_SLAVE_ADDRESS    0x3C           /* I2C从机地址 */#define DATA_OUT_X        0x03typedef struct
{int16_t X;int16_t Y;int16_t Z;int16_t X_Min;int16_t Y_Min;int16_t Z_Min;int16_t X_Max;int16_t Y_Max;int16_t Z_Max;uint8_t Status;uint8_t CfgRegA;uint8_t CfgRegB;uint8_t CfgRegC;uint8_t ModeReg;uint8_t IDReg[3+1];
}HMC5883L_T;extern HMC5883L_T g_tMag;void hmc5883l_test( void );#ifdef __cplusplus
}
#endif#endif /*__BH1750_H */
__HMC5883L_H

5 测试

1)编写测试代码

void hmc5883l_test( void )
{hmc5883l_Init();while(1){hmc5883l_ReadData();printf("X=%5d(%5d,%5d),Y=%6d(%5d,%5d),Z=%6d(%5d,%5d)\r",g_tMag.X, g_tMag.X_Min, g_tMag.X_Max,g_tMag.Y, g_tMag.Y_Min, g_tMag.Y_Max,g_tMag.Z, g_tMag.Z_Min, g_tMag.Z_Max);HAL_Delay(100);}
}

2)编写代码,并下载到板卡中,运行代码

6 逻辑分析仪捕捉波形

 读取数据的波形

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/350025.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT调用vs2019生成的c++动态库

QT调用vs2019生成的c动态库 dll库的创建方法&#xff1a; VS2019创建c动态链接库dll与调用方法-CSDN博客 加减法示范&#xff1a; 头文件 // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 DLL3_EXPORTS // 符号编…

解决方案︱视频孪生智慧高速解决方案

系统概述 在交通强国战略的指导下&#xff0c;我国政府高度重视以数字化为核心的智慧高速公路建设与发展。2023年9月&#xff0c;交通运输部印发了《交通运输部关于推进公路数字化转型加快智慧公路建设发展的意见》&#xff0c;强调到2035年&#xff0c;全面实现公路数字化转型…

【C++】和【预训练模型】实现【机器学习】【图像分类】的终极指南

目录 &#x1f497;1. 准备工作和环境配置&#x1f495; &#x1f496;安装OpenCV&#x1f495; &#x1f496;安装Dlib&#x1f495; 下载并编译TensorFlow C API&#x1f495; &#x1f497;2. 下载和配置预训练模型&#x1f495; &#x1f496;2.1 下载预训练的ResNet…

一文入门vim

先来波快问快答。 第一个问题&#xff0c;vim是什么&#xff1f; vim就是一文本编辑器。 第二个问题&#xff0c;我们为什么要使用vim&#xff1f; 好像在终端中可选择使用的文本编辑器也不多&#xff08;其他有&#xff0c;但是相对而言vim用的比较广泛&#xff09; 第三…

automa学习:写一个取某东图书数据的片断

周五了&#xff0c;实在没事情了。正好上午有个朋友问automa的事&#xff0c;心想再写一个练习一下&#xff0c;毕竟&#xff0c;熟能生巧。 目标某东图书&#xff1a; 分析及介绍如下。 1.新建标签页 1.悬停元素。要注意 县 停 .cate_menu_item:nth-child(14) > .cate_…

SQL进阶day10————多表查询

目录 1嵌套子查询 1.1月均完成试卷数不小于3的用户爱作答的类别 1.2月均完成试卷数不小于3的用户爱作答的类别 ​编辑1.3 作答试卷得分大于过80的人的用户等级分布 2合并查询 2.1每个题目和每份试卷被作答的人数和次数 2.2分别满足两个活动的人 3连接查询 3.1满足条件…

【docker】如何解决artalk的跨域访问问题

今天折腾halo的时候&#xff0c;发现artalk出现跨域访问报错&#xff0c;内容如下。 Access to fetch at https://artk.musnow.top/api/stat from origin https://halo.musnow.top has been blocked by CORS policy: The Access-Control-Allow-Origin header contains multipl…

【字符函数】

接下来介绍部分字符函数测试 2. 字符转换函数 1.字符分类函数 1.1iscntrl 注&#xff1a;任何控制字符 检查是否有控制字符 符合为真 int main() {int i 0;char str[] "first line \n second line \n";//判断是否遇到控制字符while (!iscntrl(str[i])){p…

AI办公自动化:kimi批量搜索提取PDF文档中特定文本内容

工作任务&#xff1a;PDF文档中有资料来源这一行&#xff0c;比如&#xff1a; 资料来源&#xff1a;moomoo tech、The Information、Bloomberg、Reuters&#xff0c;浙商证券研究所 数据来源&#xff1a;CSDN、浙商证券研究所 数据来源&#xff1a;CSDN、arXiv、浙商证券研…

效率翻倍!ComfyUI 必装的工作流+模型管理插件 Workspace Manager

一、Workspace Manager 安装方式 插件 Github 网址&#xff1a; https://github.com/11cafe/comfyui-workspace-manager 如果你没有安装 Workspace Manager 插件&#xff0c;可以通过以下 2 种方式安装&#xff1a; ① 通过 ComfyUI Manager 安装&#xff08;推荐&#xff0…

这世上又多了一只爬虫(spiderflow)

让我们一起默念&#xff1a; 爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫 接着大声喊出来&#xff1a; 一&#xff01;只&#xff01;爬&#xff01;虫&#xff01;呀&#xff01;爬&#xff01;呀&#xff01;爬&#xf…

【机器学习】因TensorFlow所适配的numpy版本不适配,用anaconda降低numpy的版本

目录 0 TensorFlow最高支持的numpy版本 1 激活你的环境&#xff08;如果你正在使用特定的环境&#xff09; 2 查找可用的NumPy版本 3 安装特定版本的NumPy 4. 验证安装 5.&#xff08;可选&#xff09;如果你更改了base环境 0 TensorFlow最高支持的numpy版本 要使用 …

[C#]使用C#部署yolov10的目标检测tensorrt模型

【测试通过环境】 win10 x64vs2019 cuda11.7cudnn8.8.0 TensorRT-8.6.1.6 opencvsharp4.9.0 .NET Framework4.7.2 NVIDIA GeForce RTX 2070 Super cuda和tensorrt版本和上述环境版本不一样的需要重新编译TensorRtExtern.dll&#xff0c;TensorRtExtern源码地址&#xff1a;T…

Rust 实战丨并发构建倒排索引

引言 继上篇 Rust 实战丨倒排索引&#xff0c;本篇我们将参考《Rust 程序设计&#xff08;第二版&#xff09;》中并发编程篇章来实现高并发构建倒排索引。 本篇主要分为以下几个部分&#xff1a; 功能展示&#xff1a;展示我们最终实现的 2 个工具的效果&#xff08;构建索…

MySQL之高级特性(四)

高级特性 查询缓存 什么情况下查询缓存能发挥作用 并不是什么情况下查询缓存都会提高系统性能的。缓存和失效都会带来额外的消耗&#xff0c;所以只有当缓存带来的资源节约大于本身的资源消耗时才会给系统带来性能提升。这跟具体的服务器压力模型有关。理论上&#xff0c;可…

Stable Diffusion本地化部署详细攻略

一、硬件要求 内存&#xff1a;至少16GB 硬盘&#xff1a;至少60GB以上的磁盘空间&#xff0c;推荐SSD固态硬盘 显卡&#xff1a;推荐NVIDIA显卡 显存&#xff1a;至少4GB Stabl Diffusion因为是在本地部署&#xff0c;对显卡的要求比较高&#xff0c;如果经济能力可以的话…

【尚庭公寓SpringBoot + Vue 项目实战】图片上传(十)

【尚庭公寓SpringBoot Vue 项目实战】图片上传&#xff08;十&#xff09; 文章目录 【尚庭公寓SpringBoot Vue 项目实战】图片上传&#xff08;十&#xff09;1、图片上传流程2、图片上传接口查看3、代码开发3.1、配置Minio Client3.2、开发上传图片接口 4、异常处理 1、图片…

open-amv开发环境搭建

open-amv是基于rv1103主控芯片的视觉开发板子 1.板子使用 板子使用type c作为调试口&#xff0c;同时供电&#xff0c;请在电脑上下载adb&#xff0c;当板子通过tpye c与电脑连接后&#xff0c;执行命令adb shell就会进入到板子的linux系统命令行。 2.编译环境 2.1 搭建doc…

碳化硅陶瓷膜良好的性能

碳化硅陶瓷膜是一种高性能的陶瓷材料&#xff0c;以其独特的物理和化学特性&#xff0c;在众多领域展现出了广泛的应用前景。以下是对碳化硅陶瓷膜的详细介绍&#xff1a; 一、基本特性 高强度与高温稳定性&#xff1a;碳化硅陶瓷膜是一种非晶态陶瓷材料&#xff0c;具有极高的…

力扣 面试题17.04.消失的数字

数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗&#xff1f; 示例 1&#xff1a; 输入&#xff1a;[3,0,1] 输出&#xff1a;2 示例 2&#xff1a; 输入&#xff1a;[9,6,4,2,3,5,7,0,1] 输出&#x…