基于嘉立创mspm0g3507移植mpu6050教程,补充:mpu6050初始化卡死问题(已解决)(注:mpu6050来源哔哩哔哩作者Torris-Yin开源的mpu6050历程)

发布于:2025-07-31 ⋅ 阅读:(57) ⋅ 点赞:(0)

先附上Torris-Yin开源网址:http://Torris Yin/MSPM0G_Drivers - 码云 - 开源中国http://Torris Yin/MSPM0G_Drivers - 码云 - 开源中国

 在ccs中创建文件后,添加mpu6050文件后,编译文件,发现这种报错

解决方案

在inv_mpu.h中添加两个定义,如图:

#define MOTION_DRIVER_TARGET_MSPM0
#define MPU6050

 要使用历程中的实例代码需要在图形化配置syscfg中配置mpu6050和oled,mpu6050的int引脚

其中mpu6050使用硬件I2c,oled使用软件I2c

mpu6050配置如下:主要配置名称和开启五个中断

 

oled主要配置名称,如图:

INT引脚配置主要设定为输入模式,并开启中断,注意名字,如图:

最后在主函数中加入以下头文件就无报错了 ,可以使用实例代码了

#include "mpu6050.h"
#include "oled.h"
#include "stdio.h"

示例代码: 

#include "ti_msp_dl_config.h"
#include "mpu6050.h"
#include "oled.h"
#include "stdio.h"

volatile uint8_t mpu6050_int_flag = 0;
uint8_t oled_buffer[16];

int main(void)
{
    SYSCFG_DL_init();
    mpu6050_init();
    OLED_Init();


    NVIC_EnableIRQ(GPIO_MPU6050_INT_IRQN);//使能gpio中断

    OLED_ShowString(0,0,(uint8_t *)"Pitch:",16);
    OLED_ShowString(0,2,(uint8_t *)" Roll:",16);
    OLED_ShowString(0,4,(uint8_t *)"  Yaw:",16);

    while (1) {
        if(mpu6050_int_flag==1)
        {
            mpu6050_int_flag = 0;
            Read_Quad();
            sprintf((char *)oled_buffer, "%6.1f", pitch);
            OLED_ShowString(7*8,0,oled_buffer,16);
            sprintf((char *)oled_buffer, "%6.1f", roll);
            OLED_ShowString(7*8,2,oled_buffer,16);
            sprintf((char *)oled_buffer, "%6.1f", yaw);
            OLED_ShowString(7*8,4,oled_buffer,16);
        }
    }
}
void GROUP1_IRQHandler(void)
{
    switch (DL_Interrupt_getPendingGroup(DL_INTERRUPT_GROUP_1)) {
        case GPIO_MPU6050_PIN_INT_IIDX:
            mpu6050_int_flag = 1;
            break;
    }
}

重要补充!!!!

(1)如果遇到卡在mpu6050初始化上修改MPU6050文件中mspm0_clock.c文件中以下代码:

重要补充(2):如果程序没有卡死,但OLED屏幕不显示的话,可能是你用了硬件I2C的引脚(如PA0,PA1),改用普通引脚就行 

重要补充(3):如果以上都不行,自己开一个定时器中断,把mpu6050_int_flag = 1;这段代码放在定时器中断回调函数中

再次补充:我把我的6050文件分享出来给大家http://通过网盘分享的文件:MPU6050.rar 链接: https://pan.baidu.com/s/1wCrRZo7wXH7G2b6ZmLD0iA?pwd=v92m 提取码: v92m

 在我分享的文件中照着我教程里面把那个延迟函数改成系统的延迟函数就行了,只读一次的话把读数据的函数放到定时器中断内


网站公告

今日签到

点亮在社区的每一天
去签到