Github
对MPU9250MPL和DMP的移植和开发都记录在Github上的一个项目中,项目还会随着学习的深入进行更新
项目URL:https://github.com/HITLIVING/-RT-Thread-.git
读者可以通过Pull下来整个项目进一步了解
对MPU9250MPL和DMP的移植和开发需要格外关注DMP文件夹
drv_mpu9250.h
drv_mpu9250.h
gyroscope_dmp_app.c
gyroscope_dmp_app.h
原参考例程为正点原子STM32F4开发板例程中对MPU9250的讲解
概念区分
- DMP:不包含磁力计的加速度计和速度计六轴数据融合
- MPL:包含磁力计,加速度计和速度计的九轴数据融合
开发平台
野火STM32MINI开发板
STM32F103ZRT6
RT-Thread操作系统
移植思路
- 新建
drv_mpu9250.c
和drv_mpu9250.h
- 修改其中对I2C的调用方式,保留原函数接口,只修改函数实体即可
- 原函数是通过调用自己编写的模拟I2C方式进行通信,大多数是直接操作GPIO实现
- 我们需要将其替换成直接使用RT-Thread的I2C通信函数接口
- 实际上提供的例程中已有较好的封装,我们只需要修改
I2C连续写、I2C连续读、I2C写一个字节,I2C读一个字节
这四个函数的实体即可 - 特别注意其中的I2C连续读,其需要的功能是传入参数是任意长度的数组,如果要使用RT-Thread的接口函数,需要实现一次数组的拼接才能达到和例程的通信方式一样的效果
- 如果在后面使用DMP的初始化时发生固件库调用失败,有很大可能是I2C的通信问题,软件上需要重点检查这里通信的实现方式,尤其是连续读和连续写,这两个函数在DMP中被频繁使用
- 如果这里一切正常时,就可以调用提供的接口函数,读取MPU9250的原始数据用来测试驱动是否正确
- 如果可以正常读取原始数据也不一定就能保证DMP驱动正常,因为读取原始数据时用不到
I2C连续读这个函数
- 新建
groscope_dmp_app.c
和groscope_dmp_app.h
- 这两个文件存放的是应用层的函数,直接从这里调用芯片的驱动,初始化和DMP的驱动,初始化等
- 从这里获取陀螺仪未经处理,或已经处理的数据
- 复制DMP整个文件夹到Application文件夹下
- DMP的完整驱动库都放在了名为DMP的文件夹下
- 其中大致可以两个部分:用户可修改的源文件/头文件,和用户不可修改的固件lib文件
- 源文件/头文件是提供接口函数,芯片宏定义,功能宏定义等
- lib文件是根据所使用的处理器内核不同,提供的算法实体,用户无法看到内部
- 将DMP文件夹的全部源文件添加在工程中
- DMP文件下还有四个文件夹,需要将每个文件夹中的源文件都添加在工程树下
- .lib文件可能会根据实际需要切换版本后,再拷贝到DMP-Include文件夹中替换原来的.lib并添加到工程中
- 将DMP中有头文件的文件夹添加在include路径中
- 注释了原例程中的自定义的头文件的包含
- 因为I2C和串口的驱动还有延时等均由RT-Thread提供,历程中自己实现的这些功能的头文件都需要删去,否则因找不到文件而报错
- 替换MPU9250驱动的头文件
//#include "myiic.h"
//#include "delay.h"
//#include "usart.h"
//#include "mpu9250.h"
- 去掉了原例程中对
sys.h
的引用sys.h
就用了一下uint_8的重定义u8- 用MDK中Ctrl+F一键替换
inv_mpu.c
中出现的u8为uint_8
- 在整个工程的设置中添加了对使用的芯片和使用的处理器的宏定义,开启部分定义
内容为
MPL_LOG_NDEBUG=1,EMPL,MPU9250,EMPL_TARGET_STM32F1
- 修改
inv_mpu.c
中部分代码使能的标志inv_mpu.c
中通过宏定义实现了对代码的条件编译- 由于我们在第8步开启了对
EMPL_TARGET_STM32F1
的宏定义,就会使能文件中基于STM32处理器的代码 - 但是例程中针对的是
EMPL_TARGET_STM32F4
- 需要我们修改为
EMPL_TARGET_STM32F1
- 实际上不修改也行,将第8步中的宏定义改为
EMPL_TARGET_STM32F4即可
- 这么做也是为了能和我的开发板形式上匹配,实际上只要让那部分代码变亮即可
- 替换部分函数接口
- 当完成第9步就会发现
inv_mpu.c
文件对应的第一个宏定义就会使能 - 接下来的宏定义即为一组接口
- 当完成第9步就会发现
#define i2c_write MPU_Write_Len
#define i2c_read MPU_Read_Len
#define delay_ms rt_thread_mdelay
#define get_ms mget_ms
c. 因为我们在MPU9250的驱动中保留了读写的函数,第一和第二个定义不动即可
d. 需要将毫秒级延时替换为RT-Thread的延时函数
- 替换
DMP/mpl
文件下的lib
文件为适用于芯片的内核版本,F103需要替换为M3内核版本的固件库- 如果以上都正常操作后,编译后会报找不到部分函数的定义的错误
- 而这些函数在DMP文件下只有声明没有定义
- 这是因为还没有添加固件库,即.lib文件
- 历程中的.lib在include文件夹下,而且是对于F4的内核版本
- 如果需要用F1驱动DMP,需要替换对应的.lib,并添加在工程下
- 不同内核配套的lib都存放在DMP的驱动包里
- MPU9250资料->motion_driver_6.12.zip->mpl libraries->arm->keil->libmpllib_Keil_M3.zip ,解压后使用这个lib替换掉原来
- 至此再编译,如果没有问题即可以调用
inv_mpu.c下提供的接口函数了
注意事项
- 移植的过程实际上是一个排错的过程,需要边移植边编译,针对不同的错误做出不同的修改,直至没有错误
- 排错的过程中需要关注各种函数接口的功能,参数含义,多关注历程中函数的注释
- 可能在移植过程中存在以上流程中未写出的错误,需要灵活应对,可以直接在网上搜索错误内容查看有没有人遇到相同的问题
参考资料
- 网上的流程有很多,错误也是五花八门,没有一篇是从头详细的讲解到尾的,包括正点原子开发板的教程也介绍的很笼统,这篇文档基本上描述了整个的移植流程
- 希望后面的同学,如果遇到什么额外的问题,解决后能够添加进来,做一些详细的说明,让这个教程更丰富,让DMP的移植更容易上手
- STM32F103移植mpu9250