/** * @brief Initialize the accelerometer. * @param None * @retval None */ void Accelerometer_Init(void) { LIS3DSH_InitTypeDef accel_init; LIS3DSH_DRYInterruptConfigTypeDef it_config; accel_init.Power_Mode_Output_DataRate = LIS3DSH_DATARATE_25; /* Output data 25 times per second (25 Hz) as by requirements */ accel_init.Axes_Enable = LIS3DSH_XYZ_ENABLE; /* Enable x, y and z axes */ accel_init.Continous_Update = LIS3DSH_ContinousUpdate_Disabled; /* Disable continuous update to be able to read the MSB of each reading */ accel_init.AA_Filter_BW = LIS3DSH_AA_BW_50; /* Anti-aliasing filter bandwidth set to 50Hz to remove frequencies above 2 * 25Hz */ accel_init.Full_Scale = LIS3DSH_FULLSCALE_2; /* Use full scale of +/- 2g */ accel_init.Self_Test = LIS3DSH_SELFTEST_NORMAL; /* Self test normal */ /* Initialize LIS3DSH */ LIS3DSH_Init(&accel_init); it_config.Dataready_Interrupt = LIS3DSH_DATA_READY_INTERRUPT_ENABLED; /* Enable DRY interrupt */ it_config.Interrupt_signal = LIS3DSH_ACTIVE_HIGH_INTERRUPT_SIGNAL; /* Set interrupt to be active high as by requirements */ it_config.Interrupt_type = LIS3DSH_INTERRUPT_REQUEST_PULSED; /* Set interrupt type to be pulsed as by requirements */ /* Set LIS3DSH interrupt configuration */ LIS3DSH_DataReadyInterruptConfig(&it_config); /* Set priority for EXTI0 IRQ */ HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); /* Enable IRQ for the EXTI Line 0 (LSI3DSH generates INT1 interrupt on GPIO_PIN_0 PE0) */ HAL_NVIC_EnableIRQ(EXTI0_IRQn); }
/** * @brief A function used to configure and init the accelerometer * @param none * @retval none */ void configure_init_accelerometer(void) { //Configure the accelerometer initialization struct LIS3DSH_InitStruct.Power_Mode_Output_DataRate = LIS3DSH_DATARATE_25; /* Ppower down or /active mode with output data rate 3.125 / 6.25 / 12.5 / 25 / 50 / 100 / 400 / 800 / 1600 HZ */ LIS3DSH_InitStruct.Axes_Enable = LIS3DSH_XYZ_ENABLE; /* Axes enable */ LIS3DSH_InitStruct.Continous_Update = LIS3DSH_ContinousUpdate_Disabled; /* Block or update Low/High registers of data until all data is read */ LIS3DSH_InitStruct.AA_Filter_BW = LIS3DSH_AA_BW_50; /* Choose anti-aliasing filter BW 800 / 400 / 200 / 50 Hz*/ LIS3DSH_InitStruct.Full_Scale = LIS3DSH_FULLSCALE_2; /* Full scale 2 / 4 / 6 / 8 / 16 g */ LIS3DSH_InitStruct.Self_Test = LIS3DSH_SELFTEST_NORMAL; /* Self test */ //Configure the accelerometer interrupt struct LIS3DSH_IntConfigStruct.Dataready_Interrupt = LIS3DSH_DATA_READY_INTERRUPT_ENABLED; /* Enable/Disable data ready interrupt */ LIS3DSH_IntConfigStruct.Interrupt_signal = LIS3DSH_ACTIVE_HIGH_INTERRUPT_SIGNAL; /* Interrupt Signal Active Low / Active High */ LIS3DSH_IntConfigStruct.Interrupt_type = LIS3DSH_INTERRUPT_REQUEST_PULSED; /* Interrupt type as latched or pulsed */ //Enable the interrupt line HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 1); //Initialize the accelerometer LIS3DSH_Init(&LIS3DSH_InitStruct); //Setting the interrupt configuration of the accelerometer LIS3DSH_DataReadyInterruptConfig(&LIS3DSH_IntConfigStruct); }
//Initialize interrupts on the accelerometer void initAccelInts() { LIS3DSH_DRYInterruptConfigTypeDef accel_int_init; accel_int_init.Dataready_Interrupt = LIS3DSH_DATA_READY_INTERRUPT_ENABLED; //Data ready signal connected to INT1 accel_int_init.Interrupt_signal = LIS3DSH_ACTIVE_HIGH_INTERRUPT_SIGNAL; //Specified in section 3 of lab handout accel_int_init.Interrupt_type = LIS3DSH_INTERRUPT_REQUEST_PULSED; //Specified in section 3 of lab handout LIS3DSH_DataReadyInterruptConfig(&accel_int_init); }
void accelerometer_init(void) { LIS3DSH_InitTypeDef LIS3DSH_InitStruct; /* Set configuration of LIS302DL*/ LIS3DSH_InitStruct.Power_Mode_Output_DataRate = LIS3DSH_DATARATE_100; LIS3DSH_InitStruct.Axes_Enable = LIS3DSH_X_ENABLE | LIS3DSH_Y_ENABLE | LIS3DSH_Z_ENABLE; LIS3DSH_InitStruct.Full_Scale = LIS3DSH_FULLSCALE_4; LIS3DSH_InitStruct.AA_Filter_BW = LIS3DSH_AA_BW_200; LIS3DSH_InitStruct.Continous_Update = LIS3DSH_ContinousUpdate_Enabled; LIS3DSH_InitStruct.Self_Test = LIS3DSH_SELFTEST_NORMAL; LIS3DSH_Init(&LIS3DSH_InitStruct); /* Enable interrupt when data is ready */ LIS3DSH_DRYInterruptConfigTypeDef DRYInterruptConfig; DRYInterruptConfig.Dataready_Interrupt = LIS3DSH_DATA_READY_INTERRUPT_ENABLED; DRYInterruptConfig.Interrupt_signal = LIS3DSH_ACTIVE_HIGH_INTERRUPT_SIGNAL; DRYInterruptConfig.Interrupt_type = LIS3DSH_INTERRUPT_REQUEST_PULSED; LIS3DSH_DataReadyInterruptConfig(&DRYInterruptConfig); /* Set pin as input */ GPIO_InitTypeDef GPIO_InitStruct; GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIOE, &GPIO_InitStruct); /* Tell system that you will use PE0 for EXTI_Line0 */ SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource0); /* PE0 is connected to EXTI_Line0 */ EXTI_InitTypeDef EXTI_InitStruct; EXTI_InitStruct.EXTI_Line = EXTI_Line0; EXTI_InitStruct.EXTI_LineCmd = ENABLE; EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_Init(&EXTI_InitStruct); /* Add IRQ vector to NVIC */ NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); ma_filter_initialize(&filter_x, &cb_x, x_buffer); ma_filter_initialize(&filter_y, &cb_y, y_buffer); ma_filter_initialize(&filter_z, &cb_z, z_buffer); }
/** * @brief Initialise the Interrupt for the Accelerometer * @param None * @retval None */ void Accelerometer_Interrupt_Config(void) { /* initilalize accelerometer interupt */ LIS3DSH_DRYInterruptConfigTypeDef Acc_Interrupt_InitDef; /* define field of the accelerometer interupt initialisation structure */ Acc_Interrupt_InitDef.Dataready_Interrupt = LIS3DSH_DATA_READY_INTERRUPT_ENABLED; /* enable */ Acc_Interrupt_InitDef.Interrupt_signal = LIS3DSH_ACTIVE_HIGH_INTERRUPT_SIGNAL; /* active high */ Acc_Interrupt_InitDef.Interrupt_type = LIS3DSH_INTERRUPT_REQUEST_PULSED; /* pulse interupt */ LIS3DSH_DataReadyInterruptConfig(&Acc_Interrupt_InitDef); HAL_NVIC_EnableIRQ(EXTI0_IRQn); HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 1); }
/*Configure the accelerometer */ void Configure_Accel(void) { LIS3DSH_InitStruct.Power_Mode_Output_DataRate = LIS3DSH_DATARATE_25; LIS3DSH_InitStruct.Axes_Enable = LIS3DSH_X_ENABLE | LIS3DSH_Y_ENABLE | LIS3DSH_Z_ENABLE; LIS3DSH_InitStruct.Full_Scale = LIS3DSH_FULLSCALE_4; LIS3DSH_InitStruct.AA_Filter_BW = LIS3DSH_AA_BW_200; LIS3DSH_InitStruct.Continous_Update = LIS3DSH_ContinousUpdate_Disabled; LIS3DSH_InitStruct.Self_Test = LIS3DSH_SELFTEST_NORMAL; DRYInterruptConfig.Dataready_Interrupt = LIS3DSH_DATA_READY_INTERRUPT_ENABLED; DRYInterruptConfig.Interrupt_signal = LIS3DSH_ACTIVE_HIGH_INTERRUPT_SIGNAL; DRYInterruptConfig.Interrupt_type = LIS3DSH_INTERRUPT_REQUEST_PULSED; LIS3DSH_DataReadyInterruptConfig(&DRYInterruptConfig); LIS3DSH_Init(&LIS3DSH_InitStruct); HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); }
void memsinit(void){ LIS3DSH_InitTypeDef meminit; LIS3DSH_DRYInterruptConfigTypeDef intinit; meminit.Continous_Update = LIS3DSH_ContinousUpdate_Disabled; meminit.Power_Mode_Output_DataRate = LIS3DSH_DATARATE_25; meminit.AA_Filter_BW = LIS3DSH_AA_BW_800; meminit.Axes_Enable = LIS3DSH_XYZ_ENABLE; meminit.Full_Scale = LIS3DSH_FULLSCALE_2; meminit.Self_Test = LIS3DSH_SELFTEST_NORMAL; LIS3DSH_Init(&meminit); intinit.Dataready_Interrupt = LIS3DSH_DATA_READY_INTERRUPT_ENABLED; intinit.Interrupt_signal = LIS3DSH_ACTIVE_HIGH_INTERRUPT_SIGNAL; intinit.Interrupt_type = LIS3DSH_INTERRUPT_REQUEST_PULSED; LIS3DSH_DataReadyInterruptConfig(&intinit); }