[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博客

浙公网安备 33010602011771号