基于Stm32CubeMX下Mpu6050模拟IIC的Dmp的移植
一、问题背景
以前熟悉的是在标准库下移植Mpu6050的DMP,获取航向角等等。现在要HAL库下移植MPU6050的DMP库。先分析一下,如果要移植Mpu6050的DMP,从底层到应用层大概分为这几个步骤:1. 底层IIC驱动编写。2. Mpu6050初始化及配置函数层。 3. 硬件驱动程序通过I2C与传感器通信。4. Dmp应用层。
首先要熟悉在标准库下的移植,那么下面的问题只是一些避免入坑的注意事项。
二、面临的问题及解决方法
-
HAL库下模拟IIC微妙级别的延时如何实现?
手写一个阻塞式微妙延时函数,可以用示波器测出,或者拿硬件仿真测试出。比如我的如下:
/* * @name I2C_Delay * @brief I2C延时 * @param None * @retval None */ static void I2C_Delay_us(uint8_t us) { uint8_t i = 0; //通过示波器测量进行校准 while(us--) { for(i=0;i<7;i++); } }
mpuiic.c程序中修改如下图所示:
-
IIC引脚的配置
-
原先的MPU_IIC_Init()就不需要了,可以把函数内部内容删除,函数名保留着。CubeMX代替了以前基于标准库的配置操作。
但是,mpuiic.h需要修改与引脚有关的设置。比如我用的是PE8、PE9.
- 宏定义
业务在HAL库下,毫秒延时可以用HAL_Delay()实现。
很多地方的数据类型用了u8、u16等,可以添加如下宏定义在头文件。
typedef uint32_t u32;
typedef uint16_t u16;
typedef uint8_t u8;
-
各级头文件包含关系
总:
三、结论
经测试,是可以正确读出数据的。这里是基于大家熟练移植标准库下的Mpu6050的Dmp库,在HAL库下的移植。祝好运。