[TOC]

STM32CubeMx快速移植DMP库读取MPU6050数据

该教程基于正点原子修改的dmp库,进一步修改,可以通过STM32CubeMX进行快速移植开发,手速快一点5分钟绝对能移植成功!!!

一、准备工作

1.硬件平台

使用正点原子STM32F4探索者

f4img

2.软件平台

STM32CubeMX软件平台 V6.2.1

Keil5软件平台 V5.32

STM32CubeProgrammer下载平台

GIT分布式版本控制系统(非必须)

20210207234636

3.MPU6050原理图

F4芯片IIC引脚为PB8、PB9:

20210606160826

MPU6050原理图如下:

20210606160752

二、操作步骤

1.CubeMX配置硬件IIC、串口(用于调试)生成代码

串口配置和硬件IIC配置可以参考我之前的两篇博客

STM32CubeMX-串口中断实验

STM32CubeMX-硬件IIC读取AT24C02

这两步配置很简单,只需要安装我教程里面的配置就行,只需要配置Cube,生成代码后不要急着写代码,下一步导入DMP库

2.导入DMP库

进入CubeMX生成的代码工程,在工程文件夹下新建一个Hardware文件夹

20210606162856

进入Hardware文件夹,如果有Git软件的同学,右击进入GitBush,粘贴如下代码,按下Enter键

1
2
3
4
5
git init
git config core.sparsecheckout true
echo '/MPU6050/*' >> .git/info/sparse-checkout #改变添加文件夹
git remote add github https://github.com/Ajie16/Useful_Code_of_JeckXu.git #改变仓库链接
git pull github master #作者jeckxu

代码开始执行,将会把我修改的6050接口代码拉下来

20210606163148

拉下来后的文件夹

20210606163256

没有Git分布式管理工具的同学,进入CSDN下载链接下载MPU6050代码,然后手动解压到如图位置就行!

下载链接:MPU6050的DMP驱动代码

代码放好后我们进入MDK工程,添加代码

MDK工程新建Hardware文件夹,将MPU6050下所有.c文件添加(3个)

20210606163529

文件添加后,按下图点击位置添加编译路径定位到MPU6050

20210606163927

在usart.c文件的用户代码0段添加重定向代码,便于使用printf进行调试,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//printf重定向代码,修改其底层fputc
#if 1
#include <stdio.h>

/* 告知连接器不从C库链接使用半主机的函数 */
#pragma import(__use_no_semihosting)

/* 定义 _sys_exit() 以避免使用半主机模式 */
void _sys_exit(int x)
{
x = x;
}

/* 标准库需要的支持类型 */
struct __FILE
{
int handle;
};

FILE __stdout;

/* */
int fputc(int ch, FILE *stream)
{
/* 堵塞判断串口是否发送完成 */
/* 不同芯片的串口标志位不一定相同! */
while((USART1->SR & 0X40) == 0);

/* 串口发送完成,将该字符发送 */
USART1->DR = (uint8_t) ch;

return ch;
}

#endif

插入位置

20210606164526

准备工作到此结束了,下面就是修改main.c文件的代码,调用API了

3.调用API

在main.c的用户环境包含内添加使用到的头文件

1
2
3
4
5
#include <stdio.h>
#include "../../../Hardware/MPU6050/mpu6050.h"
#include "../../../Hardware/MPU6050/delay.h"
#include "../../../Hardware/MPU6050/eMPL/inv_mpu.h"
#include "../../../Hardware/MPU6050/eMPL/inv_mpu_dmp_motion_driver.h"

20210606165027

在用户变量代码段添加如下变量,用于存放MPU6050的各项数据;

1
2
3
4
float pitch,roll,yaw; 		//欧拉角
short aacx,aacy,aacz; //加速度传感器原始数据
short gyrox,gyroy,gyroz; //陀螺仪原始数据
short temp; //温度

20210606165159

用户初始代码段2插入6050和dmp初始化代码

1
2
3
4
5
6
7
8
while(MPU_Init());					//初始化MPU6050
printf("%s\r\n","jeck666");
while(mpu_dmp_init())
{
delay_ms(200);
printf("%s\r\n","Mpu6050 Init Wrong!");
}
printf("%s\r\n","Mpu6050 Init OK!");

20210606165343

代码主循环插入如下代码,用于将获取的数据通过串口上传给上位机

1
2
3
4
5
6
7
8
9
10
if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
{
temp=MPU_Get_Temperature(); //得到温度值
MPU_Get_Accelerometer(&aacx,&aacy,&aacz); //得到加速度传感器数据
MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //得到陀螺仪数据
printf("三轴角度:%f-%f-%f\r\n",pitch,roll,yaw);
printf("三轴加速度:%d-%d-%d\r\n",aacx,aacy,aacz);
printf("三轴角角度:%d-%d-%d\r\n",gyrox,gyroy,gyroz);
}
delay_ms(100);

20210606170314

编译程序,无报错

20210606170342

4.程序下载,观察现象(通用步骤)

程序下载我一般用两种方式:

第一种是使用MDK自带的下载环境下载程序,我们给单片机连接ST-Link后配置下载,点击魔术棒,选择debug

20210208181431

选择ST-link后,点击setting

20210208181619

添加对应F4的Flash

20210208181825

keil界面点击下载

20210208182113

第二种是使用Stm32Programmer下载软件,该下载软件下载方式多,下载快,下面我使用st-link下载

打开软件,点击connect左边选择stlink后再点击connect连接下载器

20210208182703

点击open file,找到工程路径下MDK文件夹下工程生成的hex文件

20210208182650

之后点击downlod下载,下载结果如下

20210208182721

5.实验现象

通过串口助手进行调试,上电复位后串口接受陀螺仪的值,移植到此完成!!!

mpu6050

wechat