大家好!
我正在尝试使用物联网传感器实现一个自由落体检测器,我想用自由落体检测中断取代任何运动检测。
我试了又试,但它一直不起作用,下面是我的代码:
在user sensor.c中:
Void user_bmi160_config_low-g_intr(Void) {
bmi160_set_low_g_enable (BMI160_ENABLE);
bmi160_set_low_high_g_source (0 x01);
/* BMI160 Datasheet pg 63, int1 is hi level active with output - push pull */
bmi160_set_intr_1_output_enable (BMI160_ENABLE);
bmi160_set_intr_1_output_level (BMI160_LEVEL_HIGH);
bmi160_set_intr_1_output_odrn_pshpll (BMI160_OPEN_DRAIN);
bmi160_set_intr_1_output_edge_level (BMI160_EDGE);
bmi160_set_intrs_latched (BMI160_LATCH_DUR_2_5_MILLI_SEC);
bmi160_set_low_g_intr_1 (BMI160_ENABLE);
bmi160_set_reg_int_map_0 (0 x01);
bmi160_set_reg_int_map_1 (0 x00);
bmi160_set_reg_int_map_2 (0 x00);
bmi160_set_low_g_threshold (0 xff);
bmi160_set_low_g_mode (0 x00);
}
在user_platform.c中:我更改它来检查low-g中断:
#定义BMI160_INT_STATUS1_LOWG_INT_FLAG (
Void wkup_intr_non_connected_cb(Void)
{
uint8_t bmi160_int_status = 0;
如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN)) {
periph_init ();
}
arch_ble_ext_wakeup_off ();
/ / bmi160_get_reg_int_status_2 (&bmi160_int_status);
bmi160_get_reg_int_status_1 (&bmi160_int_status);
/ / bmi160_get_reg_int_status_0 (&bmi160_int_status);
DBG_MSG1("唤醒SF %x\r\n",(int)bmi160_int_status);
# ifdef USE_low_g_WAKEUP
如果(bmi160_int_status&BMI160_INT_STATUS1_LOWG_INT_FLAG) {
wrbl_env。adv_mode = ADV_MODE_FAST;
bmi160_soft_reset ();
EXECUTE_DEFAULT_OPERATION_VOID (default_operation_adv);
}
其他#
如果(bmi160_int_status&0x08) {
wrbl_env。adv_mode = ADV_MODE_FAST;
bmi160_set_sensor_state (ACC_SUSPEND);
bmi160_set_sensor_state (GYR_SUSPEND);
EXECUTE_DEFAULT_OPERATION_VOID (default_operation_adv);
}
# endif
}
非常感谢任何帮助
谢谢。
嗨mnd芒泽,
当你提到它不工作,你看到中断触发和设备不醒?自由落体中断发生了吗?
由于MT_dialog
实际上,如果自由落体发生,它应该开始广告,所以我假设中断根本没有发生
谢谢。
嗨磁流体动力芒泽,
你必须调试它,检查中断是否发生,以确定是否发生。如果中断触发,而设备没有唤醒,这可能是中断的极性或者中断被触发,而你永远达不到开始广告功能,在触发中断和开始广告之间有很多事情会出错。
由于MT_dialog