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。

  • 32
    点赞
  • 116
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 121
    评论
在使用STM32 HAL库进行IIC驱动MPU6050时,可以按照以下步骤进行配置和初始化: 1. 首先,添加所需的头文件,包括"oled.h"、"mpu6050.h"、"control.h"、"inv_mpu.h"和"inv_mpu_dmp_motion_driver.h"。\[1\] 2. 在初始化函数中,调用MX_I2C1_Init()函数来初始化IIC总线。\[2\] 3. 调用mpu_init()函数来初始化MPU6050。如果返回值为0,则表示初始化成功。\[2\] 4. 使用mpu_set_sensors()函数设置所需的传感器,例如陀螺仪和加速度计。\[2\] 5. 使用mpu_configure_fifo()函数设置FIFO,以确定传感器数据的存储方式。\[2\] 6. 使用mpu_set_sample_rate()函数设置采样率。\[2\] 7. 调用dmp_load_motion_driver_firmware()函数加载DMP固件。\[2\] 8. 使用dmp_set_orientation()函数设置陀螺仪方向。\[2\] 9. 使用dmp_enable_feature()函数设置DMP功能,例如姿态、敲击和原始数据的发送。\[2\] 10. 使用dmp_set_fifo_rate()函数设置DMP输出速率。\[2\] 11. 调用run_self_test()函数进行自检。\[2\] 12. 使用mpu_set_dmp_state()函数使能DMP。\[2\] 13. 在相关初始化函数定义之后,添加循环代码,通过mpu_dmp_get_data()函数获取角度数据,并进行相应的处理和输出。\[3\] 14. 最后,根据需要添加延时函数,以控制数据的采样频率。\[3\] 以上是使用STM32 HAL库进行IIC驱动MPU6050的基本步骤。根据具体的应用需求,你可能需要进行一些额外的配置和修改。 #### 引用[.reference_title] - *1* *2* *3* [HAL库 STM32CubeMX----SPI驱动OLED 与 IIC驱动MPU6050](https://blog.csdn.net/weixin_62213694/article/details/125018662)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 121
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DO_Tonight

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值