当前位置: 首页 > article >正文

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

改正
在这里插入图片描述


http://www.kler.cn/news/336571.html

相关文章:

  • 红队apt--文本宏病毒攻击思路整理
  • 自用Proteus(8.15)常用元器件图示和功能介绍(持续更新...)
  • RESTful API介绍
  • QT-数据类型容器类窗口控件模态框
  • Github 2024-10-04 Java开源项目日报Top8
  • (C语言贪吃蛇)4.贪吃蛇地图优化及算法说明
  • 【FPGA开发】Xilinx FPGA差分输入时钟的使用方法
  • 深度学习-----------------机器翻译与数据集
  • 在QT中将Widget提升为自定义的Widget后,无法设置Widget的背景颜色问题解决方法
  • (五)Protues仿真STM32单片机串口数据流收发
  • 萤火php端: 查询数据的时候报错: “message“: “Undefined index: pay_status“,
  • 【408计算机考研课程】数据结构-数据结构在学什么?
  • 使用html写一个能发起请求的登录界面
  • 智能平衡移动机器人-平台硬件电路
  • 旅游平台|智慧旅游平台|基于java的智慧旅游平台设计与实现(源码+数据库+文档)
  • 自动驾驶系列—智能驾驶中的“换挡革命”:线控换挡技术详解
  • 毕业设计——医院信息化系统原型设计
  • Thinkphp/Laravel基于vue.js的社区健康服务管理系统Vscode毕业设计成品源码_0i0k4
  • ubuntu添加 SSH 密钥到 GitHub
  • 基于ssm vue uniapp实现的爱心小屋公益机构智慧管理系统