STM32CubeF3/Projects/STM32F3-Discovery/Demonstrations/Src/selftest.c

387 lines
7.7 KiB
C

/**
******************************************************************************
* @file Demonstrations/Src/selftest.c
* @author MCD Application Team
* @brief Main program body
******************************************************************************
* @attention
*
* Copyright (c) 2016 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/** @addtogroup STM32F3-Discovery_Demo STM32F3-Discovery_Demo
* @{
*/
/* Includes ------------------------------------------------------------------*/
#include "selftest.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
extern __IO uint8_t UserButtonPressed;
extern USBD_HandleTypeDef USBD_Device;
/* Init af threshold to detect acceleration on MEMS */
int16_t ThresholdHigh = 2500;
int16_t ThresholdLow = -2500;
/* Private function prototypes -----------------------------------------------*/
static void USB_GetPointerData_Test(uint8_t *pbuf);
static void USB_GetPointerData_Demo(uint8_t *pbuf);
static void Demo_GyroReadAngRate (float* pfData);
/* Private functions ---------------------------------------------------------*/
/**
* @brief Test ACCELERATOR MEMS Hardware.
* The main objective of this test is to check acceleration on 2 axis X and Y
* @param None
* @retval None
*/
void ACCELERO_MEMS_Test(void)
{
int16_t buffer[3] = {0};
int16_t xval, yval = 0x00;
__disable_irq();
/* Read Acceleration*/
BSP_ACCELERO_GetXYZ(buffer);
__enable_irq();
/* Update autoreload and capture compare registers value*/
xval = buffer[0];
yval = buffer[1];
if((ABS(xval))>(ABS(yval)))
{
if(xval > ThresholdHigh)
{
/* LED7 On */
BSP_LED_On(LED7);
HAL_Delay(10);
}
else if(xval < ThresholdLow)
{
/* LED6 On */
BSP_LED_On(LED6);
HAL_Delay(10);
}
else
{
HAL_Delay(10);
}
}
else
{
if(yval < ThresholdLow)
{
/* LED3 On */
BSP_LED_On(LED3);
HAL_Delay(10);
}
else if(yval > ThresholdHigh)
{
/* LED10 On */
BSP_LED_On(LED10);
HAL_Delay(10);
}
else
{
HAL_Delay(10);
}
}
BSP_LED_Off(LED3);
BSP_LED_Off(LED6);
BSP_LED_Off(LED7);
BSP_LED_Off(LED4);
BSP_LED_Off(LED10);
BSP_LED_Off(LED8);
BSP_LED_Off(LED9);
BSP_LED_Off(LED5);
}
/**
* @brief Test GYROSCOPE MEMS Hardware.
* The main objectif of this test is to check the hardware connection of the
* MEMS peripheral.
* @param None
* @retval None
*/
void GYRO_MEMS_Test(void)
{
/* Gyroscope variable */
float Buffer[3];
float Xval,Yval = 0x00;
/* Read Gyro Angular data */
BSP_GYRO_GetXYZ(Buffer);
/* Update autoreload and capture compare registers value*/
Xval = ABS((Buffer[0]));
Yval = ABS((Buffer[1]));
if(Xval>Yval)
{
if(Buffer[0] > 5000.0f)
{
/* LD10 On */
BSP_LED_On(LED10);
HAL_Delay(10);
}
else if(Buffer[0] < -5000.0f)
{
/* LED3 On */
BSP_LED_On(LED3);
HAL_Delay(10);
}
else
{
HAL_Delay(10);
}
}
else
{
if(Buffer[1] < -5000.0f)
{
/* LD6 on */
BSP_LED_On(LED6);
HAL_Delay(10);
}
else if(Buffer[1] > 5000.0f)
{
/* LD7 On */
BSP_LED_On(LED7);
HAL_Delay(10);
}
else
{
HAL_Delay(10);
}
}
BSP_LED_Off(LED3);
BSP_LED_Off(LED6);
BSP_LED_Off(LED7);
BSP_LED_Off(LED4);
BSP_LED_Off(LED10);
BSP_LED_Off(LED8);
BSP_LED_Off(LED9);
BSP_LED_Off(LED5);
}
/**
* @brief USB Test : Configure the USB
* @param None
* @retval None
*/
void USB_Test(void)
{
uint8_t HID_Buffer[4];
while ((BSP_PB_GetState(BUTTON_USER) != GPIO_PIN_SET))
{
USB_GetPointerData_Test(HID_Buffer);
/* send data though IN endpoint*/
if((HID_Buffer[1] != 0) || (HID_Buffer[2] != 0))
{
USBD_HID_SendReport(&USBD_Device, HID_Buffer, 4);
HAL_Delay (50);
}
}
/* Wait for User button is released */
while (BSP_PB_GetState(BUTTON_USER) != GPIO_PIN_RESET)
{}
/* Turn Off Leds */
BSP_LED_Off(LED3);
BSP_LED_Off(LED6);
BSP_LED_Off(LED7);
BSP_LED_Off(LED10);
}
/**
* @brief USBD_HID_GetPos
* @param None
* @retval Pointer to report
*/
static void USB_GetPointerData_Test(uint8_t *pbuf)
{
static int8_t x = 0;
static int8_t y = 0;
static int8_t Sens = 0;
static int8_t Pas = 0;
if (Pas == 20)
{
Pas=0;
Sens++;
}
if(Sens == 0)
{
x=Pas++;
y=0;
BSP_LED_Toggle(LED3);
}
if(Sens == 1)
{
y=Pas++;
x=0;
BSP_LED_Toggle(LED7);
}
if (Sens == 2)
{
x=256-Pas++;
y=0;
BSP_LED_Toggle(LED10);
}
if (Sens == 3)
{
y=256-Pas++;
x=0;
BSP_LED_Toggle(LED6);
}
if (Sens == 4)
{
Sens=0;
x=0;
y=0;
}
pbuf[0] = 0;
pbuf[1] = x;
pbuf[2] = y;
pbuf[3] = 0;
}
/**
* @brief USB Mouse cursor moving
* @param None
* @retval None
*/
void USB_Demo(void)
{
uint8_t HID_Buffer[4];
BSP_LED_On(LED3);
BSP_LED_On(LED6);
BSP_LED_Off(LED10);
BSP_LED_Off(LED7);
while ((BSP_PB_GetState(BUTTON_USER) != GPIO_PIN_SET))
{
USB_GetPointerData_Demo(HID_Buffer);
/* send data though IN endpoint*/
if((HID_Buffer[1] != 0) || (HID_Buffer[2] != 0))
{
USBD_HID_SendReport(&USBD_Device, HID_Buffer, 4);
}
}
/* Turn Off Leds */
BSP_LED_Off(LED4);
BSP_LED_Off(LED3);
BSP_LED_Off(LED5);
BSP_LED_Off(LED7);
BSP_LED_Off(LED9);
BSP_LED_Off(LED10);
BSP_LED_Off(LED8);
BSP_LED_Off(LED6);
}
/**
* @brief USBD_HID_GetPos
* @param None
* @retval Pointer to report
*/
void USB_GetPointerData_Demo(uint8_t *pbuf)
{
static float Buffer[6] = {0};
/* Read Gyro Angular data */
Demo_GyroReadAngRate(Buffer);
pbuf[0] = 0;
pbuf[1] = -(int8_t)(Buffer[2]) / 15;
pbuf[2] = (int8_t)(Buffer[1]) / 15;
pbuf[3] = 0;
BSP_LED_Toggle(LED3);
BSP_LED_Toggle(LED10);
BSP_LED_Toggle(LED6);
BSP_LED_Toggle(LED7);
}
/**
* @brief Calculate the angular Data rate Gyroscope.
* @param pfData : Data out pointer
* @retval None
*/
static void Demo_GyroReadAngRate (float* pfData)
{
uint8_t tmpbuffer[6] ={0};
int16_t RawData[3] = {0};
uint8_t tmpreg = 0;
float sensitivity = 0;
int i =0;
GYRO_IO_Read(&tmpreg,L3GD20_CTRL_REG4_ADDR,1);
GYRO_IO_Read(tmpbuffer,L3GD20_OUT_X_L_ADDR,6);
/* check in the control register 4 the data alignment (Big Endian or Little Endian)*/
if(!(tmpreg & L3GD20_BLE_MSB))
{
for(i=0; i<3; i++)
{
RawData[i]=(int16_t)(((uint16_t)tmpbuffer[2*i+1] << 8) + tmpbuffer[2*i]);
}
}
else
{
for(i=0; i<3; i++)
{
RawData[i]=(int16_t)(((uint16_t)tmpbuffer[2*i] << 8) + tmpbuffer[2*i+1]);
}
}
/* Switch the sensitivity value set in the CRTL4 */
switch(tmpreg & L3GD20_FULLSCALE_SELECTION)
{
case L3GD20_FULLSCALE_250:
sensitivity=L3GD20_SENSITIVITY_250DPS;
break;
case L3GD20_FULLSCALE_500:
sensitivity=L3GD20_SENSITIVITY_500DPS;
break;
case L3GD20_FULLSCALE_2000:
sensitivity=L3GD20_SENSITIVITY_2000DPS;
break;
default:
sensitivity=L3GD20_SENSITIVITY_250DPS;
}
/* Divide by sensitivity */
for(i=0; i<3; i++)
{
pfData[i]=(float)(RawData[i] / sensitivity);
}
}
/**
* @}
*/