STM32L1xxx ADC HAL driver bug Topic is solved

Report here problems in any of ChibiOS components. This forum is NOT for support.
radar_macgyver
Posts: 5
Joined: Mon Feb 13, 2017 5:57 am
Has thanked: 3 times
Been thanked: 2 times

STM32L1xxx ADC HAL driver bug  Topic is solved

Postby radar_macgyver » Tue Dec 06, 2022 12:40 am

I think there's a bug in the STM32L1xxx device-specific ADC HAL driver.

When doing a multi-channel conversion in a sequence, only the first channel was getting converted. For example, I had a conversion group with num_channels = 4, SQ1 = CH4, SQ2 = CH8, SQ3 = VREF, SQ4 = SENSOR. When I run adcConvert(&ADCD1, &adcgrp, samples, 2), my buffer (of 8 adcsample_t's) contains almost identical values all corresponding to CH4.

Changing the first sequence to a different channel (for example, if I set SQ_1 to CH8), then I get almost identical samples of a different value corresponding to the analog voltage on CH8.

Inspecting the code,
os/hal/ports/STM32/STM32L1xx/hal_adc_lld.c
line 227 sets SQR1 to the specified value, but ignores grpp->num_channels.

By contrast,
os/hal/ports/STM32/LLD/ADCv2/hal_adc_lld.c
line 375 sets SQR1 to the specified value, OR'd with ADC_SQR1_NUM_CH(grpp->num_channels).

If I manually set sqr1 = ADC_SQR1_NUM_CH(4) in my ADC Conversion Group structure, all works as expected. The code comments in STM32L1xx/hal_adc_lld.h do state that sqr1 contains the sequence length, but the behavior is not the same as the other ADC drivers and the documentation.

I'm using the current master from github. My apologies in advance if I'm not submitting this the right way - I'm new to ChibiOS and the community. Also, thank you so much to all the ChibiOS developers!

User avatar
Giovanni
Site Admin
Posts: 14457
Joined: Wed May 27, 2009 8:48 am
Location: Salerno, Italy
Has thanked: 1076 times
Been thanked: 922 times
Contact:

Re: STM32L1xxx ADC HAL driver bug

Postby Giovanni » Fri Dec 09, 2022 11:12 am

Hi,

Fixed as bug #1247.

Giovanni

radar_macgyver
Posts: 5
Joined: Mon Feb 13, 2017 5:57 am
Has thanked: 3 times
Been thanked: 2 times

Re: STM32L1xxx ADC HAL driver bug

Postby radar_macgyver » Tue Dec 20, 2022 12:29 am

Hello Giovanni,
Thank you for the quick turnaround. I did a git pull today and noticed that there was a patch to os/hal/ports/STM32/STM32L1xx/hal_adc_lld.c. Looks like there was a change, but the write is to the wrong register: ADC_SQR1_NUM_CH(grpp->num_channels) is being written to SMPR1 instead of SQR1. I applied the following:

Code: Select all

diff --git a/os/hal/ports/STM32/STM32L1xx/hal_adc_lld.c b/os/hal/ports/STM32/STM32L1xx/hal_adc_lld.c
index 78c000186..926301f86 100644
--- a/os/hal/ports/STM32/STM32L1xx/hal_adc_lld.c
+++ b/os/hal/ports/STM32/STM32L1xx/hal_adc_lld.c
@@ -224,10 +224,10 @@ void adc_lld_start_conversion(ADCDriver *adcp) {

   /* ADC setup.*/
   adcp->adc->SR    = 0;
-  adcp->adc->SMPR1 = grpp->smpr1 | ADC_SQR1_NUM_CH(grpp->num_channels);
+  adcp->adc->SMPR1 = grpp->smpr1;
   adcp->adc->SMPR2 = grpp->smpr2;
   adcp->adc->SMPR3 = grpp->smpr3;
-  adcp->adc->SQR1  = grpp->sqr1;
+  adcp->adc->SQR1  = grpp->sqr1 | ADC_SQR1_NUM_CH(grpp->num_channels);
   adcp->adc->SQR2  = grpp->sqr2;
   adcp->adc->SQR3  = grpp->sqr3;
   adcp->adc->SQR4  = grpp->sqr4;

Now things work, but they didn't previously due to writing to the incorrect register.

User avatar
Giovanni
Site Admin
Posts: 14457
Joined: Wed May 27, 2009 8:48 am
Location: Salerno, Italy
Has thanked: 1076 times
Been thanked: 922 times
Contact:

Re: STM32L1xxx ADC HAL driver bug

Postby Giovanni » Tue Dec 20, 2022 10:16 am

Hi,

Thanks for finding, fixed in repository.

Giovanni


Return to “Bug Reports”

Who is online

Users browsing this forum: No registered users and 42 guests