Make sure docs are updated / settings_md (push) Canceled after 0s
Build firmware / test (push) Canceled after 0s
Build firmware / build-SITL-Windows (push) Canceled after 0s
Build firmware / build-SITL-Mac (push) Canceled after 0s
Build firmware / build-SITL-Linux (push) Canceled after 0s
Build firmware / build-SITL-Linux-arm64 (push) Canceled after 0s
Build firmware / upload-artifacts (push) Canceled after 0s
Build firmware / build-single-target (push) Canceled after 0s
Build firmware / build (9) (push) Canceled after 0s
Build firmware / build (8) (push) Canceled after 0s
Build firmware / build (7) (push) Canceled after 0s
Build firmware / build (6) (push) Canceled after 0s
Build firmware / build (5) (push) Canceled after 0s
Build firmware / build (4) (push) Canceled after 0s
Build firmware / build (3) (push) Canceled after 0s
Build firmware / build (2) (push) Canceled after 0s
Build firmware / build (14) (push) Canceled after 0s
Build firmware / build (13) (push) Canceled after 0s
Build firmware / build (12) (push) Canceled after 0s
Build firmware / build (11) (push) Canceled after 0s
Build firmware / build (10) (push) Canceled after 0s
Build firmware / build (1) (push) Canceled after 0s
Build firmware / build (0) (push) Canceled after 0s
Build firmware / detect (push) Canceled after 0s
Build pre-release / build (push) Canceled after 0s
Build pre-release / Release (push) Canceled after 0s
469 lines
12 KiB
C
469 lines
12 KiB
C
/**
|
|
******************************************************************************
|
|
* @file adafruit_802.c
|
|
* @author MCD Application Team
|
|
* @brief This file provides set of firmware functions to manage:
|
|
* - Joystick available on Adafruit 1.8" TFT LCD shield (reference ID 802)
|
|
*
|
|
******************************************************************************
|
|
* @attention
|
|
*
|
|
* <h2><center>© Copyright (c) 2018 STMicroelectronics.
|
|
* All rights reserved.</center></h2>
|
|
*
|
|
* 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
|
|
******************************************************************************
|
|
*/
|
|
|
|
/* Includes ------------------------------------------------------------------*/
|
|
#include "adafruit_802.h"
|
|
|
|
/** @addtogroup BSP
|
|
* @{
|
|
*/
|
|
|
|
/** @addtogroup ADAFRUIT_802
|
|
* @{
|
|
*/
|
|
|
|
/** @addtogroup ADAFRUIT_802_LOW_LEVEL
|
|
* @{
|
|
*/
|
|
|
|
/** @defgroup ADAFRUIT_802_LOW_LEVEL_Private_Variables LOW LEVEL Private Variables
|
|
* @{
|
|
*/
|
|
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
|
|
static uint32_t IsJoyMspCbValid = 0;
|
|
#endif
|
|
|
|
static ADC_HandleTypeDef hJoyHandle;
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/** @defgroup ADAFRUIT_802_LOW_LEVEL_Private_FunctionPrototypes LOW LEVEL Private FunctionPrototypes
|
|
* @{
|
|
*/
|
|
static void JOY1_MspInit(ADC_HandleTypeDef *hadc);
|
|
static void JOY1_MspDeInit(ADC_HandleTypeDef *hadc);
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/** @addtogroup ADAFRUIT_802_LOW_LEVEL_Exported_Functions
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @brief Configures the joystick.
|
|
* @param JOY Joystick to be initialized
|
|
* @param JoyMode Button mode.
|
|
* This parameter is not used as the ADC pin should be always configured
|
|
* in analog mode.
|
|
* @param JoyPins There are no physical pins but voltage levels
|
|
* @retval BSP status
|
|
*/
|
|
int32_t ADAFRUIT_802_JOY_Init(JOY_TypeDef JOY, JOYMode_TypeDef JoyMode, JOYPin_TypeDef JoyPins)
|
|
{
|
|
/* Prevent unused argument(s) compilation warning */
|
|
UNUSED(JoyPins);
|
|
UNUSED(JoyMode);
|
|
|
|
int32_t ret = BSP_ERROR_NONE;
|
|
|
|
if(JOY >= JOYn)
|
|
{
|
|
ret = BSP_ERROR_WRONG_PARAM;
|
|
}
|
|
else
|
|
{
|
|
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 0)
|
|
/* Init the UART Msp */
|
|
JOY1_MspInit(&hJoyHandle);
|
|
#else
|
|
if(IsJoyMspCbValid == 0U)
|
|
{
|
|
if(ADAFRUIT_802_JOY_RegisterDefaultMspCallbacks(JOY) != BSP_ERROR_NONE)
|
|
{
|
|
return BSP_ERROR_MSP_FAILURE;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
if(MX_ADAFRUIT_802_ADC_Init(&hJoyHandle) != HAL_OK)
|
|
{
|
|
ret = BSP_ERROR_PERIPH_FAILURE;
|
|
}
|
|
else
|
|
{
|
|
#if defined(ADC_CALFACT_CALFACT_S)
|
|
/* Run ADC calibration */
|
|
#if defined(ADC_CR_ADCALLIN)
|
|
if(HAL_ADCEx_Calibration_Start(&hJoyHandle, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK)
|
|
{
|
|
ret = BSP_ERROR_PERIPH_FAILURE;
|
|
}
|
|
else
|
|
{
|
|
if(HAL_ADCEx_Calibration_Start(&hJoyHandle, ADC_CALIB_OFFSET_LINEARITY, ADC_SINGLE_ENDED) != HAL_OK)
|
|
{
|
|
ret = BSP_ERROR_PERIPH_FAILURE;
|
|
}
|
|
}
|
|
#else
|
|
if(HAL_ADCEx_Calibration_Start(&hJoyHandle, ADC_SINGLE_ENDED) != HAL_OK)
|
|
{
|
|
ret = BSP_ERROR_PERIPH_FAILURE;
|
|
}
|
|
#endif
|
|
#endif /* defined(ADC_CALFACT_CALFACT_S) */
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* @brief DeInit joystick GPIOs.
|
|
* @param JOY Joystick to be de-initialized
|
|
* @param JoyPins There are no physical pins but voltage levels
|
|
* @retval BSP status
|
|
*/
|
|
int32_t ADAFRUIT_802_JOY_DeInit(JOY_TypeDef JOY, JOYPin_TypeDef JoyPins)
|
|
{
|
|
/* Prevent unused argument(s) compilation warning */
|
|
UNUSED(JoyPins);
|
|
|
|
int32_t ret = BSP_ERROR_NONE;
|
|
|
|
/* ADC configuration */
|
|
hJoyHandle.Instance = ADAFRUIT_802_ADCx;
|
|
|
|
if(JOY >= JOYn)
|
|
{
|
|
ret = BSP_ERROR_WRONG_PARAM;
|
|
}
|
|
else
|
|
{
|
|
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 0)
|
|
JOY1_MspDeInit(&hJoyHandle);
|
|
#endif /* (USE_HAL_UART_REGISTER_CALLBACKS == 0) */
|
|
|
|
if(HAL_ADC_DeInit(&hJoyHandle) != HAL_OK)
|
|
{
|
|
ret = BSP_ERROR_PERIPH_FAILURE;
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* @brief Returns the Joystick key pressed.
|
|
* @param JOY Joystick to get its pins' state
|
|
* @retval BSP error code if value is negative or one of the following values:
|
|
* - JOY_NONE : 3.3 V / 4095
|
|
* - JOY_SEL : 1.055 V / 1308
|
|
* - JOY_DOWN : 0.71 V / 88
|
|
* - JOY_LEFT : 3.0 V / 3720
|
|
* - JOY_RIGHT : 0.595 V / 737
|
|
* - JOY_UP : 1.65 V / 2046
|
|
*/
|
|
int32_t ADAFRUIT_802_JOY_GetState(JOY_TypeDef JOY)
|
|
{
|
|
int32_t ret;
|
|
uint32_t keyconvertedvalue;
|
|
|
|
if(JOY >= JOYn)
|
|
{
|
|
ret = BSP_ERROR_WRONG_PARAM;
|
|
}/* Start the conversion process */
|
|
else if(HAL_ADC_Start(&hJoyHandle) != HAL_OK)
|
|
{
|
|
ret = BSP_ERROR_PERIPH_FAILURE;
|
|
}/* Wait for the end of conversion */
|
|
else if(HAL_ADC_PollForConversion(&hJoyHandle, ADAFRUIT_802_ADCx_POLL_TIMEOUT) != HAL_OK)
|
|
{
|
|
ret = BSP_ERROR_PERIPH_FAILURE;
|
|
}/* Check if the continuous conversion of regular channel is finished */
|
|
else if((HAL_ADC_GetState(&hJoyHandle) & HAL_ADC_STATE_REG_EOC) != HAL_ADC_STATE_REG_EOC)
|
|
{
|
|
ret = BSP_ERROR_BUSY;
|
|
}
|
|
else
|
|
{
|
|
/* Get the converted value of regular channel */
|
|
keyconvertedvalue = HAL_ADC_GetValue(&hJoyHandle);
|
|
|
|
if((keyconvertedvalue > 2010U) && (keyconvertedvalue < 2500U))
|
|
{
|
|
ret = (int32_t)JOY_UP;
|
|
}
|
|
else if((keyconvertedvalue > 680U) && (keyconvertedvalue < 900U))
|
|
{
|
|
ret = (int32_t)JOY_RIGHT;
|
|
}
|
|
else if((keyconvertedvalue > 1270U) && (keyconvertedvalue < 1500U))
|
|
{
|
|
ret = (int32_t)JOY_SEL;
|
|
}
|
|
else if((keyconvertedvalue > 50U) && (keyconvertedvalue < 200U))
|
|
{
|
|
ret = (int32_t)JOY_DOWN;
|
|
}
|
|
else if((keyconvertedvalue > 3400U) && (keyconvertedvalue < 3760U))
|
|
{
|
|
ret = (int32_t)JOY_LEFT;
|
|
}
|
|
else
|
|
{
|
|
ret = (int32_t)JOY_NONE;
|
|
}
|
|
}
|
|
|
|
/* Return the code of the Joystick key pressed */
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* @brief Configures ADC peripheral
|
|
* @param hadc ADC handle
|
|
* @retval HAL error code
|
|
*/
|
|
__weak HAL_StatusTypeDef MX_ADAFRUIT_802_ADC_Init(ADC_HandleTypeDef *hadc)
|
|
{
|
|
HAL_StatusTypeDef ret = HAL_OK;
|
|
ADC_ChannelConfTypeDef sConfig;
|
|
|
|
/* ADC configuration */
|
|
hadc->Instance = ADAFRUIT_802_ADCx;
|
|
hadc->Init.ClockPrescaler = ADAFRUIT_802_ADCx_PRESCALER;
|
|
hadc->Init.Resolution = ADC_RESOLUTION_12B;
|
|
#if defined(ADC_CR2_ALIGN)
|
|
hadc->Init.DataAlign = ADC_DATAALIGN_RIGHT;
|
|
#endif
|
|
hadc->Init.ScanConvMode = (uint32_t)DISABLE;
|
|
#if defined(ADC_EOC_SINGLE_CONV)
|
|
hadc->Init.EOCSelection = ADC_EOC_SINGLE_CONV;
|
|
#endif
|
|
hadc->Init.ContinuousConvMode = DISABLE;
|
|
hadc->Init.NbrOfConversion = 1;
|
|
hadc->Init.DiscontinuousConvMode = DISABLE;
|
|
#if defined(ADC_CFGR_DISCNUM)
|
|
hadc->Init.NbrOfDiscConversion = 0;
|
|
#endif
|
|
hadc->Init.ExternalTrigConv = ADC_SOFTWARE_START;
|
|
hadc->Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
|
|
#if defined(ADC_CR2_DMA)
|
|
hadc->Init.DMAContinuousRequests = DISABLE;
|
|
#endif
|
|
#if defined(ADC_SMPR_SMP1) && defined(ADC_SMPR_SMP2)
|
|
hadc->Init.SamplingTimeCommon1 = ADC_SAMPLETIME_39CYCLES_5;
|
|
hadc->Init.SamplingTimeCommon2 = ADC_SAMPLETIME_39CYCLES_5;
|
|
#endif
|
|
#if defined(ADC_CFGR2_LFTRIG)
|
|
hadc->Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
|
|
#endif
|
|
|
|
if (HAL_ADC_Init(hadc) != HAL_OK)
|
|
{
|
|
ret = HAL_ERROR;
|
|
}
|
|
else
|
|
{
|
|
/**Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
|
|
*/
|
|
sConfig.Channel = ADAFRUIT_802_ADCx_CHANNEL;
|
|
sConfig.Rank = ADAFRUIT_802_ADCx_RANK;
|
|
sConfig.SamplingTime = ADAFRUIT_802_ADCx_SAMPLETIME;
|
|
#if defined(ADC_OFR1_OFFSET1)
|
|
sConfig.Offset = 0;
|
|
#endif
|
|
#if defined(ADC_SINGLE_ENDED)
|
|
sConfig.SingleDiff = ADC_SINGLE_ENDED;
|
|
#endif
|
|
#if defined(ADC_OFFSET_NONE)
|
|
sConfig.OffsetNumber = ADC_OFFSET_NONE;
|
|
#endif
|
|
if (HAL_ADC_ConfigChannel(hadc, &sConfig) != HAL_OK)
|
|
{
|
|
ret = HAL_ERROR;
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
|
|
/**
|
|
* @brief Register Default ADCx Bus Msp Callbacks
|
|
* @param JOY Joystick to be configured.
|
|
* This parameter can be JOY1
|
|
* @retval BSP status
|
|
*/
|
|
int32_t ADAFRUIT_802_JOY_RegisterDefaultMspCallbacks(JOY_TypeDef JOY)
|
|
{
|
|
int32_t ret = BSP_ERROR_NONE;
|
|
|
|
if(JOY >= JOYn)
|
|
{
|
|
ret = BSP_ERROR_WRONG_PARAM;
|
|
}
|
|
else
|
|
{
|
|
__HAL_ADC_RESET_HANDLE_STATE(&hJoyHandle);
|
|
|
|
/* Register default MspInit/MspDeInit Callback */
|
|
if(HAL_ADC_RegisterCallback(&hJoyHandle, HAL_ADC_MSPINIT_CB_ID, JOY1_MspInit) != HAL_OK)
|
|
{
|
|
ret = BSP_ERROR_PERIPH_FAILURE;
|
|
}
|
|
else if(HAL_ADC_RegisterCallback(&hJoyHandle, HAL_ADC_MSPDEINIT_CB_ID, JOY1_MspDeInit) != HAL_OK)
|
|
{
|
|
ret = BSP_ERROR_PERIPH_FAILURE;
|
|
}
|
|
else
|
|
{
|
|
IsJoyMspCbValid = 1U;
|
|
}
|
|
}
|
|
|
|
/* BSP status */
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* @brief Register ADCx Bus Msp Callback registering
|
|
* @param JOY Joystick to be configured.
|
|
* This parameter can be JOY1
|
|
* @param Callbacks pointer to ADCx MspInit/MspDeInit callback functions
|
|
* @retval BSP status
|
|
*/
|
|
int32_t ADAFRUIT_802_JOY_RegisterMspCallbacks(JOY_TypeDef JOY, ADAFRUIT_802_JOY_Cb_t *Callback)
|
|
{
|
|
int32_t ret = BSP_ERROR_NONE;
|
|
|
|
if(JOY >= JOYn)
|
|
{
|
|
ret = BSP_ERROR_WRONG_PARAM;
|
|
}
|
|
else
|
|
{
|
|
__HAL_ADC_RESET_HANDLE_STATE(&hJoyHandle);
|
|
|
|
/* Register MspInit/MspDeInit Callbacks */
|
|
if(HAL_ADC_RegisterCallback(&hJoyHandle, HAL_ADC_MSPINIT_CB_ID, Callback->pMspInitCb) != HAL_OK)
|
|
{
|
|
ret = BSP_ERROR_PERIPH_FAILURE;
|
|
}
|
|
else if(HAL_ADC_RegisterCallback(&hJoyHandle, HAL_ADC_MSPDEINIT_CB_ID, Callback->pMspDeInitCb) != HAL_OK)
|
|
{
|
|
ret = BSP_ERROR_PERIPH_FAILURE;
|
|
}
|
|
else
|
|
{
|
|
IsJoyMspCbValid = 1U;
|
|
}
|
|
}
|
|
|
|
/* BSP status */
|
|
return ret;
|
|
}
|
|
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/** @defgroup ADAFRUIT_802_LOW_LEVEL_Private_Functions LOW LEVEL Private Functions
|
|
* @{
|
|
*/
|
|
/**
|
|
* @brief Initializes ADC MSP.
|
|
* @param hadc ADC handle
|
|
* @retval None
|
|
*/
|
|
static void JOY1_MspInit(ADC_HandleTypeDef *hadc)
|
|
{
|
|
GPIO_InitTypeDef GPIO_InitStruct;
|
|
#if defined (RCC_ADCCLKSOURCE_SYSCLK) || defined (RCC_ADC12CLKSOURCE_SYSCLK)
|
|
RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct;
|
|
#endif
|
|
|
|
/* Prevent unused argument(s) compilation warning */
|
|
UNUSED(hadc);
|
|
|
|
/*** Configure the GPIOs ***/
|
|
/* Enable GPIO clock */
|
|
ADAFRUIT_802_ADCx_GPIO_CLK_ENABLE();
|
|
|
|
/* Configure the selected ADC Channel as analog input */
|
|
GPIO_InitStruct.Pin = ADAFRUIT_802_ADCx_GPIO_PIN;
|
|
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
|
|
#if defined (RCC_ADCCLKSOURCE_SYSCLK) || defined (RCC_ADC12CLKSOURCE_SYSCLK)
|
|
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
|
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
|
#endif
|
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|
HAL_GPIO_Init(ADAFRUIT_802_ADCx_GPIO_PORT, &GPIO_InitStruct);
|
|
|
|
/*** Configure the ADC peripheral ***/
|
|
/* Enable ADC clock */
|
|
ADAFRUIT_802_ADCx_CLK_ENABLE();
|
|
|
|
#if defined (RCC_ADCCLKSOURCE_SYSCLK)
|
|
/* Configure SYSCLK as source clock for ADC */
|
|
RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADC;
|
|
RCC_PeriphCLKInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_SYSCLK;
|
|
HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);
|
|
#elif defined (RCC_ADC12CLKSOURCE_SYSCLK)
|
|
RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADC12;
|
|
RCC_PeriphCLKInitStruct.Adc12ClockSelection = RCC_ADC12CLKSOURCE_SYSCLK;
|
|
HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);
|
|
#endif
|
|
}
|
|
|
|
/**
|
|
* @brief DeInitializes ADC MSP.
|
|
* @param hadc ADC handle
|
|
* @note ADC DeInit does not disable the GPIO clock
|
|
* @retval None
|
|
*/
|
|
static void JOY1_MspDeInit(ADC_HandleTypeDef *hadc)
|
|
{
|
|
GPIO_InitTypeDef GPIO_InitStruct;
|
|
|
|
/* Prevent unused argument(s) compilation warning */
|
|
UNUSED(hadc);
|
|
|
|
/*** DeInit the ADC peripheral ***/
|
|
/* Disable ADC clock */
|
|
ADAFRUIT_802_ADCx_CLK_DISABLE();
|
|
|
|
/* Configure the selected ADC Channel as analog input */
|
|
GPIO_InitStruct.Pin = ADAFRUIT_802_ADCx_GPIO_PIN ;
|
|
HAL_GPIO_DeInit(ADAFRUIT_802_ADCx_GPIO_PORT, GPIO_InitStruct.Pin);
|
|
}
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|