大家好!
我试图使用物联网传感器实现自由落体探测器,我希望任何运动检测都被自由落体检测中断所取代。
我试过并尝试但它不起作用,这里是我的代码:
在用户传感器中:
void user_bmi160_config_low-g_intr(void){
bmi160_set_low_g_enable(bmi160_enable);
bmi160_set_low_high_g_source(0x01);
/ * BMI160 Datasheet PG 63,INT1是HI电平有源输出 - 推拉* /
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(0x01);
bmi160_set_reg_int_map_1(0x00);
bmi160_set_reg_int_map_2(0x00);
bmi160_set_low_g_threshold(0xff);
bmi160_set_low_g_mode(0x00);
}
在user_platform.c:我将它更改为检查低g中断:
#define bmi160_int_status1_lowg_int_flag 0x08
void wkup_intr_non_connected_cb(void)
{
uint8_t bmi160_int_status = 0;
if(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_teg_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.
if(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);
}
#别的
if(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);
}
#万一
}
任何帮助都受到高度赞赏
谢谢。
嗨Mnd Munzer,
当你提到它不起作用时,你会看到中断触发,设备不会醒来?自由落体中断发生吗?
谢谢mt_dialog.
好吧,实际上它应该开始广告,如果发生自由落体,所以我假设中断没有发生
谢谢。
嗨MHD Munzer,
好吧,你必须调试它并检查中断是否发生或不进行检查,以确保。如果中断触发器和设备无法唤醒,可能是中断的极性或者中断被触发,而且您从未达到启动通告功能,则触发中断之间有相当多的事情可能会出错开始广告。
谢谢mt_dialog.