HAL库硬件IIC_MPU6050_DMP移植

Posted 薛薛无敌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HAL库硬件IIC_MPU6050_DMP移植相关的知识,希望对你有一定的参考价值。

HAL库硬件IIC_MPU6050_DMP移植

一、CUBEMX基本配置

​ 本篇博客只介绍如何在HAL库进行移植代码,所以只开启了一些必要的端口:I2C1,USART1,另外介绍一下本文基于芯片STM32F411CEU6,大鱼电子的DMP库,STM32F10x系列移植方法相同。

二、配置移植环境

​ 首先,需要从大鱼电子里面移植需要的库函数,在自己创建的工程里面自己新建一个文件夹用来存放用户自己的一些代码。
在这里插入图片描述
在这里插入图片描述

​ 其次在工程里面将每一个模块“Add New Group”,简介清晰,以便后期做一些代码的调试。

在这里插入图片描述

​ 然后串口输出的话,还需要进行USART串口的重定义,我习惯性的放在usart.c里面,这里的红叉叉的消除,需要添加头文件#include “stdio.h”

在这里插入图片描述

​ 然后进行编译,不出意外的话就是这个样子。
在这里插入图片描述

三、移植DMP

​ 将“sys.h"改为”main.h“,删去”delay.h“.因为稍微看过后”sys.h“会发现,它里面存放的是用户自己配置的代码的.h库,因此,你可以更改为main.h,再将自己配置的.h库放main.h里面(这一步之后会有介绍)

在这里插入图片描述

​ 打开mpu6050.h,将"mpuiic.h" 改为”i2c.h“,因为你配置的是硬件IIC的代码,不需要自己另外配置IIC函数

在这里插入图片描述

​ 将初始化软件IIC函数删去 MPU_IIC_Init();更改为硬件IIC初始化;将delay_ms()改为HAL_Delay()
在这里插入图片描述

​ 在mpu6050.h里面添加 #define u8 uint8_t; #define u16 uint16_t

​ 配置完这些之后,你就会发现红叉叉比较少,但是还有一个地方需要更改,将原本的这四个软件IIC的读写函数(存在于mpu6050.c),更改为硬件IIC的读写函数;一定要注意HAL_Delay(1)不可以删去,删去后将无法实现IIC的读写

uint8_t MPU_Write_Len(uint8_t reg,uint8_t len,uint8_t *buf)
{
  extern I2C_HandleTypeDef hi2c1;
  HAL_I2C_Mem_Write(&hi2c1, MPU_WRITE, reg, I2C_MEMADD_SIZE_8BIT, buf, len, 0xfff);
  HAL_Delay(1);
  
  return 0;
}

uint8_t MPU_Read_Len(uint8_t reg,uint8_t len,uint8_t *buf)
{ 
  extern I2C_HandleTypeDef hi2c1;
  HAL_I2C_Mem_Read(&hi2c1, MPU_READ, reg, I2C_MEMADD_SIZE_8BIT, buf, len, 0xfff);
  HAL_Delay(1);
  
  return 0;	
}

uint8_t MPU_Write_Byte(uint8_t reg,uint8_t data) 				 
{ 
  extern I2C_HandleTypeDef hi2c1;
  unsigned char W_Data=0;

  W_Data = data;
  HAL_I2C_Mem_Write(&hi2c1, MPU_WRITE, reg, I2C_MEMADD_SIZE_8BIT, &W_Data, 1, 0xfff);
  HAL_Delay(1);
  
  return 0;
}

uint8_t MPU_Read_Byte(uint8_t reg)
{
  extern I2C_HandleTypeDef hi2c1;
  unsigned char R_Data=0;
  
  HAL_I2C_Mem_Read(&hi2c1, MPU_READ, reg, I2C_MEMADD_SIZE_8BIT, &R_Data, 1, 0xfff);
  HAL_Delay(1);
  
  return R_Data;		
}

然后就是更新一下.h库,并且编译一下,看一下错误.

在这里插入图片描述

第一种:找到类似的错误,这样更改

在这里插入图片描述

第二种:多了一个参数,删去,因为自己写的硬件IIC的读写函数的器件地址,是直接在函数内部就写好的,不需要作为一个形参

在这里插入图片描述

再编译一下,查看错误,更改错误(u8的更改,delay.h的删去)

在这里插入图片描述
再进行一次编译,就发现了这种错误

在这里插入图片描述

这种错误其实是,用户自己写的IIC读写函数,与DMP的内部解码函数的形参不匹配,最好的修改方法就是,用户再增加两个IIC读写函数,放到mpu6050.c里面;区别于之前的MPU_Write_Len,于是将函数名称改为DMP_Write_Len;并更改对应的.h库

uint8_t DMP_Write_Len(uint8_t addr, uint8_t reg,uint8_t len,uint8_t *buf)
{
  extern I2C_HandleTypeDef hi2c1;
  HAL_I2C_Mem_Write(&hi2c1, addr, reg, I2C_MEMADD_SIZE_8BIT, buf, len, 0xfff);
  HAL_Delay(1);
  
  return 0;
}

uint8_t DMP_Read_Len(uint8_t addr, uint8_t reg,uint8_t len,uint8_t *buf)
{ 
  extern I2C_HandleTypeDef hi2c1;
  HAL_I2C_Mem_Read(&hi2c1, addr, reg, I2C_MEMADD_SIZE_8BIT, buf, len, 0xfff);
  HAL_Delay(1);
  
  return 0;	
}

并且将DMP的IIC的读写函数的宏定义修改(在imv_mpu.h中)然后编译,这些问题,读者可以进行自己解决了.

在这里插入图片描述在这里插入图片描述

最后一定要显示这些代码,用来后续的调整
在这里插入图片描述

然后这样就是0 error, 0 warring.

然后进行测试,这里就要注意将自己添加代码的.h文件全部添加到main.h里面

在这里插入图片描述

四、最后调整

到了这一步,你用串口打印出来后就会发现,可以显示原始数据,但是DMP并没有解算。所以查找原因。
在这里插入图片描述

但是我不敢保证不一样的芯片,他们出错的原因是否一样。

第一个错误:Unsupported software product rev;可以这样修改:
在这里插入图片描述

第二个错误:给mpu_dmp_init一个返回值,串口打印出来后显示8,这时候你直接把这个隐去就可以

在这里插入图片描述
在这里插入图片描述

五、结尾

​ 总的来说呢,就是这样,要是有读者还有其他的问题都可以跟我私信交流。当然我可以附上移植DMP所需的文件,读者直接私信我,我不喜欢用下载,这样对很多CSDN读者不友好,成了氪金的一个blog。

以上是关于HAL库硬件IIC_MPU6050_DMP移植的主要内容,如果未能解决你的问题,请参考以下文章

STM32CubeMX(05) 移植陀螺仪MPU6050的DMP库读取三轴角度,加速度

STM32F1基于STM32CubeMX配置移植dmp库通过串口打印MPU6050数据

STM32CubeMX配置工程移植dmp库配合匿名四轴上位机三维动态显示测试

MPU9250的MPL移植_HAL库(以STM32F103为主控)

基于Arduino平台dmp库+匿名四轴上位机测试MPU6050

MPU9250的dmp移植