【STM32 HAL库】MPU6050 DMP库移植 与 自检失败的处理

news2024/11/25 12:49:12

【STM32 HAL库】MPU6050 DMP库移植 与 自检失败的处理

  • 本文参考
  • 移植步骤
    • 文件配置
    • 代码修改
      • inv_mpu.c
      • inv_mpu.h
      • inv_mpu_dmp_motion_driver.c
    • 使用
  • 自检失败怎么处理
    • ret = -1
      • 改正
      • DEBUG过程
    • ret = -9
      • 改正
      • DEBUG过程

本文参考

B站
CSDN

移植步骤

文件配置

新建一个 dmp 文件夹
并将 8 个官方的驱动文件复制到这个文件夹中
在这里插入图片描述
将该dmp文件夹复制到工程文件夹中
在这里插入图片描述
新建Groups组,并添加这8个驱动文件

添加编译路径
在这里插入图片描述

代码修改

inv_mpu.c

第 39 行到第 161 行删掉
#if defined EMPL_TARGET_STM32F4#endif在这里插入图片描述
然后在删除代码的原位置添加以下代码

#define MPU6050
#include "main.h"
extern I2C_HandleTypeDef hi2c1;
#define i2c_write(dev_addr,reg_addr,data_size,p_data)  \
HAL_I2C_Mem_Write(&hi2c1,dev_addr,reg_addr,I2C_MEMADD_SIZE_8BIT,p_data,data_size,0x100)
#define i2c_read(dev_addr,reg_addr,data_size,p_data)   \
HAL_I2C_Mem_Read(&hi2c1,dev_addr,reg_addr,I2C_MEMADD_SIZE_8BIT,p_data,data_size,0x100)
#define delay_ms    HAL_Delay
#define get_ms(p)      do{*p = HAL_GetTick();}while(0)
#define log_i(...)     do {} while (0)
#define log_e(...)     do {} while (0)
/* labs is already defined by TI's toolchain. */
/* fabs is for doubles. fabsf is for floats. */
#define fabs        fabsf
#define min(a,b) ((a<b)?a:b)

找到这段代码,删掉
在这里插入图片描述
修改.addr值为0xd0
注意这个addr大概在400行左右,如果你修改成480行的那个addr值,则后续自检会不通过!!!
在这里插入图片描述

inv_mpu.h

删掉 31 行到 44 行的这段代码
在这里插入图片描述
并在删去的位置添加下面这段代码

struct int_param_s {
	  void *arg;
};

inv_mpu_dmp_motion_driver.c

删掉第 27 到 77 行的代码
在这里插入图片描述
添加下面代码

#include "main.h"
extern I2C_HandleTypeDef hi2c1;
#define delay_ms    HAL_Delay
#define get_ms(p)      do{*p = HAL_GetTick();}while(0)
#define log_i(...)     do {} while (0)
#define log_e(...)     do {} while (0)

修改
在这里插入图片描述

使用

引用头文件
#include "MPU6050.h"

在main.c的初始化部分 添加MPU6050 DMP库初始化代码

  int ret=0;
	do{
	 ret=MPU6050_DMP_init();
	 //printf输出ret值,判断初始化是否成功
	 printf("ret=%d\n",ret);
	}while(ret);

在这里插入图片描述

定义全局变量

float pitch,yaw,roll;

函数使用

void loop(void){
     MPU6050_DMP_Get_Date(&pitch,&roll,&yaw);
	 printf("pitch=%f yaw=%f roll=%f\n",pitch,roll,yaw);
}

自检失败怎么处理

ret = -1

改正

inv_mpu.c 400行左右的.addr的值修改为0xd0
不是480行的那个!!!
在这里插入图片描述

DEBUG过程

我们可以发现ret为 MPU6050_DMP_init(); 的返回值

进入该函数实现
可以看到在该函数中返回值为宏定义在这里插入图片描述

进入宏定义
确定 ret = -1 对应 ERROR_MPU_INIT
在这里插入图片描述
也即ret = mpu_init(&int_param);中的mpu初始化函数报错,返回值不为0。

在这里插入图片描述
再看下该函数实现
发现有多个return -1的出口,无法判断是哪里出去

改写该函数,将所有的return -1的出口处添加error_code的标志位,判断到底从哪个出口出去
在这里插入图片描述
打印的error_code为1
说明设备复位错误
在这里插入图片描述
我们排查i2c_write(st.hw->addr, st.reg->pwr_mgmt_1, 1, data)函数
发现是st.hw->addr该参数错误
在这里插入图片描述
错误原因:在移植DMP库的时候,修改inv_mpu.c时,修改成了MPU6500的.addr值,而非MPU6050的
480行左右的.addr是定义MPU6500时的设备地址,也即MPU6500的设备地址,并非400行左右的那个MPU6050的.addr
注意,该段代码为灰色,说明被编译器忽视了(因为MPU6500没有被define)
修改:将400行左右的那个MPU6050的设备地址.addr的值修改为0xd0

ret = -9

改正

inv_mpu.cint mpu_run_self_test(long *gyro, long *accel) 的2730行左右的这段代码注释掉
在这里插入图片描述

DEBUG过程

ret=-9对应MPU6050自检函数错误
在这里插入图片描述
进入run_self_test();看该函数为何报错
在这里插入图片描述
在result后将其值赋给error_code并打印,发现result值为0x7

我们看下为什么result不为0x3
进入该陀螺仪、加速度计自检函数
在这里插入图片描述
该函数内部
在这里插入图片描述
函数作用
用result的第0位、第1位、第2位分别存储陀螺仪、加速度计、磁力计的自检结果。
若自检通过,则对应位置1(位运算,按位或)
若陀螺仪、加速度计、磁力计均自检通过,则result = 0111,也即0x7
但我们没有接磁力计,所以最高位应该为0,也即result = 0011,也即0x3(这也是我们想要的
我们看下,为什么最高位会被置1,也即为什么磁力计会自检通过
在这里插入图片描述
我们看下这段代码,如果定义了磁力计,则巴拉巴拉。#else result |= 0x04;
说明,即使没有定义磁力计(没有外接磁力计),自检也通过,最高位置1(result=0x7),这显然不对,我们注释掉这行代码

改正
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【斯坦福CS144】Lab1

一、实验目的 1.实现一个流重组器——一个将字节流的小块 &#xff08;称为子串或段 &#xff09;按正确顺序组装成连续的字节流的模块&#xff1b; 2.深入理解 TCP 协议的工作方式。 二、实验内容 编写一个名为"StreamReassembler"的数据结构&#xff0c;它负责…

【Nacos入门到实战十四】Nacos配置管理:集群部署与高可用策略

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

原神5.1前瞻网页HTML+CSS+JS

这篇文章主要是总结一下我在制作页面的时候用到的一些技术以及经验总结&#xff0c;博主也是第一次写网页&#xff0c;代码也是在不断地“进化”&#xff0c;哪里写的不好大家可以随意指出。 下面就是一些经验总结&#xff0c;如果想看具体效果我这里也不好展示&#xff0c;需要…

pytorch导入数据集

1、概念&#xff1a; Dataset&#xff1a;一种数据结构&#xff0c;存储数据及其标签 Dataloader&#xff1a;一种工具&#xff0c;可以将Dataset里的数据分批、打乱、批量加载并进行迭代等 &#xff08;方便模型训练和验证&#xff09; Dataset就像一个大书架&#xff0c;存…

QSerialPort 串口通信示例

之前使用过MFC写过串口通信的示例&#xff0c;今年学了Qt&#xff0c;特意使用Qt写了串口通信的示例&#xff0c;发现比MFC要容易一些&#xff0c; MFC串口示例如下&#xff1a; Qt示例如下&#xff1a; Qt这个做的很简单&#xff0c;主要还是想验证一下api&#xff0c; 核心…

今日指数day8实战补充(上)

1.用户管理 1.多条件综合查询 1.1 多条件综合查询接口说明 1&#xff09;原型效果 2&#xff09;接口说明 功能描述&#xff1a;多条件综合查询用户分页信息&#xff0c;条件包含&#xff1a;分页信息 用户创建日期范围 服务路径&#xff1a;/api/users 服务方法&#xff1…

Linux的Tomcat安装部署

1.下载jdk11 java11的官方URL 此时进入可能会有登录注册,挺简单的,注册登录就好 2.上传到Linux 3.解压 命令: tar -zxvf /root/linux.jdk/jdk-11.0.24_linux-x64_bin.tar.gz 4.移动解压文件夹到新建文件夹 新建文件夹: mkdir -p /export/server 移动命令: mv jdk-11.0…

联想服务器配置阵列、安装操作系统

文章目录 [toc]1.配置阵列2.制作启动盘3.安装系统 1.配置阵列 1.根据提示进入BIOS设置&#xff08;F1&#xff09; 2.系统设置 3.存储 4.第四步可以看到raid卡信息 5.Main Menu 6.Configuration Management 7.Create Virtual Drive 8.Select RAID Level raid5 9.Select Drives…

透明物体的投射和接收阴影

1、让透明度测试Shader投射阴影 &#xff08;1&#xff09;同样我们使用FallBack的形式投射阴影&#xff0c;但是需要注意的是&#xff0c;FallBack的内容为&#xff1a;Transparent / Cutout / VertexLit&#xff0c;该默认Shader中会把裁剪后的物体深度信息写入到 阴影映射纹…

降重秘籍:如何利用ChatGPT将重复率从45%降至10%以下?

AIPaperGPT&#xff0c;论文写作神器~ https://www.aipapergpt.com/ 重复率高达45%&#xff1f;很多人一查论文的重复率&#xff0c;瞬间想“完了&#xff0c;这次真的要重写了”。但其实不用这么绝望&#xff01;有了ChatGPT&#xff0c;降重真的没那么难。今天就教你几招&a…

VGG16模型实现MNIST图像分类

MNIST图像数据集 MNIST&#xff08;Modified National Institute of Standards and Technology&#xff09;是一个经典的机器学习数据集&#xff0c;常用于训练和测试图像处理和机器学习算法&#xff0c;特别是在数字识别领域。该数据集包含了大约 7 万张手写数字图片&#xf…

wsl环境下安装MySQL5.7

安装操作需root权限&#xff1a; 1-通过 sudo su - &#xff0c;切换到root用户。 2-在每一个命令前加上sudo&#xff0c;临时提升权限 1、下载apt仓库文件 wget https://dev.mysql.com/get/mysql-apt-config_0.8.12-1_all.deb 安装包是.deb的文件2、配置仓库&#xff0c;使…

MyBatis 批量插入方案

MyBatis 批量插入 MyBatis 插入数据的方法有几种&#xff1a; for 循环&#xff0c;每次都重新连接一次数据库&#xff0c;每次只插入一条数据。 在编写 sql 时用 for each 标签&#xff0c;建立一次数据库连接。 使用 MyBatis 的 batchInsert 方法。 下面是方法 1 和 2 的…

Linux防火墙-案例(一)filter表

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们经过上小章节讲了Linux的部分进阶命令&#xff0c;我们接下来一章节来讲讲Linux防火墙。由于目前以云服务器为主&#x…

51单片机的水位检测系统【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块水位传感器继电器LED、按键和蜂鸣器等模块构成。适用于水位监测、水位控制、水位检测相似项目。 可实现功能: 1、LCD1602实时显示水位高度 2、水位传感器采集水位高度 3、按键可设置水位的下限 4、按键可手动加…

动手学大模型应用开发之大模型简介

动手学大模型应用开发之大模型简介 主要学习目标什么是大语言模型大模型的能力和特点涌现能力作为基座模型支持多元应用的能力支持对话作为统一入口的能力大模型特点 常见大模型ChatGpt通义千问 LangChainLangChain的核心模块 总结相关学习链接 主要学习目标 学习如何进行大模…

【AI知识点】激活函数(Activation Function)

激活函数&#xff08;Activation Function&#xff09; 是神经网络中的一个关键组件&#xff0c;负责将输入的线性组合转化为非线性输出。它赋予神经网络模型以复杂的表达能力&#xff0c;使其能够处理非线性问题&#xff0c;比如分类、图像识别和自然语言处理等任务。 1. 激活…

【redis-06】redis的stream流实现消息中间件

redis系列整体栏目 内容链接地址【一】redis基本数据类型和使用场景https://zhenghuisheng.blog.csdn.net/article/details/142406325【二】redis的持久化机制和原理https://zhenghuisheng.blog.csdn.net/article/details/142441756【三】redis缓存穿透、缓存击穿、缓存雪崩htt…

Spring Boot:医院管理的数字化转型

5系统详细实现 5.1 医生模块的实现 5.1.1 病床信息管理 医院管理系统的医生可以管理病床信息&#xff0c;可以对病床信息添加修改删除操作。具体界面的展示如图5.1所示。 图5.1 病床信息管理界面 5.1.2 药房信息管理 医生可以对药房信息进行添加&#xff0c;修改&#xff0c;…

今日指数day8实战补充用户管理模块(下)

ps : 由于前端将userId封装为BigInt类型 , 导致有精度损失, 传入的userId不正确 , 部分功能无法正确实现 , 但是代码已经完善 1.4 更新用户角色信息接口说明 1&#xff09;原型效果 2&#xff09;接口说明 功能描述&#xff1a;更新用户角色信息 服务路径&#xff1a;/user/…