HAL库硬件IIC_MPU6050_DMP移植_unsupported software product-程序员宅基地

技术标签: stm32  两轮平衡车循迹  

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。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_51341083/article/details/117475886

智能推荐

go echo 实现聊天室功能(websocket连接)_golang echo websocket-程序员宅基地

文章浏览阅读609次。最近在自学go语言,根据掌握的东西试着写一个聊天室功能,代码可能不是最精简的!效果:代码文件放的位置:服务端代码:package mainimport ( "encoding/json" "fmt" "github.com/labstack/echo" "github.com/labstack/echo/middleware" "golang.org/x/net/websocket")type Client struct { Name string //用户名称 _golang echo websocket

Win11重启后无法进入系统解决办法_win11装好后重启进不了系统-程序员宅基地

文章浏览阅读3.5k次。Win11重启后无法进入系统解决办法分享。遇到电脑不能启动问题,很多的用户都会找人来维修。其实不用这么麻烦,只要不是硬件问题,开机的时候屏幕有显示,但是是错误代码。这个情况我们是可以通过重装系统的方法来解决的,我们只需要通过u盘来安装一个新系统,就可以重新开机进入到系统中了。_win11装好后重启进不了系统

MarkVI控制系统EGD通讯协议解析_egd markvi-程序员宅基地

文章浏览阅读2.9k次。MarkVI控制系统EGD通讯协议解析EGD通讯协议解析LCI和励磁控制器通讯协议_egd markvi

div获得焦点_div可以获取焦点吗-程序员宅基地

文章浏览阅读1k次。div正常情况下是无法获得焦点的,所以其blur方法和focus方法都是没有用的,解决方案如下:<div class="fileInfo" tabindex = "0" contenteditable="false"></div>加入tabindex后div便可通过tab或点击的方式获得焦点,也可通过js的focus方法获得css中去除获得焦点状态下的边框:o..._div可以获取焦点吗

JSP 汉字乱码解决方法-摘自百度知道_jsp中文字乱码-程序员宅基地

文章浏览阅读434次。刚开始学习jsp的程序员都会遇到这样一个问题,就是网页上的中文无法显示.总结了以下几条方法。 1、在jsp页中加入一条语句: 中文显示就正常了。 2、对于从网页中的文本框通过String parameter = request.getParameter(“parameter”);方式获得的字符串,均是8859_1的编码,如果想把它显示在网页上就必须得用parameter = new_jsp中文字乱码

威联通QNAP-通过WinSCP访问安装路径并执行命令_威联通winscp-程序员宅基地

文章浏览阅读6.8k次。需要打开威联通SSH功能;WinSCP官网下载软件下载路径通过威联通admin账户(重要)登录WinSCP,便可访问到威联通软件安装路径;利用WinSCP连接威联通成功后,点击“命令”菜单图标,即可采用命令访问威联通文件。..._威联通winscp

随便推点

万字长文,细说长沙银行的数字化研发管理转型之路-程序员宅基地

文章浏览阅读3.3k次,点赞2次,收藏16次。4月17日,长沙银行信息技术部陈宝生总,与Agilean 首席咨询顾问吴穹博士在2021 DevOps Days 大会上,共同作了《长沙银行数字化研发管理之路》的分享。限于大会现场分享时长..._陈宝生 长沙银行

Spark and Hadoop碎片知识点-程序员宅基地

文章浏览阅读140次。Spark and Hadoop碎片知识点合集

vue自定义指令-程序员宅基地

文章浏览阅读72次。vue自定义指令vue中除了核心功能内置的指令外,也允许注册自定义指令。有的情况下,对普通DOM元素进行底层操作,这时候就会用到自定义指令。自定义指令又分为全局的自定义指令和局部自定义指令。全局自定义指令全局注册主要是用过Vue.directive方法进行注册Vue.directive第一个参数是指令的名字(不需要写上v-前缀),第二个参数可以是对象数据。// 注册一个全局自定义指令 `v-focalize`Vue.directive('focalize', { // 当被绑定的元素插入

小程序的前期学习_一个app包括json js和dll-程序员宅基地

文章浏览阅读407次。根目录下自定义组件新建custom-tab-bar/index把点击的active定义为共享的数据store.js// 创建store实例// 定义共享数据 数据字段activeTabBarIndex:0, //点击的下标​})})wxmljs​​store,},}},})}},​/*** 组件的初始数据*/data: {{"text": "首页",},{"text": "消息",},{"text": "联系我们",},{_一个app包括json js和dll

3、数据类型转换、引用传值(可变类型、不可变类型)-程序员宅基地

文章浏览阅读217次,点赞3次,收藏5次。数据类型转换、引用传值(可变类型、不可变类型)

第十二章:预处理命令-程序员宅基地

文章浏览阅读628次,点赞23次,收藏8次。第十二章:预处理命令宏定义、文件包含处理

推荐文章

热门文章

相关标签