【STM32CubeMX】MPU6050移植DMP流程

  原本是想要自己的模拟I2C库,来组合时选块,对接上DMP所需接口,可是一直卡在初始化,后面改成STM32F4的硬件I2C,也是很便捷的对接上接口了。此外在也参考了网上的移植资料与记录。本文也作为学习笔记,记录下过程。

  使用到的:STM32F407VGT6+STM32CubeMX+MotionDriver6.1。末尾链接提供工程文件和DMP相关文件。

移植流程

简单概述流程

  1. 将DMP相关文件复制到项目文件下
  2. inv_mpu.h文件中定义两个宏定义
  3. 在两个文件,定义配置宏接口
  4. 根据需求,看是否需要替换器件默认的I2C地址
  5. 编译后,有两处报错,双击跳转报错行,通过注释或者更改替代即可。
  6. 导入DMP初始化库,#include "MPU6050_DMP.h"

详细概述流程

  1. 将下述6个文件复制到项目文件下。库文件末尾链接会提供,或者去官网。(简略描述官网下载流程:打开Home | TDK InvenSense,注册账号,选择左上方选项卡”Developers -> Software Downloads -> SmartMotion®“点击跳转后,可页面搜索”MPU“或者下滑就可看到MPU选项卡,就可以看到eMD 6.12下载链接)

    在这里插入图片描述

  2. inv_mpu.h文件中定义两个宏定义。宏STM32_MPU6050用于后续构建对接I2C的配置,宏MPU6050用于选择器件。

    #define STM32_MPU6050
    #define MPU6050
    
  3. inv_mpu_dmp_motion_driver.cinv_mpu.c基于宏配置。因为上述定义了STM32_MPU6050所以可以看到下述是基于该宏下编写。其实要要是不定义新配置宏,在默认的旧宏如MSP430...上做删改也行,不过麻烦些许。

    inv_mpu_dmp_motion_driver.c文件下

    // 引入新的配置
    #elif defined STM32_MPU6050
    #include "stm32f4xx_hal.h"
    #include "MyI2C.h"
    #define delayC_ms    HAL_Delay
    #define get_ms			 get_ms_null
    #define log_i(...)     do {} while (0)
    #define log_e(...)     do {} while (0)
    

    inv_mpu.c文件下

    // 引入新的配置
    #elif defined STM32_MPU6050
    #include "stm32f4xx_hal.h"
    #include "MyI2C.h"
    #define i2c_write   MyI2C_SeriesSendByte
    #define i2c_read    MyI2C_SeriesReceiveByte
    #define delay_ms    HAL_Delay
    #define get_ms      get_ms_null
    #define log_i(...)     do {} while (0)
    #define log_e(...)     do {} while (0)
    #define fabs        fabsf
    #define min(a,b) ((a<b)?a:b)
    

    在这里插入图片描述

    在这里插入图片描述

    必需要修改的宏函数有4个,i2c_writei2c_readdelay_msget_ms。其中除了delay_ms可以用HAL_Delay函数,直接代替外,另外三个函数都在MyI2C.h库,基于原型做转换了,然后因为get_ms暂时无光紧要,就暂时先实现空函数,下面是该库的部分代码:

    uint8_t MyI2C_SeriesSendByte(unsigned char slave_addr, unsigned char reg_addr,unsigned char length, unsigned char const *data)
    {HAL_I2C_Mem_Write(&hi2c1, slave_addr, reg_addr, I2C_MEMADD_SIZE_8BIT, (uint8_t *)data, length,100);return 0;
    }
    uint8_t MyI2C_SeriesReceiveByte(unsigned char slave_addr, unsigned char reg_addr,unsigned char length, unsigned char *data)
    {HAL_I2C_Mem_Read(&hi2c1,slave_addr,reg_addr,I2C_MEMADD_SIZE_8BIT, data,length, 100);return 0;
    }
    void get_ms_null(unsigned long *count)
    {
    }
    
  4. 根据需求,看是否需要替换器件默认的I2C地址

    根据I2C时序函数,看I2C器件地址是要7位,还是8位,因为我使用的是HAL提供的硬件I2C函数,且在函数输入时没有,左移1位,所以要替换器件的7位地址为8位(位移后的)。在inv_mpu.c文件下可以找到,将0x68修改为0xD0,有两个地方存在该定义,不清楚哪个被宏包含顶的,可以两个都修改:

    const struct hw_s hw = {.addr           = 0xD0,
    ......
    
  5. 编译后,有两处报错,双击跳转报错行,通过注释或者更改替代即可。

    // __no_operation();__NOP;
    
    //    if (int_param)
    //        reg_int_cb(int_param);
    
  6. 导入DMP初始化库,#include "MPU6050_DMP.h"

    这个忘记是参考哪里的了,所以库代码就不放出来了,介绍存在的函数。

    int MPU6050_DMP_init(void);
    int MPU6050_DMP_Get_Date(float *pitch, float *roll, float *yaw);
    

主函数

下述是在main.c文件中,使用演示的关键代码块,非全部列出,已经省略无关的代码,请按作用添加到主函数中。

float x = 0;
float y = 0;
float z = 0;
int ret = 0;
// 初始化
do
{ret = MPU6050_DMP_init();printf("MPU6050 init, ret = %d\r\n", ret);HAL_Delay(100);
} while(ret);
// 获取数据
while (1)
{//MPU6050_DMP_Get_Date(&x,&y,&z);while(MPU6050_DMP_Get_Date(&x,&y,&z)!=0){}printf("%.2f,%.2f,%.2f\r\n",x,y,z);
}

以及工程演示图:

可以看到,初始化还是需要手动将模块放置水平,放平后自检才算完成后,整个初始化完成。

在这里插入图片描述


常见问题

下述问题来自自身遇见,和总结网上的解决办法。

  1. 编译报错Gyro driver is missing the system layer implementations.

    没有按流程定义好相关和定义配置宏,导致在编译时找不到任何1个符合的配置,就通过#else跳转#error输出错误消息。

  2. 调用MPU6050_DMP_init初始化的时候,一直返回-1

    这里我遇到的是对接的时序接口i2c_writei2c_read可能时序哪里不够严谨,导致的初始化返回失败。还有1种情况就是,器件地址问题,这得看接入的I2C的读写函数是否会左移1位也就是addr << 1,如果会,按照在DMP中默认预定义是7位地址0x68,是没问题的,如果不会则要修改成0xD0也就是预先位移了。

  3. 调用MPU6050_DMP_init初始化的时候,一直返回-9

    错误代码是表示自检失败,要将模块放置水平。不过,默认的水平比较苛刻,所以可以通过注释部分自检相关的代码了,放宽模块水平的条件。

    inv_mpu.c文件,大概2747~2754行左右。

    //#ifdef AK89xx_SECONDARY
    //    compass_result = compass_self_test();
    //    if (!compass_result)
    //        result |= 0x04;
    //#else
    //        result |= 0x04;
    //#endif
    
  4. 获取到的数据溢出,可能是fifo溢出了,改成下述,加快获取。

    //MPU6050_DMP_Get_Date(&x,&y,&z);
    while(MPU6050_DMP_Get_Date(&x,&y,&z)!=0){}
    

资料链接

CupCondition.zip为项目文件,可以在CupCondition\MDK-ARM\Library下提取到上文所有库。

MotionDriver_6_1.zip为DMP的六个核心文件,也是上文提到的要复制到项目中的。

motion_driver_6.12.zip是官网下载的整体包,里面存在较多东西。

链接:https://pan.baidu.com/s/1zybNDBb3zCNYr2XTj1Wzfw  提取码:j95w

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

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

相关文章

Java项目: 基于SpringBoot+mybatis+maven+mysql教师工作量管理系统(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismavenmysql教师工作量管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观…

软件测试 - 性能测试 (概念)(并发数、吞吐量、响应时间、TPS、QPS、基准测试、并发测试、负载测试、压力测试、稳定性测试)

一、性能测试 目标&#xff1a;能够对个人编写的项目进行接口的性能测试。 一般是功能测试完成之后&#xff0c;最后做性能测试。性能测试是一个很大的范围&#xff0c;在学习过程中很难直观感受到性能。 以购物软件为例&#xff1a; 1&#xff09;购物过程中⻚⾯突然⽆法打开…

JRebel and XRebel离线安装

近期&#xff0c;使用JRebel and XRebel&#xff0c;发现总是安装不上&#xff0c;可能是网络的原因吧。所以就使用离线方式进行安装。 JRebel 是一款用于 Java 开发的生产力工具。它的主要功能是加速开发周期&#xff0c;通过在不重启 JVM 的情况下即时加载代码变更。这样&…

在VB.net中,如何把20240906转化成日期格式

标题 vb.net中&#xff0c;如何把20240906转化成日期格式 正文 在 VB.NET 中&#xff0c;将一个数字字符串&#xff08;如 "20240906"&#xff09;转换为日期格式&#xff0c;你可以使用 DateTime.Parse 或 DateTime.TryParse 方法。这些方法可以将符合日期格式的字符…

Github 2024-09-07Rust开源项目日报Top10

根据Github Trendings的统计,今日(2024-09-07统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10CUE项目1Python项目1Go项目1Polars: Rust中的DataFrame接口和OLAP查询引擎 创建周期:1354 天开发语言:Rust, Python协议类型:MIT …

【STM32开发】GPIO最全解析及应用实例

目录 【1】GPIO概述 GPIO的基本概念 GPIO的应用 【2】GPIO功能描述 1.IO功能框图 2.知识补充 3.功能详述 浮空输入 上拉输入 下拉输入 模拟输入 推挽输出 开漏输出 复用开漏输出和复用推挽输出 【3】GPIO常用寄存器 相关寄存器介绍 4个32位配置寄存器 2个32位数据寄存器 1个32位…

机器学习如何用于音频分析?

机器学习如何用于音频分析&#xff1f; 一、说明 近十年来&#xff0c;机器学习越来越受欢迎。事实上&#xff0c;它被用于医疗保健、农业和制造业等众多行业。随着技术和计算能力的进步&#xff0c;机器学习有很多潜在的应用正在被创造出来。由于数据以多种格式大量可用&…

JVM系列(十) -垃圾收集器介绍

一、摘要 在之前的几篇文章中,我们介绍了 JVM 内部布局、对象的创建过程、运行期的相关优化手段以及垃圾对象的回收算法等相关知识。 今天通过这篇文章,结合之前的知识,我们一起来了解一下 JVM 中的垃圾收集器。 二、垃圾收集器 如果说收集算法是内存回收的方法论,那么…

OrangePi AIpro 香橙派 昇腾 Ascend C 算子开发 与 调用 - 通过aclnn调用的方式调用AddCustom算子

OrangePi AIpro 香橙派 昇腾 Ascend C 算子开发 与 调用 通过aclnn调用的方式调用 - AddCustom算子 - 单算子API执行(aclnn) 多种算子调用方式 *开发时间使用场景调用方式运行硬件基于Kernel直调工程&#xff08;快速&#xff09;少单算子调用&#xff0c;快速验证算法逻辑IC…

Kafka【十二】消费者拉取主题分区的分配策略

【1】消费者组、leader和follower 消费者想要拉取主题分区的数据&#xff0c;首先必须要加入到一个组中。 但是一个组中有多个消费者的话&#xff0c;那么每一个消费者该如何消费呢&#xff0c;是不是像图中一样的消费策略呢&#xff1f;如果是的话&#xff0c;那假设消费者组…

C语言-程序环境 #预处理 #编译 #汇编 #链接 #执行环境

文章目录 前言 一、程序的环境翻译和执行环境 二、翻译环境 (一)、整体把握 (一)、编译 1、预处理(预编译) 2、编译 a、词法分析 b、语法分析 c、语义分析 d、符号汇总 3、汇编 (二)、链接 三、运行环境 总结​​​​​​​ 前言 路漫漫其修远兮&#xff0c;吾将…

9月7日微语报,星期六,农历八月初五

&#xff19;月&#xff17;日微语报&#xff0c;星期六&#xff0c;农历八月初五&#xff0c;周末愉快&#xff01; 一份微语报&#xff0c;众览天下事&#xff01; 1、21个部门&#xff1a;符合条件的流动儿童家庭或可配公租房。 2、多所高校2025年招生简章显示&#xff0…

API安全 | 发现API的5个小tips

在安全测试目标时&#xff0c;最有趣的测试部分是它的 API。API 是动态的&#xff0c;它们比应用程序的其他部分更新得更频繁&#xff0c;并且负责许多后端繁重的工作。在现代应用程序中&#xff0c;我们通常会看到 REST API&#xff0c;但也会看到其他形式&#xff0c;例如 Gr…

Jenkins构建CI/CD

CI/CD 软件开发的连续方法基于自动执行脚本&#xff0c;以最大限度地减少在开发应用程序时引入错误的可能性。从新代码的开发到部署&#xff0c;它们需要较少的人为干预甚至根本不需要干预。 它涉及在每次小迭代中不断构建&#xff0c;测试和部署代码更改&#xff0c;从而减少…

对极约束及其性质 —— 公式详细推导

Title: 对极约束及其性质 —— 公式详细推导 文章目录 前言1. 对极约束 (Epipolar Constraint)2. 坐标转换 (Coordinate Transformations)3. 像素坐标 (Pixel Coordinates)4. 像素坐标转换 (Transformations of Pixel Coordinates)5. 本质矩阵 (Essential Matrix)6. 线坐标 (Co…

单调栈的实现

这是C算法基础-数据结构专栏的第二十四篇文章&#xff0c;专栏详情请见此处。 引入 单调栈就是满足单调性的栈结构&#xff0c;它最经典的应用就是给定一个序列&#xff0c;找出每个数左边离它最近的比它大/小的数。 下面我们就来讲单调栈的实现。 定义 单调栈就是满足单调性…

pycharm破解教程

下载pycharm https://www.jetbrains.com/pycharm/download/other.html 破解网站 https://hardbin.com/ipfs/bafybeih65no5dklpqfe346wyeiak6wzemv5d7z2ya7nssdgwdz4xrmdu6i/ 点击下载破解程序 安装pycharm 自己选择安装路径 安装完成后运行破解程序 等到Done图标出现 选择Ac…

精准设计与高效开发:用六西格玛设计DFSS实现新能源汽车开发突破

快速变化的市场需求和激烈的竞争迫使制造企业不得不持续创新和优化产品开发流程。如何在保证产品质量的前提下&#xff0c;加快产品开发周期&#xff0c;成为许多企业亟待解决的问题。六西格玛中的DFSS&#xff08;Design for Six Sigma&#xff09;模型提供了一种系统的方法&a…

【银河麒麟高级服务器操作系统实例】虚拟化平台系统服务中断现象分析及处理建议

服务器环境以及配置 【机型】虚机 处理器&#xff1a; Kunpeng-920 内存&#xff1a; 40G 【内核版本】 4.19.90-23.8.v2101.ky10.aarch64 【OS镜像版本】 银河麒麟操作系统 Kylin-Server-10-SP1-Release-Build20-20210518-arm64 【第三方软件】 智能运维系统、mysq…

5G移动网络运维实验(训)室解决方案

随着第五代移动通信技术&#xff08;5G&#xff09;的快速普及和工业互联网的迅猛发展&#xff0c;全球制造业正面临着前所未有的深刻变革。5G技术凭借其超高的传输速率、极低的延迟以及大规模的连接能力&#xff0c;为工业自动化、智能制造等领域带来了革命性的技术支持。为了…