TI中文支持网
TI专业的中文技术问题搜集分享网站

mpu9150与显示屏结合问题

int
main(void)
{
    int_fast32_t i32IPart[16], i32FPart[16];
    uint_fast32_t ui32Idx, ui32CompDCMStarted;
    float pfData[16];
    float *pfAccel;
    uint16_t i=0,j=0;

    //将所有数据放在一个连续的阵列中,以便稍后可以使打印变得更容易。
    pfAccel = pfData;

    ROM_SysCtlClockSet(SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |
                       SYSCTL_OSC_MAIN);

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//中断

    ConfigureUART();

    UARTprintf("\033[2JMPU9150 Raw Example\n");

    g_pui32Colors[RED] = 0x8000;
    g_pui32Colors[BLUE] = 0x8000;
    g_pui32Colors[GREEN] = 0x0000;

    RGBInit(0);
    RGBColorSet(g_pui32Colors);
    RGBIntensitySet(0.5f);
    RGBEnable();

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C3);
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);

    ROM_GPIOPinConfigure(GPIO_PD0_I2C3SCL);
    ROM_GPIOPinConfigure(GPIO_PD1_I2C3SDA);

    GPIOPinTypeI2CSCL(GPIO_PORTD_BASE, GPIO_PIN_0);
    ROM_GPIOPinTypeI2C(GPIO_PORTD_BASE, GPIO_PIN_1);

    ROM_GPIOPinTypeGPIOInput(GPIO_PORTB_BASE, GPIO_PIN_2);
    GPIOIntEnable(GPIO_PORTB_BASE, GPIO_PIN_2);  //使能GPIO中断源
    ROM_GPIOIntTypeSet(GPIO_PORTB_BASE, GPIO_PIN_2, GPIO_FALLING_EDGE);  //引脚中断类型
    ROM_IntEnable(INT_GPIOB); //开中断

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
    GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
    ROM_SysCtlPeripheralClockGating(true);
    ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_GPIOB);
    ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_UART0);
    ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_TIMER0);
    ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_TIMER1);
    ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_I2C3);
    ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_WTIMER5);

    ROM_IntMasterEnable();    //开全局中断

    I2CMInit(&g_sI2CInst, I2C3_BASE, INT_I2C3, 0xff, 0xff,
             ROM_SysCtlClockGet());

    MPU9150Init(&g_sMPU9150Inst, &g_sI2CInst, MPU9150_I2C_ADDRESS,
                MPU9150AppCallback, &g_sMPU9150Inst);

    MPU9150AppI2CWait(__FILE__, __LINE__);

    g_sMPU9150Inst.pui8Data[0] = MPU9150_CONFIG_DLPF_CFG_94_98;
    g_sMPU9150Inst.pui8Data[1] = MPU9150_GYRO_CONFIG_FS_SEL_250;
    g_sMPU9150Inst.pui8Data[2] = (MPU9150_ACCEL_CONFIG_ACCEL_HPF_5HZ |
                                  MPU9150_ACCEL_CONFIG_AFS_SEL_2G);
    MPU9150Write(&g_sMPU9150Inst, MPU9150_O_CONFIG, g_sMPU9150Inst.pui8Data, 3,
                 MPU9150AppCallback, &g_sMPU9150Inst);
    MPU9150AppI2CWait(__FILE__, __LINE__);
    g_sMPU9150Inst.pui8Data[0] = MPU9150_INT_PIN_CFG_INT_LEVEL |
                                    MPU9150_INT_PIN_CFG_INT_RD_CLEAR |
                                    MPU9150_INT_PIN_CFG_LATCH_INT_EN;
    g_sMPU9150Inst.pui8Data[1] = MPU9150_INT_ENABLE_DATA_RDY_EN;
    MPU9150Write(&g_sMPU9150Inst, MPU9150_O_INT_PIN_CFG,
                 g_sMPU9150Inst.pui8Data, 2, MPU9150AppCallback,
                 &g_sMPU9150Inst);
    MPU9150AppI2CWait(__FILE__, __LINE__);
    //初始化DCM系统。 50赫兹采样率。 加速度重量= 0.2,陀螺重量= 0.8,重量= 0.2
    CompDCMInit(&g_sCompDCMInst, 1.0f / 50.0f, 0.2f, 0.6f, 0.2f);

    UARTprintf("MPU9150 9-Axis Simple Data Application Example\n\n");
    //启用闪烁表示配置成功完成
    RGBBlinkRateSet(1.0f);

    ui32CompDCMStarted = 0;

    while(1)
    {
        while(!g_vui8I2CDoneFlag)
        {
            ROM_SysCtlSleep();

        }

        g_vui8I2CDoneFlag = 0;
        //以m / s ^ 2获得浮点数据的Accel数据。
        MPU9150DataAccelGetFloat(&g_sMPU9150Inst, pfAccel, pfAccel + 1,
                                 pfAccel + 2);

        //检查这是否是我们的第一个数据
        if(ui32CompDCMStarted == 0)
        {

            //设置标志,指示DCM已启动。 用第一个数据集进行DCM播种。
            ui32CompDCMStarted = 1;
            CompDCMAccelUpdate(&g_sCompDCMInst, pfAccel[0], pfAccel[1],
                               pfAccel[2]);
            CompDCMStart(&g_sCompDCMInst);
        }
        else
        {
            //DCM已启动。 执行增量更新。
            CompDCMAccelUpdate(&g_sCompDCMInst, pfAccel[0], pfAccel[1],
                               pfAccel[2]);
            CompDCMUpdate(&g_sCompDCMInst);

        }
        //增加跳过计数器。 使用跳过计数器,因此我们不会使用数据溢出UART
        g_ui32PrintSkipCounter++;
        if(g_ui32PrintSkipCounter >= PRINT_SKIP_COUNT)
        {
            //重置跳过计数器。
            g_ui32PrintSkipCounter = 0;
            //现在回到使用数据作为单个数组来分解float成整数部分和分数(十进制)部分的目的。
            for(ui32Idx = 0; ui32Idx < 16; ui32Idx++)
            {
                //将float值转换为一个截断小数部分的整数。
                i32IPart[ui32Idx] = (int32_t) pfData[ui32Idx];
                //乘以1000以保留前三个十进制值。 截断小数点后第三位。
                i32FPart[ui32Idx] = (int32_t) (pfData[ui32Idx] * 1000.0f);
                //从这个新形成的小数部分减去整数部分。
                i32FPart[ui32Idx] = i32FPart[ui32Idx] –
                                    (i32IPart[ui32Idx] * 1000);
                //使小数部分成为显示的正数。
                if(i32FPart[ui32Idx] < 0)
                {
                    i32FPart[ui32Idx] *= -1;
                }
            }
            //打印加速度数字
            //UARTprintf("\033 x:%3d", i32IPart[0]);//, i32FPart[0]);
            //UARTprintf("\033 y:%3d.%03d", i32IPart[1], i32FPart[1]);
            //UARTprintf("\033 z:%3d.%03d", i32IPart[2], i32FPart[2]);
            if(i32IPart[0]>10)
                i=i+1;
            out_step[0]=i/1000;
            i=i-out_step[0]*1000;
            out_step[1]=i/100;
            i=i-out_step[1]*100;
            out_step[2]=i/10;
            out_step[3]=i%10;
            i=out_step[0]*1000+out_step[1]*100+i;
            LCD_Draw_Char(number + out_step[0], 3, 0);
            LCD_Draw_Char(number + out_step[1], 3, 8);
            LCD_Draw_Char(number + out_step[2], 3, 16);
            LCD_Draw_Char(number + out_step[3], 3, 24);
            UARTprintf("\033 x:%3d", i);
            j=j+1;
            //LCD_Draw_Char(number + out_step[0], 3, 32);
            //LCD_Draw_Char(number + out_step[1], 3, 40);
            //LCD_Draw_Char(number + out_step[2], 3, 48);
            //LCD_Draw_Char(number + out_step[3], 3, 56);
        }
    }
}
如上所示,是我的主函数代码,是从tivaware的mpu9150改过来的,其余的地方我一点没改,但是现在代码又出现了问题,只能用四行LCD_Draw_Char(参数)函数,一用的多,uart串口只能接收一个数据,然后就停止了,但是如果只用4行这个函数,mpu9150就能正常工作,且uart串口一直发送数据,这个是为什么?

xyz549040622:

确实比较奇怪,应该来说LCD_Draw_Cha应该不影响串口的执行的。两者的关联在哪呢,不清楚你程序的思路,从这点下手找找看。

赞(0)
未经允许不得转载:TI中文支持网 » mpu9150与显示屏结合问题
分享到: 更多 (0)