MPU6050移植正点原子指南和寄存器操作端口模式#define SDA_IN() /#define SDA_OUT()

本文介绍如何将原子哥的MPU6050程序适配PB8和PB9引脚,重点在于IO方向设置、寄存器操作和IIC初始化的修改。作者详细讲解了如何配置PB9作为双向IO,并涉及GPIO寄存器的CRH和CNF9设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MPU6050移植正点原子指南和寄存器操作端口模式#define SDA_IN() /#define SDA_OUT()


写在前面

最进要做个平衡车,要用到MPU6050模块,画板子时SCL与SDA引脚选到了PB8与PB9引脚,想白 嫖原子哥程序,发现引脚不对,本来以为很简单的改下引脚一下就行,结果搞了半天,最后发现PB9引脚方向设置错了。。。。尴尬


正文

首先,移植原子哥的MPU6050只需改动这三个点。
一:IO方向设置

//IO方向设置
#define MPU_SDA_IN()  {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}
#define MPU_SDA_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;};

二:IO操作函数

//IO操作函数	 
#define MPU_IIC_SCL    PBout(10) 		//SCL
#define MPU_IIC_SDA    PBout(11) 		//SDA	 
#define MPU_READ_SDA   PBin(11) 		//输入SDA 

三:初始化初始化IIC函数

//初始化IIC
void MPU_IIC_Init(void)
{					     
  GPIO_InitTypeDef  GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//先使能外设IO PORTB时钟 
		
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;	 // 端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
  GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIO 
	
  GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);						 //PB10,PB11 输出高	
 
}

其中这三点中第二和第三是比较简单的,但是IO方向修改则稍微要了解一下寄存器设置。以我为例,我要把PB10,PB11改成PB8,PB9引脚。

第一修改IO操作函数

//IO操作函数	 
#define MPU_IIC_SCL    PBout(8) 		//SCL  修改成了PB8
#define MPU_IIC_SDA    PBout(9) 		//SDA   修改成了PB9	 
#define MPU_READ_SDA   PBin(9) 		//输入SDA   修改成了PB9

第二修改初始化初始化IIC函数

//初始化IIC
void MPU_IIC_Init(void)
{					     
  GPIO_InitTypeDef  GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//先使能外设IO PORTB时钟 
		
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;	 // 端口配置 修改为PB8,9
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
  GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIO 
	
  GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9);						 //输出高 修改为PB8,9
 
}

第三修改IO方向设置

//IO方向设置
#define MPU_SDA_IN()  {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=8<<4;}
#define MPU_SDA_OUT() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=3<<4;};

ok,到现排除一些极端情况,做完这些MPU6050应该就能正常读取工作了。
接下来我要详细说明一下是如何修改IO方向的,因为PB9引脚即作为数据输入引脚也作为数据输出引脚,输出输入要配置好,这其中牵扯一些寄存器的知识。

解释一下输入配置:#define MPU_SDA_IN() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=8<<4;}
等价于下面的运算:

1. GPIOB->CRH&=0XFFFFFF0F;
2. GPIOB->CRH|=(u32)8<<4;

1.将CRH第二个低4位清零,其他位保持不变;
2.将“8”即“0b1000”左移4位即与原来的四位进行或运算;

这里我们要思考了,为什么是CRH不是CRL,这就牵扯到我们选的引脚是PB9,我们知道GPIOB对应着16个管脚,其中第PB0~7对应着IO口的低寄存器即CRL,而PB9显然对应着IO口的高寄存器即CRH
好,到现在为止,我们懂得了如何根据引脚来找到相应的寄存器,接下来我们就要把PB9引脚配置成输入引脚。我们根据手册可知要把MODE9配置成00输入模式,CNF9配置成10上下拉输入模式如下图所示:

在这里插入图片描述我们进一步思考,为什么配置成上下拉模式,是因为数据是通过上拉把数据输入进单片机的,我们可看到下图外部加了上拉电阻。这部分我理解不是很深刻,欢迎大家来评论区讨论。
在这里插入图片描述


正点原子MPU6050是一种常用的惯性测量单元(IMU),可以通过感知测量物体的运动姿态。如果要将MPU6050移植到其他硬件平台上,可以参考以下步骤: 1. 硬件连接:首先,根据MPU6050的引脚定义,将其正确连接到目标硬件平台上。确保电源地线的正确连接,并使用适当的电平转换器(如果需要)来匹配平台的电平要求。 2. 引脚定义:查阅MPU6050的数据手册,了解其引脚功能寄存器的作用。根据目标硬件平台的引脚分配,将引脚定义寄存器地址进行适配。可能需要对代码进行修改,以保证正确的引脚寄存器访问。 3. I2C通信:MPU6050使用I2C来与主控芯片进行通信。在移植过程中,需要根据目标硬件平台的I2C接口定义,修改MPU6050库中的相关代码。确保正确的I2C引脚初始化配置,并处理好I2C通信的错误。 4. 硬件中断配置:MPU6050可以通过硬件中断来提醒主控芯片有新的数据可用。在移植过程中,需要根据目标硬件平台上的外部中断引脚进行配置,并修改MPU6050库中的相关代码,以便处理中断触发相应的数据读取。 5. 校准滤波:为了获得更精确稳定的数据,可以进行MPU6050的校准滤波。参考MPU6050库中的相关函数,并根据实际需求平台特性进行适当的修改。 6. 数据处理应用:一旦MPU6050成功移植到目标硬件平台上,可以根据需要进行数据处理应用开发。使用MPU6050提供的姿态运动测量数据,可以实现姿态传感、动作识别等功能。 总之,将MPU6050移植到其他硬件平台上需要进行硬件连接、引脚定义、I2C通信、硬件中断配置、校准滤波等步骤。在移植过程中,需要根据目标平台的特性进行相关代码的修改,以确保MPU6050在新平台上能够正常工作。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值