OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11039|回复: 12

想用mpu6050的中断,谁了解但是我的INT引脚为什么一直为高电平

[复制链接]

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-7-6
在线时间
3 小时
发表于 2018-8-19 20:35:30 | 显示全部楼层 |阅读模式
1金钱
关键是我按正点原子例程那样抄下来,禁用mpu6050中断,它INT位也一直位高电平,就算我设置PA4(INT)位下拉输入,还是高,初学32,求大神指教
void EXTIX_Init(void)
{
     EXTI_InitTypeDef EXTI_InitStructure;
      NVIC_InitTypeDef NVIC_InitStructure;
     GPIO_InitTypeDef GPIO_InitStructure;
     
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
     
     GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
     GPIO_SetBits(GPIOA,GPIO_Pin_4);
     
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);     //使能复用功能时钟
     GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource4);
     
     EXTI_InitStructure.EXTI_Line=EXTI_Line4;     
     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;     
     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
     EXTI_InitStructure.EXTI_LineCmd = ENABLE;
     EXTI_Init(&EXTI_InitStructure);           //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
     
     NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;               
     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;     //抢占优先级2
     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;                         //子优先级0
     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                        //使能外部中断通道
     NVIC_Init(&NVIC_InitStructure);          //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
}

void EXTI4_IRQHandler(void)
{
     if(EXTI_GetITStatus(EXTI_Line4) == RESET)     
     {
          LED1=!LED1;
          LED0=!LED0;
          cont++;
          if(cont >= 500)
          {
               cont = 500;
          }      
           
     }
     EXTI_ClearITPendingBit(EXTI_Line4);  //清除LINE4上的中断标志位
}

u8 MPU_Init(void)                                        //初始化MPU6050
{
     u8 res;
     GPIO_InitTypeDef  GPIO_InitStructure;
     
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO时钟
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//先使能外设IO PORTA时钟
     
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;      // 端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;            //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //IO口速度为50MHz
  GPIO_Init(GPIOA, &GPIO_InitStructure);                          //根据设定参数初始化GPIOA
     
     GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
     
     MPU_AD0_CTRL = 0;
     
     MPU_IIC_Init();
//     mpu_dmp_init();
     MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x80);          //复位MPU6050
     delay_ms(100);
     MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x00);//唤醒MPU6050
     MPU_Set_Gyro_Fsr(3);                              //陀螺仪传感器,±2000dps                    
     MPU_Set_Accel_Fsr(2);                              //加速度传感器,±2g
     MPU_Set_Rate(50);                                        //设置采样率50Hz
     MPU_Write_Byte(MPU_USER_CTRL_REG,0x00);
     MPU_Write_Byte(MPU_FIFO_EN_REG,0x00);
     
     //MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80);         //INT引脚低电平有效
     
     
  MPU_Write_Byte(MPU_INTBP_CFG_REG,0X32);                 /* 中断信号为高电平,推挽输出,直到有读取操作才消失 寄存器0X37 */
     MPU_Write_Byte(MPU6050_RA_FF_THR,0x0f);           // 自由落体阈值                               寄存器0X1D
     MPU_Write_Byte(MPU6050_RA_FF_DUR,0X14);                  //检测时间20ms    单位1ms                   寄存器0X1E
// MPU_Write_Byte(MPU_MDETECT_CTRL_REG,0XC8);         //运动检测控制、加速度计上电延时200ms。 单位1ms    寄存器0X69
     MPU_Write_Byte(MPU_INT_EN_REG,0x00);                    //打开自由落体中断                           寄存器0X38  
     //MPU_Write_Byte(MPU_MOTION_DET_REG,0xFF);         //运动检测加速度阈值
     //MPU_Write_Byte(MPU_MOT_DUR,0X14);                                        //运动检测时间阈值
     //MPU_Write_Byte(MPU_INT_EN_REG,1<<6);
     
     
     res = MPU_Read_Byte(MPU_DEVICE_ID_REG);
     if(res == MPU_ADDR)
     {
          MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x01);
          MPU_Write_Byte(MPU_PWR_MGMT2_REG,0x00);
          MPU_Set_Rate(50);
     }else return 1;
     return 0
}

            想用自由落体中断但是因为,INT引脚一直是高电平,所以用不了中断,对了,板子是正点原子战舰V3


最佳答案

查看完整内容[请看2#楼]

你看一看一下http://www.openedv.com/forum.php?mod=viewthread&tid=276987&page=1#pid871255 我在11楼的回答里MP6050的初始化,是用中断读的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2018-2-12
在线时间
23 小时
发表于 2018-8-19 20:35:31 | 显示全部楼层
你看一看一下http://www.openedv.com/forum.php ... mp;page=1#pid871255
我在11楼的回答里MP6050的初始化,是用中断读的
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-8-20 01:25:53 | 显示全部楼层
我们没用中断读取数据哦
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-8-20 10:33:59 | 显示全部楼层
老哥  PA4你自己设置成上拉输入的....不能怪人家不给你改啊....
看一看GPIO各个引脚模式和定义方法....               输入还是输出   搞清楚了
猪猪熊呢?
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-7-6
在线时间
3 小时
 楼主| 发表于 2018-8-20 10:39:27 | 显示全部楼层
正点原子 发表于 2018-8-20 01:25
我们没用中断读取数据哦

嗯嗯,我看了视频,我想尝试用中断就在例程上做改动,但是不知道mpu6050中断机制怎样的过程,比如运动中断,达到阈值计数器加一,达到时间阈值就产生中断?然后INT引脚被拉低或者变高,然后战舰的PA4产生外部中断?我配置的就是不行,不知道为什么?
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-7-6
在线时间
3 小时
 楼主| 发表于 2018-8-20 10:41:17 | 显示全部楼层
原子哥,例程里面为什么,INT引脚一直为高电平?
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-7-6
在线时间
3 小时
 楼主| 发表于 2018-8-20 11:17:22 | 显示全部楼层
323232 发表于 2018-8-20 10:33
老哥  PA4你自己设置成上拉输入的....不能怪人家不给你改啊....
看一看GPIO各个引脚模式和定义方法....    ...

我设置了下拉,INT也还是高电平啊
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-7-6
在线时间
3 小时
 楼主| 发表于 2018-8-20 17:02:38 | 显示全部楼层
感谢各位的帮助,我今天才能实现使用中断,我把下面这段战舰v3的主函数中的例程代码注释掉后就可以用中断了,但是不知道为什么,接下来如果我研究出来了,会继续更新,感谢大家

        /*while(mpu_dmp_init())
        {
                LCD_ShowString(30,130,200,16,16,"MPU6050 Error");
                delay_ms(200);
                LCD_Fill(30,130,239,130+16,WHITE);
                delay_ms(200);
        }  */
回复

使用道具 举报

4

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2018-2-12
在线时间
23 小时
发表于 2018-8-20 19:57:57 | 显示全部楼层
本帖最后由 HexAI 于 2018-8-20 20:01 编辑

初始化函数你改了嘛?改了的话如果你没有对返回值作处理会一直卡在While里不停初始化显然不行,init完成之后你又是刷新LCD又是Delay了这么久都错过多少数据了,尽管你用的是中断,但你用的是软件I2C..
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-7-6
在线时间
3 小时
 楼主| 发表于 2018-8-21 09:47:26 | 显示全部楼层
HexAI 发表于 2018-8-20 19:57
初始化函数你改了嘛?改了的话如果你没有对返回值作处理会一直卡在While里不停初始化显然不行,init完成之 ...

是不是使用了dmp就不能用mpu6050的中断了
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-7-6
在线时间
3 小时
 楼主| 发表于 2018-8-21 09:48:11 | 显示全部楼层
13290551722 发表于 2018-8-21 09:47
是不是使用了dmp就不能用mpu6050的中断了

初始化函数返回值改了,但是没什么效果
回复

使用道具 举报

4

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2018-2-12
在线时间
23 小时
发表于 2018-8-21 12:32:56 | 显示全部楼层
13290551722 发表于 2018-8-21 09:47
是不是使用了dmp就不能用mpu6050的中断了

可以啊,只是dmp处理效果一般,而且由于低通滤波器的原因会有延迟
回复

使用道具 举报

0

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2020-7-4
在线时间
13 小时
发表于 2020-8-31 13:52:04 | 显示全部楼层
正点原子 发表于 2018-8-20 01:25
我们没用中断读取数据哦

原子哥,如果用中断要修改哪里啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 18:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表