28#if HAL_USE_ADC || defined(__DOXYGEN__)
36#define ADC_CHANNEL_MASK 0x1f
43#if KINETIS_ADC_USE_ADC0 || defined(__DOXYGEN__)
48#if KINETIS_ADC_USE_ADC1 || defined(__DOXYGEN__)
53#if KINETIS_ADC_USE_ADC2 || defined(__DOXYGEN__)
71 adcp->adc->CFG1 = ADCx_CFG1_ADIV(ADCx_CFG1_ADIV_DIV_8) |
72 ADCx_CFG1_ADICLK(ADCx_CFG1_ADIVCLK_BUS_CLOCK_DIV_2);
78 adcp->adc->SC3 = ADCx_SC3_AVGE |
79 ADCx_SC3_AVGS(ADCx_SC3_AVGS_AVERAGE_32_SAMPLES) |
84 while (!(adcp->adc->SC1A & ADCx_SC1n_COCO))
87 uint16_t gain = ((adcp->adc->CLP0 + adcp->adc->CLP1 + adcp->adc->CLP2 +
88 adcp->adc->CLP3 + adcp->adc->CLP4 + adcp->adc->CLPS) / 2) | 0x8000;
91 gain = ((adcp->adc->CLM0 + adcp->adc->CLM1 + adcp->adc->CLM2 +
92 adcp->adc->CLM3 + adcp->adc->CLM4 + adcp->adc->CLMS) / 2) | 0x8000;
109 adcp->adc12ChannelCfg.channelNumber = ADCx_SC1n_ADCH_DISABLED;
110 adcp->adc12ChannelCfg.enableInterruptOnConversionCompleted =
false;
116 adcp->adc->SC1A = ADCx_SC1n_ADCH(ADCx_SC1n_ADCH_DISABLED);
119 adcp->samples[adcp->current_index++] = adcp->adc->RA;
125 if (adcp->current_index == adcp->number_of_samples) {
127 more = adcp->grpp->circular;
129 _adc_isr_full_code(adcp);
131 adcp->current_index = 0;
138 if (adcp->grpp->circular &&
139 (adcp->current_index == (adcp->number_of_samples / 2))) {
141 _adc_isr_half_code(adcp);
145 adcp->current_channel = (adcp->current_channel + 1) % adcp->grpp->num_channels;
146 adcp->adc12ChannelCfg.channelNumber = adcp->channelIndices[adcp->current_channel];
147 adcp->adc12ChannelCfg.enableInterruptOnConversionCompleted =
true;
153 adcp->current_channel = (adcp->current_channel + 1) & ADC_CHANNEL_MASK;
154 }
while (((1 << adcp->current_channel) & adcp->channel_mask) == 0);
157 adcp->adc->SC1A = ADCx_SC1n_AIEN | ADCx_SC1n_ADCH(adcp->current_channel);
162#if KINETIS_ADC_USE_ADC0 || defined(__DOXYGEN__)
170#if KINETIS_ADC_USE_ADC1 || defined(__DOXYGEN__)
178#if KINETIS_ADC_USE_ADC2 || defined(__DOXYGEN__)
197#if KINETIS_ADC_USE_ADC0
199 adcObjectInit(&
ADCD1);
202 nvicEnableVector(ADC0_IRQn, KINETIS_ADC_IRQ_PRIORITY);
205#if KINETIS_ADC_USE_ADC1
207 adcObjectInit(&
ADCD2);
210 nvicEnableVector(ADC1_IRQn, KINETIS_ADC_IRQ_PRIORITY);
213#if KINETIS_ADC_USE_ADC2
215 adcObjectInit(&
ADCD3);
218 nvicEnableVector(ADC2_IRQn, KINETIS_ADC_IRQ_PRIORITY);
233 if (adcp->state == ADC_STOP) {
234#if KINETIS_ADC_USE_ADC0
235 if (&
ADCD1 == adcp) {
237 SIM->SCGC6 |= SIM_SCGC6_ADC0;
243#if KINETIS_ADC_USE_ADC1
244 if (&
ADCD2 == adcp) {
246 SIM->SCGC6 |= SIM_SCGC6_ADC1;
252#if KINETIS_ADC_USE_ADC2
253 if (&
ADCD3 == adcp) {
255 SIM->SCGC6 |= SIM_SCGC6_ADC2;
263 adcp->channelGroup = 0;
264 adcp->adc12ChannelCfg.channelNumber = 0;
265 adcp->adc12ChannelCfg.enableInterruptOnConversionCompleted =
true;
271 adcp->channel_mask = adcp->grpp->channel_mask;
274 if (adcp->config->calibrate) {
291 if (adcp->state == ADC_READY) {
295 SIM->SCGC6 &= ~SIM_SCGC6_ADC0;
297 adcp->adc->SC1A = ADCx_SC1n_ADCH(ADCx_SC1n_ADCH_DISABLED);
310 const ADCConversionGroup *grpp = adcp->grpp;
315 adcp->channelIndices[0] = ADCx_SC1n_ADCH_DISABLED;
316 for (chn = 0; chn < grpp->num_channels; chn++) {
324 adcp->channelIndices[chn] = (grpp->sqr3 >> (chn * 5)) & 31;
325 }
else if (chn < 12) {
326 adcp->channelIndices[chn] = (grpp->sqr2 >> ((chn - 6) * 5)) & 31;
328 adcp->channelIndices[chn] = (grpp->sqr1 >> ((chn - 12) * 5)) & 31;
332 bool hw = (grpp->cr2 & ADC_CR2_SWSTART) ?
false :
true;
338 if (adcp->channel_mask & ADC_BANDGAP) {
339 PMC->REGSC |= PMC_REGSC_BGBE;
343 adcp->number_of_samples = adcp->depth * grpp->num_channels;
344 adcp->current_index = 0;
347 adcp->current_channel = 0;
349 adcp->adc12ChannelCfg.channelNumber = adcp->channelIndices[adcp->current_channel];
350 adcp->adc12ChannelCfg.enableInterruptOnConversionCompleted =
true;
353 while (((1 << adcp->current_channel) & adcp->channel_mask) == 0) {
354 adcp->current_channel = (adcp->current_channel + 1) & ADC_CHANNEL_MASK;
358 adcp->adc->CFG1 = grpp->cfg1;
361 adcp->adc->SC3 = grpp->sc3;
364 adcp->adc->SC1A = ADCx_SC1n_AIEN | ADCx_SC1n_ADCH(adcp->current_channel);
377 const ADCConversionGroup *grpp = adcp->grpp;
379 if (adcp->channel_mask & ADC_BANDGAP) {
381 PMC->REGSC &= ~(PMC_REGSC_BGBE | PMC_REGSC_ACKISO);
ADCDriver ADCD3
ADC3 driver identifier.
void adc_lld_stop_conversion(ADCDriver *adcp)
Stops an ongoing conversion.
void adc_lld_init(void)
Low level ADC driver initialization.
ADCDriver ADCD2
ADC2 driver identifier.
void adc_lld_start_conversion(ADCDriver *adcp)
Starts an ADC conversion.
void adc_lld_stop(ADCDriver *adcp)
Deactivates the ADC peripheral.
void adc_lld_start(ADCDriver *adcp)
Configures and activates the ADC peripheral.
OSAL_IRQ_HANDLER(KINETIS_ADC0_IRQ_VECTOR)
static void calibrate(ADCDriver *adcp)
ADCDriver ADCD1
ADC1 driver identifier.
static void adc_lld_irq_handler(ADCDriver *adcp)
ADC interrupt handler.
static void ADC12_EnableHardwareTrigger(ADC_Type *base, bool enable)
Enable of disable the hardware trigger mode.
status_t ADC12_DoAutoCalibration(ADC_Type *base)
Automate the hardware calibration.
void ADC12_SetChannelConfig(ADC_Type *base, uint32_t channelGroup, const adc12_channel_config_t *config)
Configure the conversion channel.
static uint32_t ADC12_GetChannelConversionValue(ADC_Type *base, uint32_t channelGroup)
Get the conversion value.
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.