STM32平台下官方DMP库6.12超详细移植教程

本文详细介绍了如何在STM32F103C8平台上移植MotionDriver官方库,涉及I2C驱动、OLED显示和匿名地面站通信,以及处理编译时的错误和警告,重点在于库的修改和适配STM32F103环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前记

Motion Driver官方库:Motion_Driver_6.12
STM32工程源码:STM32F103C8-软件MPU6050(DMP)

MPU6050软件I2C驱动,带OLED显示,移植了匿名地面站,可显示姿态信息(匿名地面站通信协议6.0版本,本人使用测试的匿名地面站版本V6.56版本)
匿名地面站姿态信息显示

———————————————————————————————————————————

1.解压官方库源文件

首先,让我们解压官方库源文件“motion_driver_6.12”,并拷贝整个文件夹到新工程的“Libraries”文件夹下,改名为“Motion_Driver”
请添加图片描述

2.替换“ibmpllib.a”库文件

接下来,我们需要替换“mpl”文件夹下的“libmpllib.a”库文件,(因为源程序是IAR环境,库的文件后缀为.a,现在换成ARM平台下专为keil_M3生成的库,文件后缀为.lib),其路径为:motion_driver_6.12\mpl libraries\arm\Keil,因为我们是在STM32F103工程下移植库,故应选择“libmpllib_Keil_M3.zip”库,先将其解压,解压出来的库文件名即为“libmpllib.lib”,然后删除原libmpllib.a”库文件,添加我们刚才解压出来的“libmpllib.lib”库文件。请添加图片描述
接下来让我们打开工程:做一些必要的添加与修改

3.添加必要的宏定义

USE_STDPERIPH_DRIVER, STM32F10X_MD,USE_DMP,MPL_LOG_NDEBUG=1,EMPL,MPU6050,EMPL_TARGET_STM32F1请添加图片描述

4.添加头文件路径

在新工程中添加头文件路径,并勾选【C99 Mode】请添加图片描述

5.在工程管理中添加相应的目录

请添加图片描述
并把“Motion_Driver”库文件中所有的“.c”文件添加到工程目录下(包括“libmpllib.lib”库文件)请添加图片描述

6.修改文件,消除错误警告

工程配置上需要添加与修改的已经完成,接下来让我们编译一下工程,针对编译器所提示的错误与警告逐个的进行解决
请添加图片描述
(1)warning: #1-D: last line of file ends without a newline
首先大量有关keil工程下我们经常遇到的“文件的最后一行没有换行结束”问题,很简单,为了不产生这个警告,到每一个警告提示的文件中,在最后一行回车下一行即可。

再次编译工程,看下一个错误提示请添加图片描述
(2)error: #169: expected a declaration
因为我们是在STM32F103工程下对库进行移植,而官方所给的ARM_Keil平台下的移植例程源码是针对STM32F4的,所以我们把所有库文件中宏定义:#if defined EMPL_TARGET_STM32F4 改为 #if defined EMPL_TARGET_STM32F1
我们通过keil的搜索功能,找到所有的#if defined EMPL_TARGET_STM32F4定义,并修改,然后再次编译工程,此时又会产生一些新的错误,不过没事,那预示着我们离成功又近了一步。请添加图片描述
让我们先来解决上图提示的第三个错误
(3)error: #5: cannot open source input file “stm32f4xx.h”: No such file or directory

因为我们是在STM32F103工程下对库进行移植,所以把包含的STM32固件库头文件修改为#include “stm32f10x.h”

接下来的错误都只是提示“不能打开源代码某些头文件,没有这样的文件或目录”,而这些是我们需要自己为“Motion_Driver”库提供接口的头文件,比如包括必要的I2C读写接口,定时服务等,如若要输出调试信息到上位机,还需要提供串口接口。

让我们看下一个错误

(4)error: #5: cannot open source input file “i2c.h”: No such file or directory
对于此类错误,我们只需要把我们事先写好的“i2c.c和i2c.h”添加进工程即可

然后双击此错误定位到“inv_mpu.c”文件中,我们把“#include "main.h"和#include “board-st_discovery.h””头文件声明删除,这两个头文件是官方STM32F4例程里建立的文件,我们的库移植中不使用。顺便也把另一个"inv_mpu_dmp_motion_driver.c"中的“#include "main.h"和#include “board-st_discovery.h””头文件声明删除。
请添加图片描述
同样的对于错误
(5)error: #5: cannot open source input file “uart.h”: No such file or directory
我们把事先写好的“uart.c和uart.h”添加进工程即可

(6) warning: #223-D: function “__no_operation” declared implicitly

“__no_operation9();” 是IAR中空操作指令,可用来查看代码执行位置,在keil工程下,用" __ASM(“nop”);"替换

(7)在"inv_mpu_dmp_motion_driver.c"文件中添加 #include “SysTick.h” 和 #include "i2c.h"头文件声明

(8)在"inv_mpu"中添加 #include “SysTick.h” 和 #include “i2c.h” 头文文件声明

(9)"data_builder.c"中,修改static struct inv_sensor_cal_t sensors; 为 struct inv_sensor_cal_t sensors; 即去掉静态声明

7.总结

我们总结一下在库文件中都做了那些修改:
(1)在log_stm32.c文件中:

把#include "stm32f4xx.h"修改为 #include "stm32f10x.h"
  • 1
删除 #include "main.h" 和 #include "board-st_discovery.h" 头文件声明
  • 1
修改 #include "uart.h" 为自己写的 #include "USART1.h"
  • 1

(2)inv_mpu.c文件中:

修改 #include "i2c.h"  为 自己写的I2C头文件 #include "SI2C1.h"
  • 1

(3)inv_mpu_dmp_motion_driver.c文件中:

修改 #include "i2c.h"  为 自己写的I2C头文件 #include "SI2C1.h"

删除 #include "main.h" 和 #include "board-st_discovery.h" 头文件声明

STM32平台下官方DMP库6.12超详细移植教程_mpu motion driver下载-优快云博客

03-18
### 关于 MPU6050 DMP 的使用说明 MPU6050 是一种集成了加速度计和陀螺仪的惯性测量单元 (IMU),其内置数字运动处理器 (DMP) 可用于处理复杂的传感器数据并减少主机微控制器的工作负担。为了充分利用 MPU6050 的功能,开发者可以借助官方或其他社区开发的 DMP 资料来实现复杂的功能。 #### 下载 DMP 可以从指定的 GitCode 仓下载 MPU6050 DMP 相关资料[^1]。以下是具体操作方法: 访问项目地址: `https://gitcode.com/open-source-toolkit/7e6da` 在此页面上查找与 DMP 相关的文件夹或文档。通常情况下,这些资源可能包括但不限于以下内容: - **固件二进制文件**:这是预编译好的 DMP 固件,可以直接加载到 MPU6050 中。 - **驱动程序源码**:帮助开发者通过 I2C 接口配置和读取 MPU6050 数据。 - **示例代码**:展示如何初始化设备以及解析来自 DMP 的数据流。 #### 配置和使用 DMP 功能 要启用 MPU6050 上的 DMP 并利用它提供的高级特性(如姿态估计),需完成以下几个方面的工作: ##### 初始化硬件连接 确保 MCU 和 MPU6050 正确相连并通过 I2C 协议通信。典型的接线方式如下所示: | MPU6050 Pin | Function | |-------------|------------------| | VCC | 连接到电源 | | GND | 地 | | SDA | I2C 数据线 | | SCL | I2C 时钟线 | ##### 加载 DMP 固件至 MPU6050 在某些应用中,需要先将特定版本的 DMP 固件写入 MPU6050 的内部存储器。这一步骤可以通过调用专用函数 `mpu_dmp_init()` 实现,该函数会自动上传必要的指令序列给芯片执行。 ```c // 假设已定义 mpu 结构体实例化对象 if (!mpu.dmpInitialize()) { Serial.println(F("Failed to initialize MPU6050 DMP!")); } else { Serial.println(F("MPU6050 DMP initialized successfully.")); } ``` 上述代码片段展示了如何验证 DMP 是否成功启动。 ##### 解析四元数输出 一旦 DMP 开始运行,则可通过读取 FIFO 缓冲区获得实时的姿态信息。最常见的表示形式之一就是单位四元数 \(q=[w,x,y,z]\),它们描述了三维空间中的旋转状态。 下面是一个简单的 C++ 函数用来提取最新的四元数值: ```cpp void getQuaternion(float &qw, float &qx, float &qy, float &qz){ uint8_t fifoBuffer[64]; // FIFO 存储缓冲数组 // 获取当前FIFO包大小 int packetSize = mpu.dmpGetFIFOPacketSize(); while(mpu.dmpGetCurrentFIFOPacket(fifoBuffer)){ VectorFloat q; mpu.dmpGetQuaternion(&q,fifoBuffer); qw=q.w; qx=q.x; qy=q.y; qz=q.z; } } ``` 此部分逻辑依赖 InvenSense 提供的应用编程接口(API) 来简化底层细节的操作过程。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值