STM32 HAL I2C读取HMC5883L磁偏角的实践

article/2025/10/13 17:37:13

STM32 HAL I2C读取HMC5883L磁偏角的实践

  • 源由
    • 成果
    • 代码
    • 头文件 G85HAL.h
    • 子文件 G85HAL.C
    • 主程序调用
    • 配置I2C引脚
    • 参考链接

源由

用传统的方式编写I2C总线数据读取,程序代码细碎,不好维护,移植性不好。CUBE MX配置方便灵活,程序架构好,有现成的hal I2C函数可调用,仅用HAL_I2C_Mem_Write( … )和 HAL_I2C_Mem_Read(… )就实现了功能,

有车轮就不要自己再做车轮啦!

成果

两条语句就实现了HMC5883L磁偏角的读取,程序代码简洁、可靠。
重点说明:
语句1:
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)
语句2:
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)

参数:
1、I2C指针,即用I2C1 还是 I2C2…,查看CUBE MX配置
2、器件地址uint16_t DevAddress,与所读写的I2C芯片有关,查看芯片资料
3、要写入的内存地址 uint16_t MemAddress,与所读写的I2C芯片有关,查看芯片资料
4、内存地址类型,是一个地址存8bit ,还是16bit数据 , uint16_t MemAddSize,与所读写的I2C芯片有关,查看芯片资料,I2C_MEMADD_SIZE_8BIT和I2C_MEMADD_SIZE_16BIT二选一
5、对于写,是要写入的数组指针uint8_t *pData ;对于读取,是存数据的数组指针uint8_t *pData ;
6、数据 大小(要写入或读取几个字节)
7、多少时间没完成定义为超时,该语句退出

代码

头文件 G85HAL.h

#ifndef __GY85HAL_H
#define __GY85HAL_H		#include "stm32f1xx_hal.h"
#include "i2c.h"#define	ITG3205_Addr    0x68	  //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
#define	HMC5883L_Addr   0x3C	//磁场传感器器件地址//定义HMC5883L配置寄存器地址
#define HMC5883l_CONFIG_A              0x00
#define HMC5883l_CONFIG_B              0x01
#define HMC5883l_MODECONFIG       0x02struct HMC5883L_Data {unsigned char vtemp[12];int  x_h;		//x方向磁强int  y_h;		//y方向磁强int  z_h;		//z方向磁强float angle;
};//***************************************
int g85_makeuint16(int msb, int lsb) ;
void  Init_HMC5883L_HAL(I2C_HandleTypeDef *hi2c1);
/**** 读取磁场角度  */
float  read_hmc5883l_HAL(I2C_HandleTypeDef *hi2c1,struct HMC5883L_Data *VL_temp);#endif

子文件 G85HAL.C

#include "gy85hal.h"
#include  <math.h> //***************************************
//合并两个字节函数int  g85_makeuint16(int msb, int lsb) 
{return ((msb & 0xFF) << 8) | (lsb & 0xFF);
}//初始化和设置HMC5883L 
void  Init_HMC5883L_HAL(I2C_HandleTypeDef *hi2c1)
{unsigned char cdata[3]={0x70,0x20,0X00};HAL_I2C_Mem_Write(hi2c1,HMC5883L_Addr,HMC5883l_CONFIG_A, I2C_MEMADD_SIZE_8BIT,cdata, 1, 1000);            //HAL_I2C_Mem_Write(hi2c1,HMC5883L_Addr,HMC5883l_CONFIG_B, I2C_MEMADD_SIZE_8BIT, cdata+1, 1, 1000);       //设置增益,      HAL_I2C_Mem_Write(hi2c1,HMC5883L_Addr,HMC5883l_MODECONFIG, I2C_MEMADD_SIZE_8BIT, cdata+2, 1, 1000);     //设置测量模式,连续测量模式
}/**** 读取HMC5883L的磁场角度  */
float  read_hmc5883l_HAL(I2C_HandleTypeDef *hi2c1,struct HMC5883L_Data *VL_temp)
{float fangle;int x,y;	//用这个库函数,一次读6个字节少,了许多指令的调用      HAL_I2C_Mem_Read(hi2c1, HMC5883L_Addr, 0x03, I2C_MEMADD_SIZE_8BIT, VL_temp->vtemp, 6, 1000);          VL_temp->x_h = g85_makeuint16(VL_temp->vtemp[0], VL_temp->vtemp[1]);	VL_temp->y_h = g85_makeuint16(VL_temp->vtemp[4], VL_temp->vtemp[5]);VL_temp->z_h = g85_makeuint16(VL_temp->vtemp[2], VL_temp->vtemp[3]);if(VL_temp->x_h>0x7fff) VL_temp->x_h -= 0xffff;	    //做下预备处理if(VL_temp->y_h>0x7fff) VL_temp->y_h -= 0xffff;	y= VL_temp->y_h; x= VL_temp->x_h;if(x == 0) {fangle =180;	 if(y>0) fangle =0;}if( x < 0)	  fangle =90+atan((y+0.001)/x)*57.3;			 	 //加0.001是为了强制进行浮点数运算,且对精度影响很小if( x > 0)  fangle =270+atan((y+0.001)/x)*57.3;VL_temp->angle =fangle;return  fangle;}

主程序调用

int main(void)
{/* USER CODE BEGIN 1 */Count1ms=0;CanInteruptFlag=0;int icount=0;int x,y;double fangle,gtan; int i =0;struct HMC5883L_Data HMC_temp;/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM1_Init();MX_USART1_UART_Init();MX_CRC_Init();MX_IWDG_Init();MX_I2C1_Init();Init_HMC5883L_HAL(&hi2c1);/* USER CODE BEGIN 2 */  /* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */ while (1){HAL_IWDG_Refresh(&hiwdg);  //复位看门狗  //在1ms中断中,每过1ms,Count1ms加1if(Count1ms > 500){Count1ms = 0;		HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);                           //指示程序在运行fangle  = read_hmc5883l_HAL(&hi2c1,&HMC_temp);             //调用子程序printf("%d   %d   ",HMC_temp.y_h,HMC_temp.x_h);               //从串口送出读到的数据,供调试测试用printf("%0.2f   \n\r ",fangle);}//	for(icount=0;icount<6;icount++)		printf("%d ",HMC_temp.vtemp[icount]);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

配置I2C引脚

在这里插入图片描述
在这里插入图片描述

串口收到的数据,比较稳定,每列为Y值,第二列为X值,第三列为折算出来磁偏角(度)

参考链接

[链接]https://www.freesion.com/article/57631089788/ [VL53L0X TOF激光测距的 STM32 HAL库驱动代码] (感谢作者的分享))


http://chatgpt.dhexx.cn/article/4RyWcVY0.shtml

相关文章

(二十六)树莓派3B+ 获取HMC5883L的磁场数据

模块介绍 霍尼韦尔 HMC5883L 是一种表面贴装的高集成模块&#xff0c;并带有数字接口的弱磁传感器芯片&#xff0c;应用于低成本罗盘和磁场检测领域。HMC5883L 包括最先进的高分辨率 HMC118X 系列磁阻传感器&#xff0c;并附带霍尼韦尔专利的集成电路包括放大器、自动消磁驱动…

HMC5883L校准

HMC5883L 磁力计校准 (2015-02-14 11:48:21) 转载▼ 标签&#xff1a; hmc5883 磁力计 校准 分类&#xff1a; 电子技术 这里针对 HMC5883L 磁力计 的校准&#xff0c;做一个简单讲解。欢迎交流&#xff0c;新浪长沙WalkAnt。 先看看这篇文章&#xff1a;http://blo…

STC 51单片机53——电子指南针HMC5883l

#include <REG51.H> #include <math.h> //Keil library #include <stdio.h> //Keil library #include <INTRINS.H> #define uchar unsigned char #define uint unsigned int //使用的端口&#xff0c;请按照以下接线 sbit …

HMC5883l磁力计数据读取

1.数据手册地址 2.芯片介绍 设备的7位地址为0x1e&#xff0c;读地址为0x3d&#xff0c;写地址为0x3c。如图 2.主要需要配置的寄存器有3个。分别是配置寄存器A&#xff08;0x00&#xff09;&#xff0c;配置寄存器B&#xff08;0x01&#xff09;和模式寄存器&#xff08;0x03&…

ESP8266-Arduino编程实例-HMC5883L磁场传感器

HMC5883L磁场传感器 1、HMC5883L介绍 霍尼韦尔 HMC5883L 是一款表面贴装、多芯片模块,专为低场磁场传感而设计,具有数字接口,适用于低成本罗盘和磁力计等应用。 HMC5883L 包括我们先进的高分辨率 HMC118X 系列磁阻传感器和一个 ASIC,该 ASIC 包含放大、自动消磁带驱动器、…

HMC5883L电子罗盘原理及应用,全网最详细~

寄存器配置部分 HMC5883L模块具有两个配置寄存器&#xff0c;配置寄存器A用来配置该装置设置的数据输出速率和测量配置&#xff1b;配置寄存器 B 设置装置的增益。 模式寄存器则是用来设定装置的操作模式&#xff0c;有连续测量模式&#xff0c;单一测量模式和闲置模式等。具…

HMC5883L磁力计使用

一、器件简介 HMC5883L是一款三轴磁场传感器&#xff0c;电子指南针罗盘模块。采用IIC通讯协议。 二、工作原理 传统罗盘用一根被磁化的磁针来感应地球磁场&#xff0c;地球磁场与磁针之间的磁力时磁针转动&#xff0c;直至磁针的两端分别指向地球的磁南极与磁北极。电子罗盘也…

HMC5883L电子罗盘/指南针实现,附带校准方法(附STM32 源码)

HMC5883L电子罗盘/指南针实现&#xff0c;附带校准方法&#xff08;附STM32 源码&#xff09; 前言一、寄存器详解1.配置寄存器A2.配置寄存器B3.模式寄存器4.数据寄存器5.状态寄存器6.识别寄存器 二、使用步骤1.STM32CubeMX设置2.初始化3.读取原始数据 三、校准程序四、方位角计…

【STM32+cubemx】0029 HAL库开发:HMC5883L磁力计的应用(电子指南针)

今天我们来学习电子磁力计HMC5883L的使用。先介绍磁力计的基础知识&#xff0c;再给一个获取磁力计数据的例子&#xff0c;最后讲解HMC5883L磁力计的校准&#xff0c;以及一些使用中的经验。 1&#xff09;HMC5883L磁力计的基础知识 磁力计是用来测量磁场强弱&#xff08;也就…

Web 应用防火墙怎样添加域名

Web 应用防火墙是一款基于 AI 的一站式 Web 业务运营风险防护方案。沉淀了安全大数据检测能力和多年自营业务 Web 安全防护经验。通过 Web 入侵防护、0day 漏洞补丁修复、恶意访问惩罚、云备份防篡改等多维度防御策略全面防护网站的系统及业务安全。 包括四个步骤&#xff1a; …

WEB应用防火墙(WAF启明设备)

1.应用背景 网络安全形式严峻 新型0day漏洞频发 等保2.0 热点需求 行业规范 安全事件 2.产品介绍 1.工作原理 a) 桥模式串行部署于Web服务器前端&#xff0c;对应用层攻击行为进行精确识别和实时阻断&#xff0c;主动而有效的保护 Web应用不被攻击及篡改 b) 单臂代理模…

阿里云服务器接入云盾Web应用防火墙教学

什么是云盾Web应用防火墙&#xff1f; 云盾Web应用防火墙(Web Application Firewall, 简称 WAF)基于云安全大数据能力实现&#xff0c;通过防御SQL注入、XSS跨站脚本、常见Web服务器插件漏洞、木马上传、非授权核心资源访问等OWASP常见攻击&#xff0c;过滤海量恶意CC攻击&…

Web应用防火墙和普通防火墙的区别与联系

随着互联网的不断发展&#xff0c;Web应用程序的安全问题日益凸显&#xff0c;各种安全漏洞和攻击手段层出不穷。Web应用防火墙(WAF)作为保障Web应用程序安全的一种有效手段&#xff0c;正在被越来越多的企业所采用。那么&#xff0c;Web应用防火墙到底有什么用呢?web应用防火…

腾某云web应用防火墙-被ban后小技巧绕过

长这样式de 修改xff即可正常访问 &#xff08;X-Forwarded-For Header&#xff09;浏览器插件

WEB应用防火墙安全技术要求与测试评价方法

信息安全技术 WEB应用防火墙安全技术要求与测试评价方法 范围 本标准规定了WEB应用防火墙的安全功能要求、自身安全保护要求、性能要求和安全保证要求&#xff0c;并提供了相应的测试评价方法。 本标准适用于WEB应用防火墙的设计、生产、检测及采购。 规范性引用文件 下列…

开源免费的WEB应用防火墙

开源免费的WEB应用防火墙 排名不分前后 资源宝分享&#xff1a;www.httple.net 南墙waf测试linux7.6和宝塔不兼容&#xff0c;会用使用docker版waf隔离开来https://waf.uusec.com/waf-docker-community.v2.1.5.tgz 1、南墙WEB应用防火墙&#xff08;简称&#xff1a;&#x…

Saas型网站域名如何接入腾讯云的web应用防火墙?

步骤 1&#xff1a;域名添加 使用 Web 应用防火墙&#xff08;WAF&#xff09;防护您的 Web 业务前&#xff0c;需要先将防护的网站接入到 Web 应用防火墙。未完成接入前&#xff0c;您的 Web 应用防火墙防护将无法生效。本文档将指导您如何在 SaaS 型 WAF 中接入域名。 登录…

云上守护者—Web应用防火墙

说到防火墙&#xff0c;大家既熟悉又陌生。熟悉&#xff0c;是因为我们日常或多或少听过见过&#xff0c;例如Window自带防火墙。陌生&#xff0c;是因为我们不知道如何定义防火墙。 什么是防火墙&#xff1f; 应用防火墙对应在现实生活中&#xff0c;像公司大门的保安大爷&am…

web应用防火墙与防火墙的差别

在蔚可云众多安全产品中&#xff0c;有一个名为“web应用防火墙”的产品&#xff0c;很容易引起普通开发者的疑惑&#xff0c;web应用防火墙和传统防火墙到底有什么差别&#xff0c;以至于我们还需要购买这一种产品&#xff1f; 传统防火墙 传统防火墙的功能&#xff0c;主要…

Web 应用程序防火墙 (WAF) 相关知识介绍

Web应用程序防火墙 (WAF) 如何工作&#xff1f; Web应用防护系统&#xff08;也称为&#xff1a;网站应用级入侵防御系统。英文&#xff1a;Web Application Firewall&#xff0c;简称&#xff1a;WAF&#xff09;。利用国际上公认的一种说法&#xff1a;Web应用防火墙是通过执…