17#ifndef FSL_COMPONENT_ID
18#define FSL_COMPONENT_ID "platform.drivers.adc12"
22#define ADC12_TRANSFORM_CALIBRATION_RESULT(resultValue, bitWidth) \
23 (((resultValue) >= (1 << ((bitWidth)-1))) ? ((resultValue) - (1 << (bitWidth))) : (resultValue));
66#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
96 int32_t OFS = (int32_t)((base->OFS & ADC_OFS_OFS_MASK) >> ADC_OFS_OFS_SHIFT);
97 int32_t CLP9 = (int32_t)((base->CLP9 & ADC_CLP9_CLP9_MASK) >> ADC_CLP9_CLP9_SHIFT);
98 int32_t CLPX = (int32_t)((base->CLPX & ADC_CLPX_CLPX_MASK) >> ADC_CLPX_CLPX_SHIFT);
99 uint32_t CLPS = ((base->CLPS & ADC_CLPS_CLPS_MASK) >> ADC_CLPS_CLPS_SHIFT);
100 uint32_t CLP0 = ((base->CLP0 & ADC_CLP0_CLP0_MASK) >> ADC_CLP0_CLP0_SHIFT);
101 uint32_t CLP1 = ((base->CLP1 & ADC_CLP1_CLP1_MASK) >> ADC_CLP1_CLP1_SHIFT);
102 uint32_t CLP2 = ((base->CLP2 & ADC_CLP2_CLP2_MASK) >> ADC_CLP2_CLP2_SHIFT);
103 uint32_t CLP3 = ((base->CLP3 & ADC_CLP3_CLP3_MASK) >> ADC_CLP3_CLP3_SHIFT);
104 uint32_t Typ1 = (CLP0 + CLP0);
105 uint32_t Typ2 = (CLP1 + CLP1 - 26U);
106 uint32_t Typ3 = (CLP2 + CLP2);
110 OFS = ADC12_TRANSFORM_CALIBRATION_RESULT(OFS, 16);
111 CLP9 = ADC12_TRANSFORM_CALIBRATION_RESULT(CLP9, 7);
112 CLPX = ADC12_TRANSFORM_CALIBRATION_RESULT(CLPX, 7);
116 if ((OFS < -48) || (OFS > 22) || (CLP9 < -12) || (CLP9 > 20) || (CLPX < -16) || (CLPX > 16) || (CLPS < 30U) ||
117 (CLPS > 120U) || (CLP0 < (CLPS - 14U)) || (CLP0 > (CLPS + 14U)) || (CLP1 < (Typ1 - 16U)) ||
118 (CLP1 > (Typ1 + 16U)) || (CLP2 < (Typ2 - 20U)) || (CLP2 > (Typ2 + 20U)) || (CLP3 < (Typ3 - 36U)) ||
119 (CLP3 > (Typ3 + 36U)))
139#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
145 tmp32 = (base->CFG1 & ~(ADC_CFG1_ADICLK_MASK | ADC_CFG1_ADIV_MASK | ADC_CFG1_MODE_MASK));
146 tmp32 |= (ADC_CFG1_ADICLK(
config->clockSource) | ADC_CFG1_ADIV(
config->clockDivider) |
147 ADC_CFG1_MODE(
config->resolution));
151 tmp32 = (base->CFG2 & ~ADC_CFG2_SMPLTS_MASK);
152 tmp32 |= ADC_CFG2_SMPLTS(
config->sampleClockCount - 1U);
156 tmp32 = (base->SC2 & ~ADC_SC2_REFSEL_MASK);
157 tmp32 |= ADC_SC2_REFSEL(
config->referenceVoltageSource);
161 tmp32 = (base->SC3 & ~ADC_SC3_ADCO_MASK);
162 if (
true ==
config->enableContinuousConversion)
164 tmp32 |= ADC_SC3_ADCO_MASK;
176#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
209 config->sampleClockCount = 13U;
210 config->enableContinuousConversion =
false;
239 assert(channelGroup < ADC_SC1_COUNT);
245 tmp32 = (base->SC1[channelGroup] & ~(ADC_SC1_ADCH_MASK | ADC_SC1_AIEN_MASK));
246 tmp32 |= ADC_SC1_ADCH(
config->channelNumber);
247 if (
true ==
config->enableInterruptOnConversionCompleted)
249 tmp32 |= ADC_SC1_AIEN_MASK;
251 base->SC1[channelGroup] = tmp32;
264 assert(channelGroup < ADC_SC1_COUNT);
266 uint32_t tmp32 = base->SC1[channelGroup];
267 uint32_t result = 0U;
270 if (ADC_SC1_COCO_MASK == (tmp32 & ADC_SC1_COCO_MASK))
294 bool enabledHardwareTrigger =
false;
295 bool enabledHardwareAverage =
false;
296 uint32_t averageMode;
302 saveCFG1 = base->CFG1;
304 base->CFG1 |= ADC_CFG1_ADIV(1);
308 if (ADC_SC2_ADTRG_MASK == (tmp32 & ADC_SC2_ADTRG_MASK))
310 enabledHardwareTrigger =
true;
311 tmp32 &= ~ADC_SC2_ADTRG_MASK;
316 averageMode = ((tmp32 & ADC_SC3_AVGS_MASK) >> ADC_SC3_AVGS_SHIFT);
317 if (ADC_SC3_AVGE_MASK == (tmp32 & ADC_SC3_AVGE_MASK))
319 enabledHardwareAverage =
true;
321 tmp32 &= ~ADC_SC3_AVGS_MASK;
322 tmp32 |= (ADC_SC3_AVGE_MASK | ADC_SC3_AVGS(ADC_SC3_AVGS_MASK >> ADC_SC3_AVGS_SHIFT));
325 tmp32 |= ADC_SC3_CAL_MASK;
340 if (
true == enabledHardwareTrigger)
342 base->SC2 |= ADC_SC2_ADTRG_MASK;
346 if (
false == enabledHardwareAverage)
348 tmp32 &= ~ADC_SC3_AVGE_MASK;
350 tmp32 |= ADC_SC3_AVGS(averageMode);
354 base->CFG1 = saveCFG1;
376 base->SC2 &= ~(ADC_SC2_ACFE_MASK | ADC_SC2_ACFGT_MASK | ADC_SC2_ACREN_MASK);
381 tmp32 = (base->SC2 & ~(ADC_SC2_ACFE_MASK | ADC_SC2_ACFGT_MASK | ADC_SC2_ACREN_MASK));
382 switch (
config->hardwareCompareMode)
387 tmp32 |= ADC_SC2_ACFGT_MASK;
390 tmp32 |= ADC_SC2_ACREN_MASK;
393 tmp32 |= (ADC_SC2_ACFGT_MASK | ADC_SC2_ACREN_MASK);
398 tmp32 |= ADC_SC2_ACFE_MASK;
402 base->CV1 =
config->value1;
403 base->CV2 =
config->value2;
418 uint32_t tmp32 = base->SC3;
421 tmp32 &= ~(ADC_SC3_AVGS_MASK | ADC_SC3_AVGE_MASK);
428 tmp32 |= (ADC_SC3_AVGS(mode) | ADC_SC3_AVGE_MASK);
450 if (ADC_SC2_ADACT_MASK == (base->SC2 & ADC_SC2_ADACT_MASK))
static BenchController instance
static constexpr persistent_config_s * config
static uint32_t ADC12_GetInstance(ADC_Type *base)
Get instance number for ADC12 module.
static ADC_Type *const s_adc12Bases[]
Pointers to ADC12 bases for each instance.
static const clock_ip_name_t s_adc12Clocks[]
Pointers to ADC12 clocks for each instance.
static status_t ADC12_GetCalibrationStatus(ADC_Type *base)
Check calibration failed status.
status_t ADC12_DoAutoCalibration(ADC_Type *base)
Automate the hardware calibration.
uint32_t ADC12_GetChannelStatusFlags(ADC_Type *base, uint32_t channelGroup)
Get the status flags of channel.
uint32_t ADC12_GetStatusFlags(ADC_Type *base)
Get the status flags of the converter.
void ADC12_SetChannelConfig(ADC_Type *base, uint32_t channelGroup, const adc12_channel_config_t *config)
Configure the conversion channel.
void ADC12_SetHardwareCompareConfig(ADC_Type *base, const adc12_hardware_compare_config_t *config)
Configure the hardware compare mode.
static uint32_t ADC12_GetChannelConversionValue(ADC_Type *base, uint32_t channelGroup)
Get the conversion value.
void ADC12_SetHardwareAverage(ADC_Type *base, adc12_hardware_average_mode_t mode)
Set the hardware average mode.
void ADC12_GetDefaultConfig(adc12_config_t *config)
Gets an available pre-defined settings for converter's configuration.
void ADC12_Deinit(ADC_Type *base)
De-initialize the ADC12 module.
void ADC12_Init(ADC_Type *base, const adc12_config_t *config)
Initialize the ADC12 module.
enum _adc12_hardware_average_mode adc12_hardware_average_mode_t
Hardware average mode.
@ kADC12_ChannelConversionCompletedFlag
@ kADC12_ReferenceVoltageSourceVref
@ kADC12_CalibrationFailedFlag
@ kADC12_HardwareCompareMode0
@ kADC12_HardwareCompareMode2
@ kADC12_HardwareCompareMode3
@ kADC12_HardwareCompareMode1
@ kADC12_HardwareAverageDisabled
@ kADC12_HardwareAverageCount32
@ kADC12_HardwareAverageCount4
@ kADC12_HardwareAverageCount16
@ kADC12_HardwareAverageCount8
enum _clock_ip_name clock_ip_name_t
Peripheral clock name difinition used for clock gate, clock source and clock divider setting....
static void CLOCK_DisableClock(clock_ip_name_t name)
Disable the clock for specific IP.
static void CLOCK_EnableClock(clock_ip_name_t name)
Enable the clock for specific IP.
int32_t status_t
Type used for all status and error return values.
Channel conversion configuration.
Hardware compare configuration.