[Cubemx][HAL]使用STM32自带的IIC驱动mpu6050---1

所有文件地址:

https://gitee.com/sysbrk/code-lib

 

https://github.com/Sysbrk/STM32HAL-mpu6050-dmp


 

cubemx配置i2c时,配置模式要选用快速模式——

 

 

    /* USER CODE BEGIN 2 */
    delay_init(72);
    MPU_Init();
    mpu_dmp_init();
    printf("初始化成功!\r\n");
    /* USER CODE END 2 */

    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1) {
        HAL_Delay(50);
        while (mpu_dmp_get_data(&pitch, &roll, &yaw));    //必须要用while等待,才能读取成功
        MPU_Get_Accelerometer(&aacx, &aacy, &aacz);          //得到加速度传感器数据
        MPU_Get_Gyroscope(&gyrox, &gyroy, &gyroz);           //得到陀螺仪数据
        temp = MPU_Get_Temperature();                                  //得到温度信息
        printf("X:%.1f°  Y:%.1f°  Z:%.1f°  %.2f°C\r\n", roll, pitch, yaw, temp / 100);//串口1输出采集信息
        /* USER CODE END WHILE */

        /* USER CODE BEGIN 3 */

    }
    /* USER CODE END 3 */
}

 

 

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stdio.h"
#include "usart.h"
#include "gpio.h"
#include "i2c.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "delay.h"
#include "mpu6050.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h"
/* USER CODE END Includes */

 

在mpu6050.c中有这样一句:

  extern I2C_HandleTypeDef hi2c1;

需要把hi2c1换成对应开启的i2c口,我用的是i2c1,所以这里是1.

 

在i2c读写操作中有HAL_Delay延时,这个延时要么注释掉要么延时调低点,注释掉的情况我没运行过。

 1 //IIC连续写
 2 uint8_t MPU_Write_Len(uint8_t reg,uint8_t len,uint8_t *buf)
 3 {
 4   extern I2C_HandleTypeDef hi2c1;
 5   HAL_I2C_Mem_Write(&hi2c1, MPU_WRITE, reg, I2C_MEMADD_SIZE_8BIT, buf, len, 0xfff);
 6   HAL_Delay(1);
 7   
 8   return 0;
 9 }
10 //IIC连续读
11 //addr:器件地址
12 //reg:要读取的寄存器地址
13 //len:要读取的长度
14 //buf:读取到的数据存储区
15 //返回值:0,正常
16 //    其他,错误代码
17 uint8_t MPU_Read_Len(uint8_t reg,uint8_t len,uint8_t *buf)
18 { 
19   extern I2C_HandleTypeDef hi2c1;
20   HAL_I2C_Mem_Read(&hi2c1, MPU_READ, reg, I2C_MEMADD_SIZE_8BIT, buf, len, 0xfff);
21   HAL_Delay(1);
22   
23   return 0;    
24 }
25 //IIC写一个字节 
26 //reg:寄存器地址
27 //data:数据
28 //返回值:0,正常
29 //    其他,错误代码
30 uint8_t MPU_Write_Byte(uint8_t reg,uint8_t data)                  
31 { 
32   extern I2C_HandleTypeDef hi2c1;
33   unsigned char W_Data=0;
34 
35   W_Data = data;
36   HAL_I2C_Mem_Write(&hi2c1, MPU_WRITE, reg, I2C_MEMADD_SIZE_8BIT, &W_Data, 1, 0xfff);
37   HAL_Delay(1);
38   
39   return 0;
40 }
41 //IIC读一个字节 
42 //reg:寄存器地址 
43 //返回值:读到的数据
44 uint8_t MPU_Read_Byte(uint8_t reg)
45 {
46   extern I2C_HandleTypeDef hi2c1;
47   unsigned char R_Data=0;
48   
49   HAL_I2C_Mem_Read(&hi2c1, MPU_READ, reg, I2C_MEMADD_SIZE_8BIT, &R_Data, 1, 0xfff);
50   HAL_Delay(1);
51   
52   return R_Data;        
53 }

 

在mpu6050.h中要注意这里AD0脚的状态及对应的地址

//如果AD0脚(9脚)接地,IIC地址为0X68(不包含最低位).
//如果接V3.3,则IIC地址为0X69(不包含最低位).
#define MPU_ADDR                0X68

 


 

代码来源:Heimerdingerzzz/MPU6050: angle measurement (github.com)

参考资料:(36条消息) STM32系列(HAL库)——F103C8T6通过MPU6050+DMP姿态解算读取角度及温度_嵌入式创客工坊的博客-CSDN博客

posted @ 2022-07-04 14:55  grey_electron  阅读(781)  评论(0)    收藏  举报