diff --git a/os/hal/platforms/STM32F2xx/adc_lld.c b/os/hal/platforms/STM32F2xx/adc_lld.c index fd91ba76a..6d889d4c5 100644 --- a/os/hal/platforms/STM32F2xx/adc_lld.c +++ b/os/hal/platforms/STM32F2xx/adc_lld.c @@ -174,8 +174,6 @@ CH_IRQ_HANDLER(ADC1_2_3_IRQHandler) { */ void adc_lld_init(void) { - ADC->CCR = STM32_ADC_ADCPRE; - #if STM32_ADC_USE_ADC1 /* Driver initialization.*/ adcObjectInit(&ADCD1); @@ -270,6 +268,10 @@ void adc_lld_start(ADCDriver *adcp) { } #endif /* STM32_ADC_USE_ADC3 */ + /* This is a common register but apparently it requires that at least one + of the ADCs is clocked in order to allow writing, see bug 3575297.*/ + ADC->CCR = STM32_ADC_ADCPRE << 16; + /* ADC initial setup, starting the analog part here in order to reduce the latency when starting a conversion.*/ adcp->adc->CR1 = 0; diff --git a/os/hal/platforms/STM32F4xx/adc_lld.c b/os/hal/platforms/STM32F4xx/adc_lld.c index bf0788dea..9f447f9a6 100644 --- a/os/hal/platforms/STM32F4xx/adc_lld.c +++ b/os/hal/platforms/STM32F4xx/adc_lld.c @@ -174,8 +174,6 @@ CH_IRQ_HANDLER(ADC1_2_3_IRQHandler) { */ void adc_lld_init(void) { - ADC->CCR = STM32_ADC_ADCPRE; - #if STM32_ADC_USE_ADC1 /* Driver initialization.*/ adcObjectInit(&ADCD1); @@ -270,6 +268,10 @@ void adc_lld_start(ADCDriver *adcp) { } #endif /* STM32_ADC_USE_ADC3 */ + /* This is a common register but apparently it requires that at least one + of the ADCs is clocked in order to allow writing, see bug 3575297.*/ + ADC->CCR = STM32_ADC_ADCPRE << 16; + /* ADC initial setup, starting the analog part here in order to reduce the latency when starting a conversion.*/ adcp->adc->CR1 = 0; diff --git a/readme.txt b/readme.txt index 37aaa7d02..f1a7289da 100644 --- a/readme.txt +++ b/readme.txt @@ -83,6 +83,8 @@ ***************************************************************************** *** 2.5.1 *** +- FIX: Fixed STM32F4 ADC prescaler incorrectly initialized (bug 3575297) + (backported to 2.4.3). - FIX: Fixed RCC_APB2ENR_IOPEEN undeclared on STM32F10X_LD_VL devices (bug 3575098)(backported to 2.4.3). - FIX: Fixed misplaced declarations in lwip_bindings sys_arch.c (bug 3571053)