stm32/machine_adc: Add machine.ADC implementation for STM32L1.

Signed-off-by: Yuuki NAGAO <wf.yn386@gmail.com>
This commit is contained in:
Yuuki NAGAO 2025-07-03 20:47:00 +09:00 committed by Damien George
parent 42cfa7cdae
commit eaffbacb10
2 changed files with 29 additions and 2 deletions

View file

@ -416,7 +416,7 @@ static void adc_config_channel(ADC_HandleTypeDef *adc_handle, uint32_t channel)
if (__HAL_ADC_IS_CHANNEL_INTERNAL(channel)) { if (__HAL_ADC_IS_CHANNEL_INTERNAL(channel)) {
sConfig.SamplingTime = ADC_SAMPLETIME_384CYCLES; sConfig.SamplingTime = ADC_SAMPLETIME_384CYCLES;
} else { } else {
sConfig.SamplingTime = ADC_SAMPLETIME_384CYCLES; sConfig.SamplingTime = ADC_SAMPLETIME_16CYCLES;
} }
#elif defined(STM32G0) #elif defined(STM32G0)
if (__HAL_ADC_IS_CHANNEL_INTERNAL(channel)) { if (__HAL_ADC_IS_CHANNEL_INTERNAL(channel)) {

View file

@ -80,7 +80,7 @@
#define ADC_SAMPLETIME_DEFAULT ADC_SAMPLETIME_12CYCLES_5 #define ADC_SAMPLETIME_DEFAULT ADC_SAMPLETIME_12CYCLES_5
#define ADC_SAMPLETIME_DEFAULT_INT ADC_SAMPLETIME_160CYCLES_5 #define ADC_SAMPLETIME_DEFAULT_INT ADC_SAMPLETIME_160CYCLES_5
#elif defined(STM32L1) #elif defined(STM32L1)
#define ADC_SAMPLETIME_DEFAULT ADC_SAMPLETIME_384CYCLES #define ADC_SAMPLETIME_DEFAULT ADC_SAMPLETIME_16CYCLES
#define ADC_SAMPLETIME_DEFAULT_INT ADC_SAMPLETIME_384CYCLES #define ADC_SAMPLETIME_DEFAULT_INT ADC_SAMPLETIME_384CYCLES
#elif defined(STM32L4) || defined(STM32WB) #elif defined(STM32L4) || defined(STM32WB)
#define ADC_SAMPLETIME_DEFAULT ADC_SAMPLETIME_12CYCLES_5 #define ADC_SAMPLETIME_DEFAULT ADC_SAMPLETIME_12CYCLES_5
@ -225,6 +225,8 @@ void adc_config(ADC_TypeDef *adc, uint32_t bits) {
ADC3_COMMON->CCR = 3 << ADC_CCR_CKMODE_Pos; ADC3_COMMON->CCR = 3 << ADC_CCR_CKMODE_Pos;
#elif defined(STM32L0) #elif defined(STM32L0)
ADC1_COMMON->CCR = 0; // ADCPR=PCLK/2 ADC1_COMMON->CCR = 0; // ADCPR=PCLK/2
#elif defined(STM32L1)
ADC1_COMMON->CCR = 1 << ADC_CCR_ADCPRE_Pos; // ADCPRE=2
#elif defined(STM32WB) #elif defined(STM32WB)
ADC1_COMMON->CCR = 0 << ADC_CCR_PRESC_Pos | 0 << ADC_CCR_CKMODE_Pos; // PRESC=1, MODE=ASYNC ADC1_COMMON->CCR = 0 << ADC_CCR_PRESC_Pos | 0 << ADC_CCR_CKMODE_Pos; // PRESC=1, MODE=ASYNC
#elif defined(STM32WL) #elif defined(STM32WL)
@ -385,6 +387,31 @@ static void adc_config_channel(ADC_TypeDef *adc, uint32_t channel, uint32_t samp
} }
*smpr = (*smpr & ~(7 << (channel * 3))) | sample_time << (channel * 3); // select sample time *smpr = (*smpr & ~(7 << (channel * 3))) | sample_time << (channel * 3); // select sample time
#elif defined(STM32L1)
ADC_Common_TypeDef *adc_common = ADC1_COMMON;
if (channel == ADC_CHANNEL_VREFINT || channel == ADC_CHANNEL_TEMPSENSOR) {
adc_common->CCR |= ADC_CCR_TSVREFE;
if (channel == ADC_CHANNEL_TEMPSENSOR) {
adc_stabilisation_delay_us(ADC_TEMPSENSOR_DELAY_US);
}
}
adc->SQR1 = (1 - 1) << ADC_SQR1_L_Pos;
adc->SQR5 = (channel & 0x1f) << ADC_SQR5_SQ1_Pos;
__IO uint32_t *smpr;
if (channel >= 20) {
smpr = &adc->SMPR1;
channel -= 20;
} else if (channel >= 10) {
smpr = &adc->SMPR2;
channel -= 10;
} else {
smpr = &adc->SMPR3;
}
*smpr = (*smpr & ~(7 << (channel * 3))) | sample_time << (channel * 3); // select sample time
#elif defined(STM32G4) || defined(STM32H5) || defined(STM32H7) || defined(STM32L4) || defined(STM32WB) #elif defined(STM32G4) || defined(STM32H5) || defined(STM32H7) || defined(STM32L4) || defined(STM32WB)
#if defined(STM32G4) || defined(STM32H5) || defined(STM32H7A3xx) || defined(STM32H7A3xxQ) || defined(STM32H7B3xx) || defined(STM32H7B3xxQ) #if defined(STM32G4) || defined(STM32H5) || defined(STM32H7A3xx) || defined(STM32H7A3xxQ) || defined(STM32H7B3xx) || defined(STM32H7B3xxQ)