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操作系统

移植思路

  • 配置好I2C通信的驱动
  • 实现读取MPU9250原始数据
  • 添加DMP/MPL模块库到工程中
  • 修改 inv_mpu.c 文件中的函数接口
  • 完成对DMP模块的初始化
  • 分配时间片读取DMP提供接口返回的数据

    移植流程

  1. 新建 drv_mpu9250.cdrv_mpu9250.h
    1. 修改其中对I2C的调用方式,保留原函数接口,只修改函数实体即可
    2. 原函数是通过调用自己编写的模拟I2C方式进行通信,大多数是直接操作GPIO实现
    3. 我们需要将其替换成直接使用RT-Thread的I2C通信函数接口
    4. 实际上提供的例程中已有较好的封装,我们只需要修改 I2C连续写、I2C连续读、I2C写一个字节,I2C读一个字节 这四个函数的实体即可
    5. 特别注意其中的I2C连续读,其需要的功能是传入参数是任意长度的数组,如果要使用RT-Thread的接口函数,需要实现一次数组的拼接才能达到和例程的通信方式一样的效果
    6. 如果在后面使用DMP的初始化时发生固件库调用失败,有很大可能是I2C的通信问题,软件上需要重点检查这里通信的实现方式,尤其是连续读和连续写,这两个函数在DMP中被频繁使用
    7. 如果这里一切正常时,就可以调用提供的接口函数,读取MPU9250的原始数据用来测试驱动是否正确
    8. 如果可以正常读取原始数据也不一定就能保证DMP驱动正常,因为读取原始数据时用不到I2C连续读这个函数
  2. 新建 groscope_dmp_app.cgroscope_dmp_app.h
    1. 这两个文件存放的是应用层的函数,直接从这里调用芯片的驱动,初始化和DMP的驱动,初始化等
    2. 从这里获取陀螺仪未经处理,或已经处理的数据
  3. 复制DMP整个文件夹到Application文件夹下
    1. DMP的完整驱动库都放在了名为DMP的文件夹下
    2. 其中大致可以两个部分:用户可修改的源文件/头文件,和用户不可修改的固件lib文件
    3. 源文件/头文件是提供接口函数,芯片宏定义,功能宏定义等
    4. lib文件是根据所使用的处理器内核不同,提供的算法实体,用户无法看到内部
  4. 将DMP文件夹的全部源文件添加在工程中
    1. DMP文件下还有四个文件夹,需要将每个文件夹中的源文件都添加在工程树下
    2. image.png
    3. .lib文件可能会根据实际需要切换版本后,再拷贝到DMP-Include文件夹中替换原来的.lib并添加到工程中
  5. 将DMP中有头文件的文件夹添加在include路径中
    1. image.png
  6. 注释了原例程中的自定义的头文件的包含
    1. 因为I2C和串口的驱动还有延时等均由RT-Thread提供,历程中自己实现的这些功能的头文件都需要删去,否则因找不到文件而报错
    2. 替换MPU9250驱动的头文件
  1. //#include "myiic.h"
  2. //#include "delay.h"
  3. //#include "usart.h"
  4. //#include "mpu9250.h"
  1. 去掉了原例程中对 sys.h 的引用
    1. sys.h就用了一下uint_8的重定义u8
    2. 用MDK中Ctrl+F一键替换 inv_mpu.c 中出现的u8为uint_8
  2. 在整个工程的设置中添加了对使用的芯片和使用的处理器的宏定义,开启部分定义

image.png
内容为

  1. MPL_LOG_NDEBUG=1,EMPL,MPU9250,EMPL_TARGET_STM32F1
  1. 修改 inv_mpu.c 中部分代码使能的标志
    1. inv_mpu.c 中通过宏定义实现了对代码的条件编译
    2. 由于我们在第8步开启了对 EMPL_TARGET_STM32F1 的宏定义,就会使能文件中基于STM32处理器的代码
    3. 但是例程中针对的是EMPL_TARGET_STM32F4
    4. 需要我们修改为 EMPL_TARGET_STM32F1
    5. 实际上不修改也行,将第8步中的宏定义改为EMPL_TARGET_STM32F4即可
    6. 这么做也是为了能和我的开发板形式上匹配,实际上只要让那部分代码变亮即可
  2. 替换部分函数接口
    1. 当完成第9步就会发现 inv_mpu.c 文件对应的第一个宏定义就会使能
    2. 接下来的宏定义即为一组接口
  1. #define i2c_write MPU_Write_Len
  2. #define i2c_read MPU_Read_Len
  3. #define delay_ms rt_thread_mdelay
  4. #define get_ms mget_ms

c. 因为我们在MPU9250的驱动中保留了读写的函数,第一和第二个定义不动即可
d. 需要将毫秒级延时替换为RT-Thread的延时函数

  1. 替换 DMP/mpl 文件下的 lib 文件为适用于芯片的内核版本,F103需要替换为M3内核版本的固件库
    1. 如果以上都正常操作后,编译后会报找不到部分函数的定义的错误
    2. 而这些函数在DMP文件下只有声明没有定义
    3. 这是因为还没有添加固件库,即.lib文件
    4. 历程中的.lib在include文件夹下,而且是对于F4的内核版本
    5. 如果需要用F1驱动DMP,需要替换对应的.lib,并添加在工程下
    6. 不同内核配套的lib都存放在DMP的驱动包里
    7. MPU9250资料->motion_driver_6.12.zip->mpl libraries->arm->keil->libmpllib_Keil_M3.zip ,解压后使用这个lib替换掉原来
  2. 至此再编译,如果没有问题即可以调用inv_mpu.c下提供的接口函数了

注意事项

  • 移植的过程实际上是一个排错的过程,需要边移植边编译,针对不同的错误做出不同的修改,直至没有错误
  • 排错的过程中需要关注各种函数接口的功能,参数含义,多关注历程中函数的注释
  • 可能在移植过程中存在以上流程中未写出的错误,需要灵活应对,可以直接在网上搜索错误内容查看有没有人遇到相同的问题

参考资料

  • 网上的流程有很多,错误也是五花八门,没有一篇是从头详细的讲解到尾的,包括正点原子开发板的教程也介绍的很笼统,这篇文档基本上描述了整个的移植流程
  • 希望后面的同学,如果遇到什么额外的问题,解决后能够添加进来,做一些详细的说明,让这个教程更丰富,让DMP的移植更容易上手
  • STM32F103移植mpu9250