# mpu6050 **Repository Path**: cyt-curry/mpu6050 ## Basic Information - **Project Name**: mpu6050 - **Description**: mpu6050模块的使用,包括了软件iic和硬件iic,以及dmp库的移植。硬件iic部分,对mpu6050使用了面向对象思想进行封装。 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 1 - **Created**: 2022-08-15 - **Last Updated**: 2025-09-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MPU6050 #### 包含有六个轴,三轴陀螺仪,三轴的加速计,一个温度计和一个磁力计,一般使用IIC通信来驱动该模块,也可以使用SPI ###### mpu6050的datasheet和寄存器表已经放在目录MPU6050文件下,里面还有dmp库的源码文件 ### 模块接口定义(购买模块引出或者叫法不同) #### VCC 3.3V电源接口 GND 与单片机的GND相连 #### SCL:MPU6050作为从设备的时钟线 SDA:MPU6050作为从设备的数据线 #### XCL:MPU6050作为主设备的时钟线 XDA:MPU6050作为主设备的数据线 #### ADO:MPU6050设备地址位。如果该位为低电平,地址为0x68,如果为高电平,地址为0x69。要注意,此时的地址是7bit,不包括读写标志位。而hal库的硬件spi中,传入地址需要8位地址,包含读写标志位(0为写,1为读)。所以对应起来,0x68加上最后一位0的话,应该是0xD0。使用hal库函数时,应使用0xD0这个地址,无论读写(当AD0为低电平)。 ### 工程的使用 在文件mpu6050.h存在两个宏定义。 ```C #define IIC_WAY 0 //1使用硬件IIC,0使用软件IIC #define ENABLE_DMP 1 //1使用dmp,0不适用 ``` 另外,如果使用了软件iic,需要到iic_drv.h中修改配置的gpio口,以及寄存器的操作。(如何操作在下面会有记录) 需要修改的代码有 ```C #define SCL GPIO_PIN_8 #define SDA GPIO_PIN_9 //直接修改寄存器来配置,比使用hal库初始化更方便 #define SDA_IN() {GPIOA->CRH&=0XFFFFFF0F;GPIOA->CRH|=(uint32_t)8<<4;} #define SDA_OUT() {GPIOA->CRH&=0XFFFFFF0F;GPIOA->CRH|=(uint32_t)1<<4;} #define SCL_HIGH() HAL_GPIO_WritePin(GPIOA,SCL,GPIO_PIN_SET) #define SCL_LOW() HAL_GPIO_WritePin(GPIOA,SCL,GPIO_PIN_RESET) #define SDA_HIGH() HAL_GPIO_WritePin(GPIOA,SDA,GPIO_PIN_SET) #define SDA_LOW() HAL_GPIO_WritePin(GPIOA,SDA,GPIO_PIN_RESET) ``` 如果需要使用dmp库,stm32f1系列已经写好 了,如果是f4需要自己重新修改。移植方法将在后面记录 如果使用了硬件spi,如果使用的是iic1无需修改,如果使用了iic2,需要在dmp文件夹下两个文件里面修改这两个 ```C #define i2c_write(a,b,c,d) \ HAL_I2C_Mem_Write(&hi2c1,a,b,I2C_MEMADD_SIZE_8BIT,d,c,2) #define i2c_read(a,b,c,d) \ HAL_I2C_Mem_Read(&hi2c1,a,b,I2C_MEMADD_SIZE_8BIT,d,c,2) ``` ### cubemx配置 #### 硬件spi ![image-20220815150200794](README.assets/image-20220815150200794.png) #### 软件spi ![image-20220815150318438](README.assets/image-20220815150318438.png) ##### 注意点:需要把两个引脚配置为推挽输出。是否上下拉都可以,上拉可以一定程度上加大传输速率。 ### 软件IIC注意点 #### 使用寄存器修改GPIO口的输出输入模式 在stm32f103c8t6中,GPIO口配置使用的是GPIOx_CRH和GPIOx_CRL寄存器,前者储存8-15,后者储存0-7 ```C #define SDA_IN() {GPIOA->CRH&=0XFFFFFF0F;GPIOA->CRH|=(uint32_t)8<<4;} #define SDA_OUT() {GPIOA->CRH&=0XFFFFFF0F;GPIOA->CRH|=(uint32_t)1<<4;} ``` 上面的第一句,是清空对应的位,以GPIOA9为例子 ![image-20220815151206046](README.assets/image-20220815151206046.png) 依靠高位寄存器的4到7位来配置。所以首先使用&=来清空这四个位,再用|=来设置对应的功能。 ![image-20220815151345553](README.assets/image-20220815151345553.png) 由上图可以得知,高两位的CNF是配置具体的模式,MODE是控制输出或者输入模式。 从上面的8<<4,8的2进制为1000,左移四个位,就是1000 0000。也就是,把4-7位配置为1000。CNF为10,MODE为00。就是配置为了上拉/下拉输入模式。 同理1<<4,最终,CNF为00,MODE为01,配置为了输出速度为10MHZ的通用推挽输出模式。 软件iic的时序,就是根据iic的时序使用gpio进行了模拟,具体的原理在iic通信原理中记录。 ### DMP库移植 首先需要把MPU6050文件里面的\motion_driver_6.12\motion_driver_6.12\arm\STM32F4_MD6\Projects\eMD6\core\driver\eMPL 目录下面的所有文件拷贝到自己的工程文件夹中。打开inv_mpu_init.c,在其头部加入(结合自己使用的芯片进行修改)。注意,其中define后面的第一个名字不能修改,不然会引起很多的报错。 ```C #if defined EMPL_TARGET_STM32F1_IIC_SOFTWARE #include "main.h" #include "stdio.h" #include "iic_drv.h" #include "delay.h" #define i2c_write(a,b,c,d) \ IIC_Write_nByte(a,b,d,c) #define i2c_read(a,b,c,d) \ IIC_Read_nByte(a,b,d,c) //#define delay_ms(n) delay_ms(n) #define get_ms(m) do{*m = HAL_GetTick();}while(0) #define log_i printf #define log_e printf #define min(a,b) ((a