MPU6050移植编译错误

2019-07-14 19:18发布

想用STM32做个平衡小车,现在弄这个MPU6050,网上混了好多天,DMP的移植比较麻烦,找了别人移植过的来,先全部粘贴编译一下,在仔细看看,现在编译不过,本来I2C的编译也有问题,是输入输出口的问题,添加位绑定后解决。现在出现一下错误,那个大神来解救一下我吧,万分感谢啊!
屏幕截图(87).png
第一个错误的指向程序,好像说是几个宏没定义,但是我不懂具体是说的啥
struct int_param_s {
#if defined EMPL_TARGET_MSP430 || defined MOtiON_DRIVER_TARGET_MSP430
    void (*cb)(void);
    unsigned short pin;
    unsigned char lp_exit;
    unsigned char active_low;
#elif defined EMPL_TARGET_UC3L0
    unsigned long pin;
    void (*cb)(volatile void*);
    void *arg;
#endif
};

屏幕截图(86).png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
追风逐月
1楼-- · 2019-07-16 01:02
这是MPU6050.C的程序,这个里面目前也有两个问题
mpu6050MPU6050MPU6050.c(268): error:  #165: too few arguments in function call
mpu6050MPU6050MPU6050.c:      if(!mpu_init())

mpu6050MPU6050MPU6050.c(310): warning:  #223-D: function "asin" declared implicitly
mpu6050MPU6050MPU6050.c:                                       Pitch = (asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3);      

#include "MPU6050.h"
#include "IOI2C.h"
#include "usart.h"

#include "inv_mpu_dmp_motion_driver.h"
#include "inv_mpu.h"

#define PRINT_ACCEL     (0x01)
#define PRINT_GYRO      (0x02)
#define PRINT_QUAT      (0x04)
#define ACCEL_ON        (0x01)
#define GYRO_ON         (0x02)
#define MOTION          (0)
#define NO_MOTION       (1)
#define DEFAULT_MPU_HZ  (200)
#define FLASH_SIZE      (512)
#define FLASH_MEM_START ((void*)0x1800)
#define q30  1073741824.0f
short gyro[3], accel[3], sensors;
float Pitch;
float q0=1.0f,q1=0.0f,q2=0.0f,q3=0.0f;
static signed char gyro_orientation[9] = {-1, 0, 0,
                                           0,-1, 0,
                                           0, 0, 1};

static  unsigned short inv_row_2_scale(const signed char *row)
{
    unsigned short b;

    if (row[0] > 0)
        b = 0;
    else if (row[0] < 0)
        b = 4;
    else if (row[1] > 0)
        b = 1;
    else if (row[1] < 0)
        b = 5;
    else if (row[2] > 0)
        b = 2;
    else if (row[2] < 0)
        b = 6;
    else
        b = 7;      // error
    return b;
}


static  unsigned short inv_orientation_matrix_to_scalar(
    const signed char *mtx)
{
    unsigned short scalar;
    scalar = inv_row_2_scale(mtx);
    scalar |= inv_row_2_scale(mtx + 3) << 3;
    scalar |= inv_row_2_scale(mtx + 6) << 6;


    return scalar;
}

static void run_self_test(void)
{
    int result;
    long gyro[3], accel[3];

    result = mpu_run_self_test(gyro, accel);
    if (result == 0x7) {
        /* Test passed. We can trust the gyro data here, so let's push it down
         * to the DMP.
         */
        float sens;
        unsigned short accel_sens;
        mpu_get_gyro_sens(&sens);
        gyro[0] = (long)(gyro[0] * sens);
        gyro[1] = (long)(gyro[1] * sens);
        gyro[2] = (long)(gyro[2] * sens);
        dmp_set_gyro_bias(gyro);
        mpu_get_accel_sens(&accel_sens);
        accel[0] *= accel_sens;
        accel[1] *= accel_sens;
        accel[2] *= accel_sens;
        dmp_set_accel_bias(accel);
                printf("setting bias succesfully ...... ");
    }
}



uint8_t buffer[14];

int16_t  MPU6050_FIFO[6][11];
int16_t Gx_offset=0,Gy_offset=0,Gz_offset=0;


/**************************实现函数********************************************
*函数原型:                void  MPU6050_newValues(int16_t ax,int16_t ay,int16_t az,int16_t gx,int16_t gy,int16_t gz)
*功  能:            将新的ADC数据更新到 FIFO数组,进行滤波处理
*******************************************************************************/

void  MPU6050_newValues(int16_t ax,int16_t ay,int16_t az,int16_t gx,int16_t gy,int16_t gz)
{
unsigned char i ;
int32_t sum=0;
for(i=1;i<10;i++){        //FIFO 操作
MPU6050_FIFO[0][i-1]=MPU6050_FIFO[0];
MPU6050_FIFO[1][i-1]=MPU6050_FIFO[1];
MPU6050_FIFO[2][i-1]=MPU6050_FIFO[2];
MPU6050_FIFO[3][i-1]=MPU6050_FIFO[3];
MPU6050_FIFO[4][i-1]=MPU6050_FIFO[4];
MPU6050_FIFO[5][i-1]=MPU6050_FIFO[5];
}
MPU6050_FIFO[0][9]=ax;//将新的数据放置到 数据的最后面
MPU6050_FIFO[1][9]=ay;
MPU6050_FIFO[2][9]=az;
MPU6050_FIFO[3][9]=gx;
MPU6050_FIFO[4][9]=gy;
MPU6050_FIFO[5][9]=gz;

sum=0;
for(i=0;i<10;i++){        //求当前数组的合,再取平均值
   sum+=MPU6050_FIFO[0];
}
MPU6050_FIFO[0][10]=sum/10;

sum=0;
for(i=0;i<10;i++){
   sum+=MPU6050_FIFO[1];
}
MPU6050_FIFO[1][10]=sum/10;

sum=0;
for(i=0;i<10;i++){
   sum+=MPU6050_FIFO[2];
}
MPU6050_FIFO[2][10]=sum/10;

sum=0;
for(i=0;i<10;i++){
   sum+=MPU6050_FIFO[3];
}
MPU6050_FIFO[3][10]=sum/10;

sum=0;
for(i=0;i<10;i++){
   sum+=MPU6050_FIFO[4];
}
MPU6050_FIFO[4][10]=sum/10;

sum=0;
for(i=0;i<10;i++){
   sum+=MPU6050_FIFO[5];
}
MPU6050_FIFO[5][10]=sum/10;
}

/**************************实现函数********************************************
*函数原型:                void MPU6050_setClockSource(uint8_t source)
*功  能:            设置  MPU6050 的时钟源
* CLK_SEL | Clock Source
* --------+--------------------------------------
* 0       | Internal oscillator
* 1       | PLL with X Gyro reference
* 2       | PLL with Y Gyro reference
* 3       | PLL with Z Gyro reference
* 4       | PLL with external 32.768kHz reference
* 5       | PLL with external 19.2MHz reference
* 6       | Reserved
* 7       | Stops the clock and keeps the timing generator in reset
*******************************************************************************/
void MPU6050_setClockSource(uint8_t source){
    IICwriteBits(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CLKSEL_BIT, MPU6050_PWR1_CLKSEL_LENGTH, source);

}

/** Set full-scale gyroscope range.
* @param range New full-scale gyroscope range value
* @SEE getFullScaleRange()
* @see MPU6050_GYRO_FS_250
* @see MPU6050_RA_GYRO_CONFIG
* @see MPU6050_GCONFIG_FS_SEL_BIT
* @see MPU6050_GCONFIG_FS_SEL_LENGTH
*/
void MPU6050_setFullScaleGyroRange(uint8_t range) {
    IICwriteBits(devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_FS_SEL_BIT, MPU6050_GCONFIG_FS_SEL_LENGTH, range);
}

/**************************实现函数********************************************
*函数原型:                void MPU6050_setFullScaleAccelRange(uint8_t range)
*功  能:            设置  MPU6050 加速度计的最大量程
*******************************************************************************/
void MPU6050_setFullScaleAccelRange(uint8_t range) {
    IICwriteBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_AFS_SEL_BIT, MPU6050_ACONFIG_AFS_SEL_LENGTH, range);
}

/**************************实现函数********************************************
*函数原型:                void MPU6050_setSleepEnabled(uint8_t enabled)
*功  能:            设置  MPU6050 是否进入睡眠模式
                                enabled =1   睡觉
                            enabled =0   工作
*******************************************************************************/
void MPU6050_setSleepEnabled(uint8_t enabled) {
    IICwriteBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_SLEEP_BIT, enabled);
}

/**************************实现函数********************************************
*函数原型:                uint8_t MPU6050_getDeviceID(void)
*功  能:            读取  MPU6050 WHO_AM_I 标识         将返回 0x68
*******************************************************************************/
uint8_t MPU6050_getDeviceID(void) {

    IICreadBytes(devAddr, MPU6050_RA_WHO_AM_I, 1, buffer);
    return buffer[0];
}

/**************************实现函数********************************************
*函数原型:                uint8_t MPU6050_testConnection(void)
*功  能:            检测MPU6050 是否已经连接
*******************************************************************************/
uint8_t MPU6050_testConnection(void) {
   if(MPU6050_getDeviceID() == 0x68)  //0b01101000;
   return 1;
           else return 0;
}

/**************************实现函数********************************************
*函数原型:                void MPU6050_setI2CMasterModeEnabled(uint8_t enabled)
*功  能:            设置 MPU6050 是否为AUX I2C线的主机
*******************************************************************************/
void MPU6050_setI2CMasterModeEnabled(uint8_t enabled) {
    IICwriteBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_MST_EN_BIT, enabled);
}

/**************************实现函数********************************************
*函数原型:                void MPU6050_setI2CBypassEnabled(uint8_t enabled)
*功  能:            设置 MPU6050 是否为AUX I2C线的主机
*******************************************************************************/
void MPU6050_setI2CBypassEnabled(uint8_t enabled) {
    IICwriteBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_I2C_BYPASS_EN_BIT, enabled);
}

/**************************实现函数********************************************
*函数原型:                void MPU6050_initialize(void)
*功  能:            初始化         MPU6050 以进入可用状态。
*******************************************************************************/
void MPU6050_initialize(void) {
    MPU6050_setClockSource(MPU6050_CLOCK_PLL_YGYRO); //设置时钟
    MPU6050_setFullScaleGyroRange(MPU6050_GYRO_FS_2000);//陀螺仪最大量程 +-1000度每秒
    MPU6050_setFullScaleAccelRange(MPU6050_ACCEL_FS_2);        //加速度度最大量程 +-2G
    MPU6050_setSleepEnabled(0); //进入工作状态
         MPU6050_setI2CMasterModeEnabled(0);         //不让MPU6050 控制AUXI2C
         MPU6050_setI2CBypassEnabled(0);         //主控制器的I2C与        MPU6050的AUXI2C        直通。控制器可以直接访问HMC5883L
}




/**************************************************************************
函数功能:MPU6050内置DMP的初始化
入口参数:无
返回  值:无
作    者:平衡小车之家
**************************************************************************/
void DMP_Init(void)
{
   u8 temp[1]={0};
   i2cRead(0x68,0x75,1,temp);
         printf("mpu_set_sensor complete ...... ");
        if(temp[0]!=0x68)NVIC_SystemReset();
        if(!mpu_init())
  {
          if(!mpu_set_sensors(INV_XYZ_GYRO | INV_XYZ_ACCEL))
                   printf("mpu_set_sensor complete ...... ");
          if(!mpu_configure_fifo(INV_XYZ_GYRO | INV_XYZ_ACCEL))
                   printf("mpu_configure_fifo complete ...... ");
          if(!mpu_set_sample_rate(DEFAULT_MPU_HZ))
                   printf("mpu_set_sample_rate complete ...... ");
          if(!dmp_load_motion_driver_firmware())
                  printf("dmp_load_motion_driver_firmware complete ...... ");
          if(!dmp_set_orientation(inv_orientation_matrix_to_scalar(gyro_orientation)))
                   printf("dmp_set_orientation complete ...... ");
          if(!dmp_enable_feature(DMP_FEATURE_6X_LP_QUAT | DMP_FEATURE_TAP |
                DMP_FEATURE_ANDROID_ORIENT | DMP_FEATURE_SEND_RAW_ACCEL | DMP_FEATURE_SEND_CAL_GYRO |
                DMP_FEATURE_GYRO_CAL))
                   printf("dmp_enable_feature complete ...... ");
          if(!dmp_set_fifo_rate(DEFAULT_MPU_HZ))
                   printf("dmp_set_fifo_rate complete ...... ");
          run_self_test();
          if(!mpu_set_dmp_state(1))
                   printf("mpu_set_dmp_state complete ...... ");
  }
}
/**************************************************************************
函数功能:读取MPU6050内置DMP的姿态信息
入口参数:无
返回  值:无
作    者:平衡小车之家
**************************************************************************/
void Read_DMP(void)
{       
          unsigned long sensor_timestamp;
                unsigned char more;
                long quat[4];

                                dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors, &more);               
                                if (sensors & INV_WXYZ_QUAT )
                                {   
                                         q0=quat[0] / q30;
                                         q1=quat[1] / q30;
                                         q2=quat[2] / q30;
                                         q3=quat[3] / q30;
                                         Pitch = (asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3);        
                                         printf("%f ",Pitch);
                                }

}
/**************************************************************************
函数功能:读取MPU6050内置温度传感器数据
入口参数:无
返回  值:摄氏温度
作    者:平衡小车之家
**************************************************************************/
int Read_Temperature(void)
{          
          float Temp;
          Temp=(I2C_ReadOneByte(devAddr,MPU6050_RA_TEMP_OUT_H)<<8)+I2C_ReadOneByte(devAddr,MPU6050_RA_TEMP_OUT_L);
                if(Temp>32768) Temp-=65536;
                Temp=(36.53+Temp/340)*10;
          return (int)Temp;
}
//------------------End of File----------------------------

这个是inv_mpu.h的程序,一个错误在这里

mpu6050inv_mpu.h(44): error:  #169: expected a declaration
mpu6050inv_mpu.h:   };

/*
$License:
    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
    See included License.txt for License information.
$
*/
/**
*  @addtogroup  DRIVERS Sensor Driver Layer
*  @brief       Hardware drivers to communicate with sensors via I2C.
*
*  @{
*      @file       inv_mpu.h
*      @brief      An I2C-based driver for Invensense gyroscopes.
*      @Details    This driver currently works for the following devices:
*                  MPU6050
*                  MPU6500
*                  MPU9150 (or MPU6050 w/ AK8975 on the auxiliary bus)
*                  MPU9250 (or MPU6500 w/ AK8963 on the auxiliary bus)
*/

#ifndef _INV_MPU_H_
#define _INV_MPU_H_

#define INV_X_GYRO      (0x40)
#define INV_Y_GYRO      (0x20)
#define INV_Z_GYRO      (0x10)
#define INV_XYZ_GYRO    (INV_X_GYRO | INV_Y_GYRO | INV_Z_GYRO)
#define INV_XYZ_ACCEL   (0x08)
#define INV_XYZ_COMPASS (0x01)



struct int_param_s {
#if defined EMPL_TARGET_MSP430 || defined MOTION_DRIVER_TARGET_MSP430
    void (*cb)(void);
    unsigned short pin;
    unsigned char lp_exit;
    unsigned char active_low;
#elif defined EMPL_TARGET_UC3L0
    unsigned long pin;
    void (*cb)(volatile void*);
    void *arg;
#endif
};

#define MPU_INT_STATUS_DATA_READY       (0x0001)
#define MPU_INT_STATUS_DMP              (0x0002)
#define MPU_INT_STATUS_PLL_READY        (0x0004)
#define MPU_INT_STATUS_I2C_MST          (0x0008)
#define MPU_INT_STATUS_FIFO_OVERFLOW    (0x0010)
#define MPU_INT_STATUS_ZMOT             (0x0020)
#define MPU_INT_STATUS_MOT              (0x0040)
#define MPU_INT_STATUS_FREE_FALL        (0x0080)
#define MPU_INT_STATUS_DMP_0            (0x0100)
#define MPU_INT_STATUS_DMP_1            (0x0200)
#define MPU_INT_STATUS_DMP_2            (0x0400)
#define MPU_INT_STATUS_DMP_3            (0x0800)
#define MPU_INT_STATUS_DMP_4            (0x1000)
#define MPU_INT_STATUS_DMP_5            (0x2000)

/* Set up APIs */
int mpu_init(struct int_param_s *int_param);
int mpu_init_slave(void);
int mpu_set_bypass(unsigned char bypass_on);

/* Configuration APIs */
int mpu_lp_accel_mode(unsigned char rate);
int mpu_lp_motion_interrupt(unsigned short thresh, unsigned char time,
    unsigned char lpa_freq);
int mpu_set_int_level(unsigned char active_low);
int mpu_set_int_latched(unsigned char enable);

int mpu_set_dmp_state(unsigned char enable);
int mpu_get_dmp_state(unsigned char *enabled);

int mpu_get_lpf(unsigned short *lpf);
int mpu_set_lpf(unsigned short lpf);

int mpu_get_gyro_fsr(unsigned short *fsr);
int mpu_set_gyro_fsr(unsigned short fsr);

int mpu_get_accel_fsr(unsigned char *fsr);
int mpu_set_accel_fsr(unsigned char fsr);

int mpu_get_compass_fsr(unsigned short *fsr);

int mpu_get_gyro_sens(float *sens);
int mpu_get_accel_sens(unsigned short *sens);

int mpu_get_sample_rate(unsigned short *rate);
int mpu_set_sample_rate(unsigned short rate);
int mpu_get_compass_sample_rate(unsigned short *rate);
int mpu_set_compass_sample_rate(unsigned short rate);

int mpu_get_fifo_config(unsigned char *sensors);
int mpu_configure_fifo(unsigned char sensors);

int mpu_get_power_state(unsigned char *power_on);
int mpu_set_sensors(unsigned char sensors);

int mpu_set_accel_bias(const long *accel_bias);

/* Data getter/setter APIs */
int mpu_get_gyro_reg(short *data, unsigned long *timestamp);
int mpu_get_accel_reg(short *data, unsigned long *timestamp);
int mpu_get_compass_reg(short *data, unsigned long *timestamp);
int mpu_get_temperature(long *data, unsigned long *timestamp);

int mpu_get_int_status(short *status);
int mpu_read_fifo(short *gyro, short *accel, unsigned long *timestamp,
    unsigned char *sensors, unsigned char *more);
int mpu_read_fifo_stream(unsigned short length, unsigned char *data,
    unsigned char *more);
int mpu_reset_fifo(void);

int mpu_write_mem(unsigned short mem_addr, unsigned short length,
    unsigned char *data);
int mpu_read_mem(unsigned short mem_addr, unsigned short length,
    unsigned char *data);
int mpu_load_firmware(unsigned short length, const unsigned char *firmware,
    unsigned short start_addr, unsigned short sample_rate);

int mpu_reg_dump(void);
int mpu_read_reg(unsigned char reg, unsigned char *data);
int mpu_run_self_test(long *gyro, long *accel);
int mpu_register_tap_cb(void (*func)(unsigned char, unsigned char));

#endif  /* #ifndef _INV_MPU_H_ */

这个是inv_mpu.c这两个错误指向的是同一句话
mpu6050inv_mpu.c(105): error:  #35: #error directive: Gyro driver is missing the system layer implementations.
mpu6050inv_mpu.c:   #error  Gyro driver is missing the system layer implementations.
inv_mpu.c太长了,就复制错误的这一段吧
#define log_i       MPL_LOGI
#define log_e       MPL_LOGE
/* UC3 is a 32-bit processor, so abs and labs are equivalent. */
#define labs        abs
#define fabs(x)     (((x)>0)?(x):-(x))
#else
#error  Gyro driver is missing the system layer implementations.    //错误指向的语句
#endif

#if !defined MPU6050 && !defined MPU9150 && !defined MPU6500 && !defined MPU9250
#error  Which gyro are you using? Define MPUxxxx in your compiler options.
#endif
另外 mpu6050inv_mpu_dmp_motion_driver.c 和 inv_mpu.c 的错误是一致的,也这句话
追风逐月
2楼-- · 2019-07-16 03:10
18435122702 发表于 2017-8-31 14:19
感觉是移植方法的问题,不在编译器上有点难找问题,楼主能给我一份源程序吗,还有你移植的DMP的原来的程序

这个移植里面应该还有需要改动的地方,而且这个是对应的是老的库,现在我的MDK是4.0的。但是不太清楚里面的改动要怎么改。
追风逐月
3楼-- · 2019-07-16 04:40
 精彩回答 2  元偷偷看……
追风逐月
4楼-- · 2019-07-16 07:49
编译通过了,原来是我把inv_mpu_dmp_motion_driver.c 和 inv_mpu.c 弄错了,我把官方库里面的当成那个已经移植过的里面的,现在换回来就可以编译通过了。
麻烦大伙了,等有时间就把MPU6050班弄好试试。
追风逐月
5楼-- · 2019-07-16 10:19
18435122702 发表于 2017-8-31 14:19
感觉是移植方法的问题,不在编译器上有点难找问题,楼主能给我一份源程序吗,还有你移植的DMP的原来的程序

已经好了,这个移植好的可以直接编译通过,是我把DMP的两个文件弄错了,吧没移植过给复制过去了
将军问鼎
6楼-- · 2019-07-16 12:18
哎,慢慢研究吧

一周热门 更多>