MPU-6050 运动检测中断不触发

在使用 STM32 + MPU-6050 的时候,期望 STM32 进入停止模式后靠 MPU-6050 的运动检测来触发 STM32 的外部中断唤醒。却发现 INT 脚一直为高,不拉低。

根据 MPU-6050 的 datasheet

在初始化时配置了中断

1
2
3
4
MPU_Write_Byte(MPU_INTBP_CFG_REG, 0xA0);    // INT引脚低电平有效
MPU_Write_Byte(MPU_MDETECT_CTRL_REG, 0x1F); // 运动检测延时 200ms
MPU_Write_Byte(MPU_MOTION_DET_REG, 0x01); // 运动检测中断阈值
MPU_Write_Byte(MPU_INT_EN_REG, 0x40); // 开启运动检测中断

结果 INT 脚却始终为高,怎么晃动都不拉低。

原来是看的 datasheet 版本太老了,新版本已经没有这个运动检测中断了。

于是只好在停止模式下用 RTC 闹钟定时检查加速度的变化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
ENTERSTOPMODE:

// 开启 RTC 闹钟 用以喂狗
IWDG_Feed();
dev_rtc_setAlarm(3);
IWDG_Feed();

DEBUG_MSG("standby mode entered\r\n");
IWDG_Feed();

// 进入停止模式
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);

//DEBUG_MSG("standby mode exited\r\n");

// 是RTC闹钟唤醒的
if (dev_rtc_isAlarm()) {
//DEBUG_MSG("it's the RTC alarm, just feed watch dog\r\n");
// 喂狗
IWDG_Feed();

// 检查新的加速度
MPU_Get_Accelerometer(&t_aacx, &t_aacy,&t_aacz);
if (abs(t_aacx - aacx) > THRESHOLD_ACCELEROMETER_CHANGE || abs(t_aacy - aacy) > THRESHOLD_ACCELEROMETER_CHANGE || abs(t_aacz - aacz) > THRESHOLD_ACCELEROMETER_CHANGE) {
// 利用看门狗重启
while (1) {;}
}

// 喂完狗继续进入停止模式
goto ENTERSTOPMODE;
}