NorthStar-Endurance-TestBench/EnduranceTestBench/nms_hal/hal_adc.c

268 lines
7.3 KiB
C

/**
* @file hal_adc.c
* @copyright Nehemis SARL reserves all rights even in the event of industrial
* property rights. We reserve all rights of disposal such as
* copying and passing on to third parties.
*
* @brief STM HAL layer wrapper class for ADC.
*
*/
/******************************************************************************
* Include Header Files
******************************************************************************/
#include "hal_adc.h"
/* CubeMX */
#include "adc.h"
/******************************************************************************
* Macro Constant Declarations
******************************************************************************/
#define HAL_ADC_TIMEOUT 10u /* in milliseconds */
/******************************************************************************
* Module Global Variable Declarations
******************************************************************************/
static uint32 (*halAdcCallbacks[MAP_HAL_ADC_NUMBER])(void);
/******************************************************************************
* Extern Function Definitions
******************************************************************************/
void HalAdcCalibrate(MapHalAdcModule_en module_en)
{
uint32 error_u32 = NMS_ERR_DEFAULT;
ADC_HandleTypeDef *targetModule_pst;
error_u32 = MapHalAdcModule(module_en, &targetModule_pst);
if (error_u32 == NMS_ERR_NONE)
{
HAL_ADCEx_Calibration_Start(targetModule_pst, ADC_SINGLE_ENDED);
}
else
{
/* Handle error */
}
}
uint32 HalAdcStart(MapHalAdcModule_en module_en)
{
uint32 error_u32 = NMS_ERR_NONE;
HAL_StatusTypeDef halAdcStatus_en = HAL_OK;
ADC_HandleTypeDef *targetModule_pst;
error_u32 = MapHalAdcModule(module_en, &targetModule_pst);
if (error_u32 == NMS_ERR_NONE)
{
/* Start the ADC conversion */
halAdcStatus_en = HAL_ADC_Start(targetModule_pst);
switch (halAdcStatus_en)
{
case HAL_BUSY: error_u32 = NMS_ERR_BUSY; break;
case HAL_TIMEOUT: error_u32 = NMS_ERR_TIMEOUT; break;
case HAL_ERROR: error_u32 = NMS_ERR_INTERNAL; break;
case HAL_OK: error_u32 = NMS_ERR_NONE; break;
default: error_u32 = NMS_ERR_UNKNOWN; break;
}
}
return error_u32;
}
uint32 HalAdcRead(MapHalAdcModule_en module_en, uint32 *adcValue_pu32)
{
uint32 error_u32 = NMS_ERR_NONE;
HAL_StatusTypeDef halAdcStatus_en = HAL_OK;
ADC_HandleTypeDef *targetModule_pst;
error_u32 = MapHalAdcModule(module_en, &targetModule_pst);
if (error_u32 == NMS_ERR_NONE)
{
halAdcStatus_en = HAL_ADC_PollForConversion(targetModule_pst, HAL_ADC_TIMEOUT);
if (halAdcStatus_en == HAL_OK)
{
*adcValue_pu32 = HAL_ADC_GetValue(targetModule_pst);
return NMS_ERR_NONE;
}
else
{
return NMS_ERR_UNKNOWN;
}
}
return error_u32;
}
uint32 HalAdcStop(MapHalAdcModule_en module_en)
{
uint32 error_u32 = NMS_ERR_NONE;
HAL_StatusTypeDef halAdcStatus_en = HAL_OK;
ADC_HandleTypeDef * targetModule_pst;
error_u32 = MapHalAdcModule(module_en, &targetModule_pst);
if(error_u32 == NMS_ERR_NONE)
{
halAdcStatus_en = HAL_ADC_Stop(targetModule_pst);
switch(halAdcStatus_en)
{
case HAL_BUSY: error_u32 = NMS_ERR_BUSY; break;
case HAL_TIMEOUT: error_u32 = NMS_ERR_TIMEOUT; break;
case HAL_ERROR: error_u32 = NMS_ERR_INTERNAL; break;
case HAL_OK: error_u32 = NMS_ERR_NONE; break;
default: error_u32 = NMS_ERR_UNKNOWN; break;
}
}
return error_u32;
}
uint32 HalAdcStartDMA(MapHalAdcModule_en module_en, uint32 * pData_u32, uint32 length_u32)
{
uint32 error_u32 = NMS_ERR_NONE;
HAL_StatusTypeDef halAdcStatus_en = HAL_OK;
ADC_HandleTypeDef * targetModule_pst;
error_u32 = MapHalAdcModule(module_en, &targetModule_pst);
if(error_u32 == NMS_ERR_NONE)
{
halAdcStatus_en = HAL_ADC_Start_DMA(targetModule_pst, pData_u32, length_u32);
switch(halAdcStatus_en)
{
case HAL_BUSY: error_u32 = NMS_ERR_BUSY; break;
case HAL_TIMEOUT: error_u32 = NMS_ERR_TIMEOUT; break;
case HAL_ERROR: error_u32 = NMS_ERR_INTERNAL; break;
case HAL_OK: error_u32 = NMS_ERR_NONE; break;
default: error_u32 = NMS_ERR_UNKNOWN; break;
}
}
return error_u32;
}
uint32 HalAdcConfigureCallback(MapHalAdcModule_en adcModule_en, uint32 (*callback_pfn)(void))
{
uint32 error_u32 = NMS_ERR_DEFAULT;
if (adcModule_en < MAP_HAL_ADC_NUMBER )
{
halAdcCallbacks[adcModule_en] = callback_pfn;
error_u32 = NMS_ERR_NONE;
}
else
{
error_u32 = NMS_ERR_UNKNOWN;
}
return error_u32;
}
void HalAdcDeinit(MapHalAdcModule_en adcModule_en)
{
uint32 error_u32 = NMS_ERR_DEFAULT;
ADC_HandleTypeDef * targetModule_pst;
uint8 index_u8;
uint8 startIndex_u8;
uint8 iteration_u8 = 1u; /* Default to 1 loop iteration (deinit one module) */
if(adcModule_en == MAP_HAL_ADC_NUMBER)
{
iteration_u8 = adcModule_en;
startIndex_u8 = 0u;
}
else
{
iteration_u8 += adcModule_en;
startIndex_u8 = adcModule_en;
}
for(index_u8 = startIndex_u8; index_u8 < iteration_u8; index_u8++)
{
error_u32 = MapHalAdcModule((MapHalAdcModule_en)index_u8, &targetModule_pst);
if(error_u32 == NMS_ERR_NONE)
{
HAL_ADC_DeInit(targetModule_pst);
}
}
}
/******************************************************************************
* Callback Function Definitions
******************************************************************************/
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
uint32 error_u32 = NMS_ERR_DEFAULT;
MapHalAdcModule_en adcModule_en;
error_u32 = MapHalAdcCallback(MAP_HAL_ADC_1, &adcModule_en);
if (error_u32 == NMS_ERR_NONE)
{
if (adcModule_en < MAP_HAL_ADC_NUMBER)
{
if (halAdcCallbacks[adcModule_en] != NULL)
{
halAdcCallbacks[adcModule_en]();
}
else
{
error_u32 = NMS_ERR_UNKNOWN;
}
}
else
{
error_u32 = NMS_ERR_INVALID_MODULE;
}
}
else
{
error_u32 = NMS_ERR_UNKNOWN;
}
}
void HAL_ADC_ErrorCallback(ADC_HandleTypeDef* hadc)
{
uint32 error_u32 = NMS_ERR_DEFAULT;
ADC_HandleTypeDef *targetModule_pst = NULL;
error_u32 = MapHalAdcModule(MAP_HAL_ADC_1, &targetModule_pst);
if(error_u32 == NMS_ERR_NONE)
{
switch(hadc->State)
{
case HAL_ADC_STATE_RESET:
error_u32 = NMS_ERR_UNKNOWN;
break;
case HAL_ADC_STATE_BUSY:
error_u32 = NMS_ERR_BUSY;
break;
case HAL_ADC_STATE_TIMEOUT:
error_u32 = NMS_ERR_TIMEOUT;
break;
case HAL_ADC_STATE_ERROR:
error_u32 = NMS_ERR_BUSY;
break;
case HAL_ADC_STATE_READY:
error_u32 = NMS_ERR_NOT_RUNNING;
break;
default:
error_u32 = NMS_ERR_UNKNOWN;
break;
}
}
else
{
error_u32 = NMS_ERR_UNKNOWN;
}
}