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应该不影响串口的执行的。两者的关联在哪呢,不清楚你程序的思路,从这点下手找找看。