/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
*
© Copyright (c) 2020 STMicroelectronics.
* All rights reserved.
*
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "crc.h"
#include "i2c.h"
#include "usart.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* Initialize mems driver interface */
uint8_t UartDataOut[MAX_LEN_UART_TX_BUFFER];
uint8_t whoamI, rst;
stmdev_ctx_t dev_ctx_mg;
stmdev_ctx_t dev_ctx_xl;
static axis3bit16_t data_raw_acceleration;
static axis3bit16_t data_raw_magnetic;
/* Extern variables ----------------------------------------------------------*/
uint32_t SensorsEnabled;
SENSOR_Axes_t AccValue;
SENSOR_Axes_t MagValue;
SENSOR_Axes_t MagValueComp;
uint8_t MCLibVersion[25];
uint8_t ECLibVersion[25];
volatile uint32_t TimeStamp = 0;
volatile uint32_t iteration = 0;
MEC_output_t Ecompas_data;
MMC_Input_t mag;
MMC_Output_t params;
uint8_t door_open_flag = 0;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
//void I2C_Debug(void);
static void Init_Sensors(void);
static void Accelero_Sensor_Handler(void);
static void Magneto_Sensor_Handler(void);
static int32_t platform_write(void *handle, uint8_t Reg, uint8_t *Bufp, uint16_t len);
static int32_t platform_read(void *handle, uint8_t Reg, uint8_t *Bufp, uint16_t len);
int16_t Abs_Degree(float a);
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* Initialize mems driver interface */
dev_ctx_xl.write_reg = platform_write;
dev_ctx_xl.read_reg = platform_read;
dev_ctx_xl.handle = (void*)LSM303AGR_I2C_ADD_XL;
dev_ctx_mg.write_reg = platform_write;
dev_ctx_mg.read_reg = platform_read;
dev_ctx_mg.handle = (void*)LSM303AGR_I2C_ADD_MG;
uint32_t delay5s, delay10ms;
uint16_t step = 0;
float SumY = 0, SumP = 0, SumR = 0;
//Angles_t AnglesMin;
//Angles_t AnglesMax;
Angles_t AnglesRef;
Angles_t Angles;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/*AnglesMin.yaw = 0;
AnglesMin.pitch = 0;
AnglesMin.roll = 0;
AnglesMax.yaw = 0;
AnglesMax.pitch = 0;
AnglesMax.roll = 0;*/
AnglesRef.yaw = 0;
AnglesRef.pitch = 0;
AnglesRef.roll = 0;
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_I2C1_Init();
MX_USART2_UART_Init();
MX_CRC_Init();
/* USER CODE BEGIN 2 */
sprintf((char *)UartDataOut, "[INIT] Initialization begin\r\n");
HAL_UART_Transmit(&huart2, UartDataOut, sizeof(UartDataOut), UART_TIMEOUT);
for(int i = 0; i < MAX_LEN_UART_TX_BUFFER; i ++) UartDataOut[i] = '\0';
/* Sensor init */
Init_Sensors();
/* Librairy initialization */
MotionMC_Initialize(ALGO_PERIOD, 1);
MotionEC_manager_init(ALGO_FREQ);
delay10ms = HAL_GetTick();
/* Get lib version */
MotionMC_GetLibVersion((char *)MCLibVersion);
MotionEC_GetLibVersion((char *)ECLibVersion);
sprintf((char *)UartDataOut, "[INIT] MC lib Version : %s\r\n[INIT] EC lib Version : %s\r\n", (char *)MCLibVersion, (char *)ECLibVersion);
HAL_UART_Transmit(&huart2, UartDataOut, sizeof(UartDataOut), UART_TIMEOUT);
for(int i = 0; i < MAX_LEN_UART_TX_BUFFER; i ++) UartDataOut[i] = '\0';
/* Ref value set up */
while(step < 100)
{
if(HAL_GetTick() - delay10ms >= ALGO_PERIOD)
{
delay10ms = HAL_GetTick();
/* Get data */
Accelero_Sensor_Handler();
Magneto_Sensor_Handler();
/* Run E-compas function */
MotionEC_manager_run(&Ecompas_data);
step += 1;
SumY += (Ecompas_data.euler[0]);
SumP += (Ecompas_data.euler[1]);
SumR += (Ecompas_data.euler[2]);
/* Debug */
sprintf((char *)UartDataOut, "[ANGLE CAL] \tYaw = %.3d \tPitch = %.3d \tRoll = %.3d \t(degree)\r\n", (int16_t)(SumY/step), (int16_t)(SumP/step), (int16_t)(SumR/step));
HAL_UART_Transmit(&huart2, UartDataOut, sizeof(UartDataOut), UART_TIMEOUT);
for(int i = 0; i < MAX_LEN_UART_TX_BUFFER; i ++) UartDataOut[i] = '\0';
}
}
AnglesRef.yaw = (int16_t)SumY / step;
AnglesRef.pitch = (int16_t)SumP / step;
AnglesRef.roll = (int16_t)SumR / step;
sprintf((char *)UartDataOut, "[ANGLE REF] \tYaw = %.3d \tPitch = %.3d \tRoll = %.3d \t(degree)\r\n", AnglesRef.yaw, AnglesRef.pitch, AnglesRef.roll);
HAL_UART_Transmit(&huart2, UartDataOut, sizeof(UartDataOut), UART_TIMEOUT);
for(int i = 0; i < MAX_LEN_UART_TX_BUFFER; i ++) UartDataOut[i] = '\0';
/* Sensor deinit */
lsm303agr_xl_data_rate_set(&dev_ctx_xl, LSM303AGR_XL_POWER_DOWN);
lsm303agr_mag_operating_mode_set(&dev_ctx_xl, LSM303AGR_POWER_DOWN);
/* Librairy de-initialization */
MotionMC_Initialize(ALGO_PERIOD, 0);
sprintf((char *)UartDataOut, "[INIT] Initialization end\r\n\n");
HAL_UART_Transmit(&huart2, UartDataOut, sizeof(UartDataOut), UART_TIMEOUT);
for(int i = 0; i < MAX_LEN_UART_TX_BUFFER; i ++) UartDataOut[i] = '\0';
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_Delay(20000); //wait for 20 seconds
/* Librairy initialization */
MotionMC_manager_init(ALGO_PERIOD, 1);
MotionEC_manager_init(ALGO_FREQ);
delay10ms = HAL_GetTick();
/* Get lib version */
MotionMC_GetLibVersion((char *)MCLibVersion);
MotionEC_GetLibVersion((char *)ECLibVersion);
/* Sensor init */
Init_Sensors();
delay5s = HAL_GetTick();
while(HAL_GetTick() - delay5s < 5000)
{
if(HAL_GetTick() - delay10ms >= ALGO_PERIOD)
{
delay10ms = HAL_GetTick();
/* Get data */
Accelero_Sensor_Handler();
Magneto_Sensor_Handler();
/* Run E-compas function */
MotionEC_manager_run(&Ecompas_data);
Angles.yaw = (int16_t)(Ecompas_data.euler[0]);
Angles.pitch = (int16_t)(Ecompas_data.euler[1]);
Angles.roll = (int16_t)(Ecompas_data.euler[2]);
/* AnglesMin.yaw = MIN(AnglesMin.yaw, Angles.yaw - AnglesRef.yaw );
AnglesMin.pitch = MIN(AnglesMin.pitch, Angles.pitch - AnglesRef.pitch );
AnglesMin.roll = MIN(AnglesMin.roll, Angles.roll - AnglesRef.roll );
AnglesMax.yaw = MAX(AnglesMax.yaw, Angles.yaw - AnglesRef.yaw );
AnglesMax.pitch = MAX(AnglesMax.pitch, Angles.pitch - AnglesRef.pitch );
AnglesMax.roll = MAX(AnglesMax.roll, Angles.roll - AnglesRef.roll ); */
/*sprintf((char *)UartDataOut, "[ANGLE] yaw : [%.3d, %.3d], \tPitch : [%.3d, %.3d], \tRoll : [%.3d, %.3d]\r\n"
, AnglesMin.yaw, AnglesMax.yaw, AnglesMin.pitch, AnglesMax.pitch , AnglesMin.roll , AnglesMax.roll);
HAL_UART_Transmit(&huart2, UartDataOut, sizeof(UartDataOut), UART_TIMEOUT);
for(int i = 0; i < MAX_LEN_UART_TX_BUFFER; i ++) UartDataOut[i] = '\0';*/
sprintf((char *)UartDataOut, "[ANGLE] \tYaw = %.3d \tPitch = %.3d \tRoll = %.3d \t(degree)\r\n", Angles.yaw - AnglesRef.yaw, Angles.pitch - AnglesRef.pitch, Angles.roll - AnglesRef.roll);
HAL_UART_Transmit(&huart2, UartDataOut, sizeof(UartDataOut), UART_TIMEOUT);
for(int i = 0; i < MAX_LEN_UART_TX_BUFFER; i ++) UartDataOut[i] = '\0';
}
}
/* Sensor deinit */
lsm303agr_xl_data_rate_set(&dev_ctx_xl, LSM303AGR_XL_POWER_DOWN);
lsm303agr_mag_operating_mode_set(&dev_ctx_xl, LSM303AGR_POWER_DOWN);
/* Librairy de-initialization */
MotionMC_Initialize(ALGO_PERIOD, 0);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
/** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLM = 1;
RCC_OscInitStruct.PLL.PLLN = 10;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB busses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
{
Error_Handler();
}
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_I2C1;
PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Error_Handler();
}
/** Configure the main internal regulator output voltage
*/
if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
{
Error_Handler();
}
}
/* USER CODE BEGIN 4 */
static int32_t platform_write(void *handle, uint8_t Reg, uint8_t *Bufp, uint16_t len)
{
uint32_t i2c_add = (uint32_t)handle;
if (i2c_add == LSM303AGR_I2C_ADD_XL)
{
/* enable auto incremented in multiple read/write commands */
Reg |= 0x80;
}
#ifdef DEBUG
snprintf((char *)UartDataOut, MAX_LEN_UART_TX_BUFFER, "[DEBUG] Trying to write 0x%.2X in the register 0x%.2X at the address 0x%.2X\r\n", *Bufp, Reg, i2c_add);
HAL_UART_Transmit(&huart2, UartDataOut, sizeof(UartDataOut), UART_TIMEOUT);
for(int i = 0; i < MAX_LEN_UART_TX_BUFFER; i ++) UartDataOut[i] = '\0';
uint8_t errorCode;
errorCode =
#endif
HAL_I2C_Mem_Write(&hi2c1, i2c_add, Reg, I2C_MEMADD_SIZE_8BIT, Bufp, len, 1000);
HAL_Delay(10);
#ifdef DEBUG_I2C
if(errorCode == HAL_OK)
snprintf((char *)UartDataOut, MAX_LEN_UART_TX_BUFFER, "[DEBUG I2C] I2C comunication OK\r\n");
else if(errorCode == HAL_TIMEOUT)
snprintf((char *)UartDataOut, MAX_LEN_UART_TX_BUFFER, "[DEBUG I2C] I2C comunication timeout\r\n");
else if(errorCode == HAL_BUSY)
snprintf((char *)UartDataOut, MAX_LEN_UART_TX_BUFFER, "[DEBUG I2C] I2C comunication busy\r\n");
else
snprintf((char *)UartDataOut, MAX_LEN_UART_TX_BUFFER, "[DEBUG I2C] I2C comunication error\r\n");
HAL_UART_Transmit(&huart2, UartDataOut, sizeof(UartDataOut), UART_TIMEOUT);
for(int i = 0; i < MAX_LEN_UART_TX_BUFFER; i ++) UartDataOut[i] = '\0';
#endif
return 0;
}
static int32_t platform_read(void *handle, uint8_t Reg, uint8_t *Bufp, uint16_t len)
{
uint32_t i2c_add = (uint32_t)handle;
if (i2c_add == LSM303AGR_I2C_ADD_XL)
{
/* enable auto incremented in multiple read/write commands */
Reg |= 0x80;
}
#ifdef DEBUG
snprintf((char *)UartDataOut, MAX_LEN_UART_TX_BUFFER, "[DEBUG] Trying to read the register 0x%.2X at the address 0x%.2X\r\n", Reg, i2c_add);
HAL_UART_Transmit(&huart2, UartDataOut, sizeof(UartDataOut), UART_TIMEOUT);
for(int i = 0; i < MAX_LEN_UART_TX_BUFFER; i ++) UartDataOut[i] = '\0';
uint8_t errorCode;
errorCode =
#endif
HAL_I2C_Mem_Read(&hi2c1, (uint8_t) i2c_add, Reg, I2C_MEMADD_SIZE_8BIT, Bufp, len, 1000);
HAL_Delay(10);
#ifdef DEBUG
#ifdef DEBUG_I2C
if(errorCode == HAL_OK)
snprintf((char *)UartDataOut, MAX_LEN_UART_TX_BUFFER, "[DEBUG I2C] I2C comunication OK\r\n");
else if(errorCode == HAL_TIMEOUT)
snprintf((char *)UartDataOut, MAX_LEN_UART_TX_BUFFER, "[DEBUG I2C] I2C comunication timeout\r\n");
else if(errorCode == HAL_BUSY)
snprintf((char *)UartDataOut, MAX_LEN_UART_TX_BUFFER, "[DEBUG I2C] I2C comunication busy\r\n");
else
snprintf((char *)UartDataOut, MAX_LEN_UART_TX_BUFFER, "[DEBUG I2C] I2C comunication error\r\n");
HAL_UART_Transmit(&huart2, UartDataOut, sizeof(UartDataOut), UART_TIMEOUT);
for(int i = 0; i < MAX_LEN_UART_TX_BUFFER; i ++) UartDataOut[i] = '\0';
#endif
snprintf((char *)UartDataOut, MAX_LEN_UART_TX_BUFFER, "[DEBUG] The value of the register 0x%.2X is 0x%.2X\r\n", Reg, *Bufp);
HAL_UART_Transmit(&huart2, UartDataOut, sizeof(UartDataOut), UART_TIMEOUT);
for(int i = 0; i < MAX_LEN_UART_TX_BUFFER; i ++) UartDataOut[i] = '\0';
#endif
return 0;
}
/**
* @brief Handles the ACC axes data getting/sending
* @param Msg the ACC part of the stream
* @param Instance the device instance
* @retval None
*/
static void Accelero_Sensor_Handler(void)
{
/* Read accelerometer data */
memset(data_raw_acceleration.u8bit, 0x00, 3*sizeof(int16_t));
lsm303agr_acceleration_raw_get(&dev_ctx_xl, data_raw_acceleration.u8bit);
AccValue.x = lsm303agr_from_fs_2g_hr_to_mg( data_raw_acceleration.i16bit[0] );
AccValue.y = lsm303agr_from_fs_2g_hr_to_mg( data_raw_acceleration.i16bit[1] );
AccValue.z = lsm303agr_from_fs_2g_hr_to_mg( data_raw_acceleration.i16bit[2] );
}
/**
* @brief Handles the MAG axes data getting/sending
* @param Msg the MAG part of the stream
* @param Instance the device instance
* @retval None
*/
static void Magneto_Sensor_Handler(void)
{
/* Read magnetic field data */
memset(data_raw_magnetic.u8bit, 0x00, 3*sizeof(int16_t));
lsm303agr_magnetic_raw_get(&dev_ctx_mg, data_raw_magnetic.u8bit);
MagValue.x = lsm303agr_from_lsb_to_mgauss( data_raw_magnetic.i16bit[0]);
MagValue.y = lsm303agr_from_lsb_to_mgauss( data_raw_magnetic.i16bit[1]);
MagValue.z = lsm303agr_from_lsb_to_mgauss( data_raw_magnetic.i16bit[2]);
/* Convert magnetometer data from [mGauss] to [uT] */
mag.Mag[0] = (float)MagValue.x / 10.0f;
mag.Mag[1] = (float)MagValue.y / 10.0f;
mag.Mag[2] = (float)MagValue.z / 10.0f;
/* Set time stamp */
mag.TimeStamp = TimeStamp;
/* Magnetometer update */
MotionMC_Update(&mag);
/* Get magnetometer calibration parameters */
MotionMC_GetCalParams(¶ms);
/* Calibrate data */
MagValueComp.x = 0;
MagValueComp.y = 0;
MagValueComp.z = 0;
for (int j = 0; j < 3; j++)
{
MagValueComp.x += (MagValue.x - params.HI_Bias[j] * 10.0f) * params.SF_Matrix[0][j];
MagValueComp.y += (MagValue.y - params.HI_Bias[j] * 10.0f) * params.SF_Matrix[1][j];
MagValueComp.z += (MagValue.z - params.HI_Bias[j] * 10.0f) * params.SF_Matrix[2][j];
}
/* Debug */
//sprintf((char *)UartDataOut, "\n[MAG] \t\tMagX : %.4ld,\t%.4ld,\t%.4ld\t(mG)\r\n", MagValue.x, MagValue.y, MagValue.z);
//HAL_UART_Transmit(&huart2, UartDataOut, sizeof(UartDataOut), UART_TIMEOUT);
//for(int i = 0; i < MAX_LEN_UART_TX_BUFFER; i ++) UartDataOut[i] = '\0';
//sprintf((char *)UartDataOut, "[MAG_CMP] \tMagX : %.4ld,\t%.4ld,\t%.4ld\t(mG)\r\n", MagValueComp.x, MagValueComp.y, MagValueComp.z);
//HAL_UART_Transmit(&huart2, UartDataOut, sizeof(UartDataOut), UART_TIMEOUT);
//for(int i = 0; i < MAX_LEN_UART_TX_BUFFER; i ++) UartDataOut[i] = '\0';
}
/**
* @brief Initialize all sensors
* @param None
* @retval None
*/
static void Init_Sensors(void)
{
/* Check device ID */
whoamI = 0;
lsm303agr_xl_device_id_get(&dev_ctx_xl, &whoamI);
if ( whoamI != LSM303AGR_ID_XL )
{
sprintf((char *)UartDataOut, "[DEBUG] Who am I error : get 0x%.2X instead of 0x%.2X", whoamI, LSM303AGR_ID_XL);
HAL_UART_Transmit(&huart2, UartDataOut, sizeof(UartDataOut), UART_TIMEOUT);
for(int i = 0; i < MAX_LEN_UART_TX_BUFFER; i ++) UartDataOut[i] = '\0';
while(1);
}
whoamI = 0;
lsm303agr_mag_device_id_get(&dev_ctx_mg, &whoamI);
if ( whoamI != LSM303AGR_ID_MG )
{
sprintf((char *)UartDataOut, "[DEBUG] Who am I error : get 0x%.2X instead of 0x%.2X", whoamI, LSM303AGR_ID_MG);
HAL_UART_Transmit(&huart2, UartDataOut, sizeof(UartDataOut), UART_TIMEOUT);
for(int i = 0; i < MAX_LEN_UART_TX_BUFFER; i ++) UartDataOut[i] = '\0';
while(1);
}
/* Restore default configuration for magnetometer */
lsm303agr_mag_reset_set(&dev_ctx_mg, PROPERTY_ENABLE);
do {
lsm303agr_mag_reset_get(&dev_ctx_mg, &rst);
} while (rst);
/* Enable Block Data Update */
lsm303agr_xl_block_data_update_set(&dev_ctx_xl, PROPERTY_ENABLE);
lsm303agr_mag_block_data_update_set(&dev_ctx_mg, PROPERTY_ENABLE);
/* Set Output Data Rate */
lsm303agr_xl_data_rate_set(&dev_ctx_xl, LSM303AGR_XL_ODR_10Hz);
lsm303agr_mag_data_rate_set(&dev_ctx_mg, LSM303AGR_MG_ODR_10Hz);
/* Set accelerometer full scale */
lsm303agr_xl_full_scale_set(&dev_ctx_xl, LSM303AGR_2g);
/* Set / Reset magnetic sensor mode */
lsm303agr_mag_set_rst_mode_set(&dev_ctx_mg, LSM303AGR_SENS_OFF_CANC_EVERY_ODR);
/* Enable temperature compensation on mag sensor */
lsm303agr_mag_offset_temp_comp_set(&dev_ctx_mg, PROPERTY_ENABLE);
/* Enable temperature sensor */
lsm303agr_temperature_meas_set(&dev_ctx_xl, LSM303AGR_TEMP_ENABLE);
/* Set device in continuos mode */
lsm303agr_xl_operating_mode_set(&dev_ctx_xl, LSM303AGR_HR_12bit);
/* Set magnetometer in continuos mode */
lsm303agr_mag_operating_mode_set(&dev_ctx_mg, LSM303AGR_CONTINUOUS_MODE);
}
/*
*
*/
int16_t Abs_Degree(float a)
{
while(a < -180)
a += 360;
while(a > 180)
a -= 360;
return (uint16_t)a;
}
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
sprintf((char *)UartDataOut, "[Error] Error_Handler somewhere");
HAL_UART_Transmit(&huart2, UartDataOut, sizeof(UartDataOut), UART_TIMEOUT);
for(int i = 0; i < MAX_LEN_UART_TX_BUFFER; i ++) UartDataOut[i] = '\0';
/* USER CODE END Error_Handler_Debug */
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/