Skip to content

Commit eaffbac

Browse files
yn386dpgeorge
authored andcommitted
stm32/machine_adc: Add machine.ADC implementation for STM32L1.
Signed-off-by: Yuuki NAGAO <wf.yn386@gmail.com>
1 parent 42cfa7c commit eaffbac

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

ports/stm32/adc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ static void adc_config_channel(ADC_HandleTypeDef *adc_handle, uint32_t channel)
416416
if (__HAL_ADC_IS_CHANNEL_INTERNAL(channel)) {
417417
sConfig.SamplingTime = ADC_SAMPLETIME_384CYCLES;
418418
} else {
419-
sConfig.SamplingTime = ADC_SAMPLETIME_384CYCLES;
419+
sConfig.SamplingTime = ADC_SAMPLETIME_16CYCLES;
420420
}
421421
#elif defined(STM32G0)
422422
if (__HAL_ADC_IS_CHANNEL_INTERNAL(channel)) {

ports/stm32/machine_adc.c

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@
8080
#define ADC_SAMPLETIME_DEFAULT ADC_SAMPLETIME_12CYCLES_5
8181
#define ADC_SAMPLETIME_DEFAULT_INT ADC_SAMPLETIME_160CYCLES_5
8282
#elif defined(STM32L1)
83-
#define ADC_SAMPLETIME_DEFAULT ADC_SAMPLETIME_384CYCLES
83+
#define ADC_SAMPLETIME_DEFAULT ADC_SAMPLETIME_16CYCLES
8484
#define ADC_SAMPLETIME_DEFAULT_INT ADC_SAMPLETIME_384CYCLES
8585
#elif defined(STM32L4) || defined(STM32WB)
8686
#define ADC_SAMPLETIME_DEFAULT ADC_SAMPLETIME_12CYCLES_5
@@ -225,6 +225,8 @@ void adc_config(ADC_TypeDef *adc, uint32_t bits) {
225225
ADC3_COMMON->CCR = 3 << ADC_CCR_CKMODE_Pos;
226226
#elif defined(STM32L0)
227227
ADC1_COMMON->CCR = 0; // ADCPR=PCLK/2
228+
#elif defined(STM32L1)
229+
ADC1_COMMON->CCR = 1 << ADC_CCR_ADCPRE_Pos; // ADCPRE=2
228230
#elif defined(STM32WB)
229231
ADC1_COMMON->CCR = 0 << ADC_CCR_PRESC_Pos | 0 << ADC_CCR_CKMODE_Pos; // PRESC=1, MODE=ASYNC
230232
#elif defined(STM32WL)
@@ -385,6 +387,31 @@ static void adc_config_channel(ADC_TypeDef *adc, uint32_t channel, uint32_t samp
385387
}
386388
*smpr = (*smpr & ~(7 << (channel * 3))) | sample_time << (channel * 3); // select sample time
387389

390+
#elif defined(STM32L1)
391+
392+
ADC_Common_TypeDef *adc_common = ADC1_COMMON;
393+
if (channel == ADC_CHANNEL_VREFINT || channel == ADC_CHANNEL_TEMPSENSOR) {
394+
adc_common->CCR |= ADC_CCR_TSVREFE;
395+
if (channel == ADC_CHANNEL_TEMPSENSOR) {
396+
adc_stabilisation_delay_us(ADC_TEMPSENSOR_DELAY_US);
397+
}
398+
}
399+
400+
adc->SQR1 = (1 - 1) << ADC_SQR1_L_Pos;
401+
adc->SQR5 = (channel & 0x1f) << ADC_SQR5_SQ1_Pos;
402+
403+
__IO uint32_t *smpr;
404+
if (channel >= 20) {
405+
smpr = &adc->SMPR1;
406+
channel -= 20;
407+
} else if (channel >= 10) {
408+
smpr = &adc->SMPR2;
409+
channel -= 10;
410+
} else {
411+
smpr = &adc->SMPR3;
412+
}
413+
*smpr = (*smpr & ~(7 << (channel * 3))) | sample_time << (channel * 3); // select sample time
414+
388415
#elif defined(STM32G4) || defined(STM32H5) || defined(STM32H7) || defined(STM32L4) || defined(STM32WB)
389416

390417
#if defined(STM32G4) || defined(STM32H5) || defined(STM32H7A3xx) || defined(STM32H7A3xxQ) || defined(STM32H7B3xx) || defined(STM32H7B3xxQ)

0 commit comments

Comments
 (0)