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。

物联沃分享整理
物联沃-IOTWORD物联网 » HAL库硬件IIC MPU6050 DMP移植

发表评论