新手上路
- 积分
- 32
- 金钱
- 32
- 注册时间
- 2018-7-6
- 在线时间
- 3 小时
|
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的初始化,是用中断读的
|