2020 *
2121 * \author Gregory Cristian ( Semtech )
2222 */
23- #include <stdint.h>
24- #include <stdbool.h>
2523#include "stm32l0xx.h"
2624#include "board-config.h"
2725#include "adc-board.h"
@@ -30,7 +28,7 @@ ADC_HandleTypeDef AdcHandle;
3028
3129void AdcMcuInit ( Adc_t * obj , PinNames adcInput )
3230{
33- AdcHandle .Instance = ( ADC_TypeDef * ) ADC1_BASE ;
31+ AdcHandle .Instance = ADC1 ;
3432
3533 __HAL_RCC_ADC1_CLK_ENABLE ( );
3634
@@ -46,34 +44,28 @@ void AdcMcuConfig( void )
4644{
4745 // Configure ADC
4846 AdcHandle .Init .OversamplingMode = DISABLE ;
49- AdcHandle .Init .ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV1 ;
47+ AdcHandle .Init .ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2 ;
5048 AdcHandle .Init .Resolution = ADC_RESOLUTION_12B ;
5149 AdcHandle .Init .SamplingTime = ADC_SAMPLETIME_160CYCLES_5 ;
5250 AdcHandle .Init .ScanConvMode = ADC_SCAN_DIRECTION_FORWARD ;
5351 AdcHandle .Init .DataAlign = ADC_DATAALIGN_RIGHT ;
5452 AdcHandle .Init .ContinuousConvMode = DISABLE ;
5553 AdcHandle .Init .DiscontinuousConvMode = DISABLE ;
5654 AdcHandle .Init .ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE ;
57- AdcHandle .Init .ExternalTrigConv = ADC_EXTERNALTRIGCONV_T6_TRGO ;
55+ AdcHandle .Init .ExternalTrigConv = ADC_SOFTWARE_START ;
5856 AdcHandle .Init .DMAContinuousRequests = DISABLE ;
5957 AdcHandle .Init .EOCSelection = ADC_EOC_SINGLE_CONV ;
60- AdcHandle .Init .Overrun = ADC_OVR_DATA_OVERWRITTEN ;
58+ AdcHandle .Init .Overrun = ADC_OVR_DATA_PRESERVED ;
6159 AdcHandle .Init .LowPowerAutoWait = DISABLE ;
62- AdcHandle .Init .LowPowerFrequencyMode = DISABLE ; // To be enabled only if ADC clock < 2.8 MHz
60+ AdcHandle .Init .LowPowerFrequencyMode = ENABLE ; // To be enabled only if ADC clock < 2.8 MHz
6361 AdcHandle .Init .LowPowerAutoPowerOff = DISABLE ;
6462 HAL_ADC_Init ( & AdcHandle );
65-
66- // Calibration
67- HAL_ADCEx_Calibration_Start ( & AdcHandle , ADC_SINGLE_ENDED );
68-
6963}
7064
7165uint16_t AdcMcuReadChannel ( Adc_t * obj , uint32_t channel )
7266{
7367 ADC_ChannelConfTypeDef adcConf = { 0 };
7468 uint16_t adcData = 0 ;
75- uint32_t tickStart = 0 ;
76- bool isAdcReady = true;
7769
7870 // Enable HSI
7971 __HAL_RCC_HSI_ENABLE ( );
@@ -83,42 +75,35 @@ uint16_t AdcMcuReadChannel( Adc_t *obj, uint32_t channel )
8375 {
8476 }
8577
78+ // Wait the the Vrefint used by adc is set
79+ while ( __HAL_PWR_GET_FLAG ( PWR_FLAG_VREFINTRDY ) == RESET )
80+ {
81+ }
82+
8683 __HAL_RCC_ADC1_CLK_ENABLE ( );
8784
85+ // Calibrate ADC if any calibraiton hardware
86+ HAL_ADCEx_Calibration_Start ( & AdcHandle , ADC_SINGLE_ENDED );
87+
88+ // Deselects all channels
89+ adcConf .Channel = ADC_CHANNEL_MASK ;
90+ adcConf .Rank = ADC_RANK_NONE ;
91+ HAL_ADC_ConfigChannel ( & AdcHandle , & adcConf );
92+
93+ // Configure ADC channel
8894 adcConf .Channel = channel ;
8995 adcConf .Rank = ADC_RANK_CHANNEL_NUMBER ;
9096 HAL_ADC_ConfigChannel ( & AdcHandle , & adcConf );
9197
92- // Enable ADC1
93- __HAL_ADC_ENABLE ( & AdcHandle );
98+ // Start ADC Software Conversion
99+ HAL_ADC_Start ( & AdcHandle );
94100
95- // Wait for ADC to effectively be enabled
96- tickStart = HAL_GetTick ( );
97- while ( __HAL_ADC_GET_FLAG ( & AdcHandle , ADC_FLAG_RDY ) == RESET )
98- {
99- if ( ( HAL_GetTick ( ) - tickStart ) > ADC_ENABLE_TIMEOUT )
100- {
101- isAdcReady = false;
102- break ;
103- }
104- }
105-
106- if ( isAdcReady != false )
107- {
108- // Start ADC Software Conversion
109- HAL_ADC_Start ( & AdcHandle );
101+ HAL_ADC_PollForConversion ( & AdcHandle , HAL_MAX_DELAY );
110102
111- HAL_ADC_PollForConversion ( & AdcHandle , HAL_MAX_DELAY );
112-
113- adcData = HAL_ADC_GetValue ( & AdcHandle );
114- }
103+ adcData = HAL_ADC_GetValue ( & AdcHandle );
115104
116105 __HAL_ADC_DISABLE ( & AdcHandle );
117106
118- if ( ( adcConf .Channel == ADC_CHANNEL_TEMPSENSOR ) || ( adcConf .Channel == ADC_CHANNEL_VREFINT ) )
119- {
120- HAL_ADC_DeInit ( & AdcHandle );
121- }
122107 __HAL_RCC_ADC1_CLK_DISABLE ( );
123108
124109 // Disable HSI
0 commit comments