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

【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),这显然不对,我们注释掉这行代码

改正
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】进程地址空间、环境变量:从理论到实践(三)

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 &#x1f680; 前言一&#xff1a;&#x1f525; 环境变量 &#x1f95d; 基本概念&#x1f95d; 常见环境变量&#x1f95d; 查看环境变量方法 二&#xff1a;&#x1f525; 测试 &…

Nat. Commun.:飞秒激光书写受蚂蚁启发的可重构微型机器人集体

背景介绍生物在各种环境中的集体行为十分普遍&#xff0c;它们能够自发有序地完成单个个体难以完成的任务。目前&#xff0c;生物集体的形成主要分为两大类。第一类生物个体之间没有直接接触&#xff0c;如蜜蜂、鱼和鸟类&#xff0c;这导致这些集体不稳定&#xff0c;容易受到…

Linux网络编程 -- 网络基础

本文主要介绍网络的一些基础概念&#xff0c;不涉及具体的操作原理&#xff0c;旨在构建对网络的基础认识。 1、网络的早期发展历程 20世纪50年代 在这一时期&#xff0c;计算机主机非常昂贵&#xff0c;而通信线路和设备相对便宜。为了共享计算机主机资源和进行信息的综合处…

基于图像的3D动物重建与生成

一、背景与目标 3D-Fauna 是一款用于基于图像和视频进行四足动物3D重建与生成的开源方案。自然界展示了复杂的相似性与多样性,该方法通过学习来自网上图片的四足动物的3D形态,能够从单张图片生成可动画化的带有纹理的3D网格模型。其最终目标是通过大量扩展现有的解决方案,实…

数据库(MySQL):使用命令从零开始在Navicat创建一个数据库及其数据表(一).创建基础表

一. 使用工具和命令 1.1 使用的工具 Navicat Premium 17 &#xff1a;“Navicat”是一套可创建多个连接的数据库管理工具。 MySQL版本8.0.39 。 1.2 使用的命令 Navicat中使用的命令 命令命令解释SHOW DATABASES&#xff1b;展示所有的数据库CREATE DATABASE 数据库名称; 创…

基于STM32的数字温度传感器设计与实现

引言 STM32 是由意法半导体&#xff08;STMicroelectronics&#xff09;开发的基于 ARM Cortex-M 内核的微控制器系列&#xff0c;以其强大的处理能力、丰富的外设接口和低功耗著称&#xff0c;广泛应用于嵌入式系统设计中。在这篇文章中&#xff0c;我们将介绍如何基于 STM32…

深度学习:基于MindSpore实现ResNet50中药分拣

ResNet基本介绍 ResNet&#xff08;Residual Network&#xff09;是一种深度神经网络架构&#xff0c;由微软研究院的Kaiming He等人在2015年提出&#xff0c;并且在ILSVRC 2015竞赛中取得了很好的成绩。ResNet主要解决了随着网络深度增加而出现的退化问题&#xff0c;即当网络…

数据结构与算法——动态规划算法简析

1.初步了解动态规划 由于本篇博客属于动态规划的初阶学习&#xff0c;所以大多都是简单的表示&#xff0c;更深层次的学术用语会在之后深度学习动态规划之后出现&#xff0c;本文主要是带各位了解一下动态规划的大致框架 1.1状态表示 通常的我们会开辟一个dp数组来存储需要表示…

015 品牌关联分类

文章目录 后端CategoryBrandEntity.javaCategoryBrandController.javaCategoryBrandServiceImpl.javaCategoryServiceImpl.javaBrandServiceImpl.java删除 npm install pubsub-jsnpm install --save pubsub-js这个错误是由于在尝试安装 pubsub-js 时&#xff0c;npm 发现了项目…

数据结构(栈和队列的实现)

1. 栈&#xff08;Stack&#xff09; 1.1 栈的概念与结构 栈是一种特殊的线性表&#xff0c;其只允许固定的一段插入和删除操作&#xff1b;进行数据插入和删除的一段叫做栈顶&#xff0c;另一端叫栈底&#xff1b;栈中的元素符合后进先出LIFO&#xff08;Last In First Out&…

C++——模拟实现vector

1.查看vector的源代码 2.模拟实现迭代器 #pragma oncenamespace jxy {//模板尽量不要分离编译template <class T>class vector{public:typedef T* iterator;//typedef会受到访问限定符的限制typedef const T* const_iterator;//const迭代器是指向的对象不能修改&#xf…

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

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

毕业设计_基于springboot+ssm+bootstrap的旅游管理系统【源码+SQL+教程+可运行】【41001】.zip

毕业设计_基于springbootssmbootstrap的旅游管理系统【源码SQL教程可运行】【41001】.zip 下载地址&#xff1a; https://download.csdn.net/download/qq_24428851/89828190 管理系统 url: http://localhost:8080/managerLoginPageuser: admin password: 123 用户门户网站…

【设计模式-解释模式】

定义 解释器模式是一种行为设计模式&#xff0c;用于定义一种语言的文法&#xff0c;并提供一个解释器来处理该语言的句子。它通过为每个语法规则定义一个类&#xff0c;使得可以将复杂的表达式逐步解析和求值。这种模式适用于需要解析和执行语法规则的场景。 UML图 组成角色…

SPDK从安装到运行hello_world示例程序

SPDK从安装到运行示例程序 #mermaid-svg-dwdwvhrJiTcgTkVf {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-dwdwvhrJiTcgTkVf .error-icon{fill:#552222;}#mermaid-svg-dwdwvhrJiTcgTkVf .error-text{fill:#552222;s…

android compose ScrollableTabRow indicator 指示器设置宽度

.requiredWidth(30.dp) Box(modifier Modifier.background(Color.LightGray).fillMaxWidth()) {ScrollableTabRow(selectedTabIndex selectedTabIndex, // 默认选中第一个标签containerColor ColorPageBg,edgePadding 1.dp, // 内容与边缘的距离indicator { tabPositions…

【本地缓存】Java 中的 4 种本地缓存

目录 1、手写一个简单的本地缓存1.1、封装缓存实体类1.2、创建缓存工具类1.3、测试 2、Guava Cache2.1、Guava Cache 简介2.2、入门案例2.2.1、引入 POM 依赖2.2.2、创建 LoadingCache 缓存 2.3、Guava Cache 的优劣势和适用场景 3、Caffeine3.1、Caffeine 简介3.2、对比 Guava…

图的基本概念 - 离散数学系列(五)

目录 1. 图的定义 节点与边 2. 度与路径 节点的度 路径与圈 3. 图的连通性 连通图与非连通图 强连通与弱连通 连通分量 4. 实际应用场景 1. 社交网络 2. 城市交通系统 3. 网络结构 5. 例题与练习 例题1&#xff1a;节点的度 例题2&#xff1a;判断连通性 练习题…

linux基础 超级笔记

1.Linux系统的组成 Linux系统内核&#xff1a;提供系统最核心的功能&#xff0c;如软硬件和资源调度。 系统及应用程序&#xff1a;文件、任务管理器。 2.Linux发行版 通过修改内核代码自行集成系统程序&#xff0c;即封装。比如Ubuntu和centos这种。不过基础命令是完全相…

【瑞昱RTL8763E】刷屏

1 显示界面填充 用户创建的各个界面在 rtk_gui group 中。各界面中 icon[]表对界面进行描述&#xff0c;表中的每个元素代表一 个显示元素&#xff0c;可以是背景、小图标、字符等&#xff0c;UI_WidgetTypeDef 结构体含义如下&#xff1a; typedef struct _UI_WidgetTypeDef …