Skip to content

Commit 625cd6c

Browse files
committed
Updated ADC driver based on en.en-st-stm32cubeide examples
1 parent 0c13629 commit 625cd6c

File tree

8 files changed

+119
-176
lines changed

8 files changed

+119
-176
lines changed

src/boards/B-L072Z-LRWAN1/adc-board.c

Lines changed: 23 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@
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

3129
void 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

7165
uint16_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

src/boards/NAMote72/adc-board.c

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ ADC_HandleTypeDef AdcHandle;
2828

2929
void AdcMcuInit( Adc_t *obj, PinNames adcInput )
3030
{
31-
AdcHandle.Instance = ( ADC_TypeDef* )ADC1_BASE;
31+
AdcHandle.Instance = ADC1;
3232

3333
__HAL_RCC_ADC1_CLK_ENABLE( );
3434

@@ -70,6 +70,11 @@ uint16_t AdcMcuReadChannel( Adc_t *obj, uint32_t channel )
7070
{
7171
}
7272

73+
// Wait the the Vrefint used by adc is set
74+
while( __HAL_PWR_GET_FLAG( PWR_FLAG_VREFINTRDY ) == RESET )
75+
{
76+
}
77+
7378
__HAL_RCC_ADC1_CLK_ENABLE( );
7479

7580
adcConf.Channel = channel;
@@ -79,22 +84,15 @@ uint16_t AdcMcuReadChannel( Adc_t *obj, uint32_t channel )
7984
HAL_ADC_ConfigChannel( &AdcHandle, &adcConf );
8085

8186
// Enable ADC1
82-
if( ADC_Enable( &AdcHandle ) == HAL_OK )
83-
{
84-
// Start ADC Software Conversion
85-
HAL_ADC_Start( &AdcHandle );
87+
// Start ADC Software Conversion
88+
HAL_ADC_Start( &AdcHandle );
8689

87-
HAL_ADC_PollForConversion( &AdcHandle, HAL_MAX_DELAY );
90+
HAL_ADC_PollForConversion( &AdcHandle, HAL_MAX_DELAY );
8891

89-
adcData = HAL_ADC_GetValue( &AdcHandle );
90-
}
92+
adcData = HAL_ADC_GetValue( &AdcHandle );
9193

92-
ADC_ConversionStop_Disable( &AdcHandle );
94+
__HAL_ADC_DISABLE( &AdcHandle );
9395

94-
if( ( adcConf.Channel == ADC_CHANNEL_TEMPSENSOR ) || ( adcConf.Channel == ADC_CHANNEL_VREFINT ) )
95-
{
96-
HAL_ADC_DeInit( &AdcHandle );
97-
}
9896
__HAL_RCC_ADC1_CLK_DISABLE( );
9997

10098
// Disable HSI

src/boards/NucleoL073/adc-board.c

Lines changed: 14 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@
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

3129
void 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

@@ -62,18 +60,12 @@ void AdcMcuConfig( void )
6260
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

7165
uint16_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,47 +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+
8888
// Deselects all channels
8989
adcConf.Channel = ADC_CHANNEL_MASK;
9090
adcConf.Rank = ADC_RANK_NONE;
9191
HAL_ADC_ConfigChannel( &AdcHandle, &adcConf );
9292

93+
// Configure ADC channel
9394
adcConf.Channel = channel;
9495
adcConf.Rank = ADC_RANK_CHANNEL_NUMBER;
9596
HAL_ADC_ConfigChannel( &AdcHandle, &adcConf );
9697

97-
// Enable ADC1
98-
__HAL_ADC_ENABLE( &AdcHandle );
98+
// Start ADC Software Conversion
99+
HAL_ADC_Start( &AdcHandle );
99100

100-
// Wait for ADC to effectively be enabled
101-
tickStart = HAL_GetTick( );
102-
while( __HAL_ADC_GET_FLAG( &AdcHandle, ADC_FLAG_RDY ) == RESET )
103-
{
104-
if( ( HAL_GetTick( ) - tickStart ) > ADC_ENABLE_TIMEOUT )
105-
{
106-
isAdcReady = false;
107-
break;
108-
}
109-
}
110-
111-
if( isAdcReady != false )
112-
{
113-
// Start ADC Software Conversion
114-
HAL_ADC_Start( &AdcHandle );
101+
HAL_ADC_PollForConversion( &AdcHandle, HAL_MAX_DELAY );
115102

116-
HAL_ADC_PollForConversion( &AdcHandle, HAL_MAX_DELAY );
117-
118-
adcData = HAL_ADC_GetValue( &AdcHandle );
119-
}
103+
adcData = HAL_ADC_GetValue( &AdcHandle );
120104

121105
__HAL_ADC_DISABLE( &AdcHandle );
122106

123-
if( ( adcConf.Channel == ADC_CHANNEL_TEMPSENSOR ) || ( adcConf.Channel == ADC_CHANNEL_VREFINT ) )
124-
{
125-
HAL_ADC_DeInit( &AdcHandle );
126-
}
127107
__HAL_RCC_ADC1_CLK_DISABLE( );
128108

129109
// Disable HSI

src/boards/NucleoL152/adc-board.c

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ ADC_HandleTypeDef AdcHandle;
2828

2929
void AdcMcuInit( Adc_t *obj, PinNames adcInput )
3030
{
31-
AdcHandle.Instance = ( ADC_TypeDef* )ADC1_BASE;
31+
AdcHandle.Instance = ADC1;
3232

3333
__HAL_RCC_ADC1_CLK_ENABLE( );
3434

@@ -70,6 +70,11 @@ uint16_t AdcMcuReadChannel( Adc_t *obj, uint32_t channel )
7070
{
7171
}
7272

73+
// Wait the the Vrefint used by adc is set
74+
while( __HAL_PWR_GET_FLAG( PWR_FLAG_VREFINTRDY ) == RESET )
75+
{
76+
}
77+
7378
__HAL_RCC_ADC1_CLK_ENABLE( );
7479

7580
adcConf.Channel = channel;
@@ -78,23 +83,15 @@ uint16_t AdcMcuReadChannel( Adc_t *obj, uint32_t channel )
7883

7984
HAL_ADC_ConfigChannel( &AdcHandle, &adcConf );
8085

81-
// Enable ADC1
82-
if( ADC_Enable( &AdcHandle ) == HAL_OK )
83-
{
84-
// Start ADC Software Conversion
85-
HAL_ADC_Start( &AdcHandle );
86+
// Start ADC Software Conversion
87+
HAL_ADC_Start( &AdcHandle );
8688

87-
HAL_ADC_PollForConversion( &AdcHandle, HAL_MAX_DELAY );
89+
HAL_ADC_PollForConversion( &AdcHandle, HAL_MAX_DELAY );
8890

89-
adcData = HAL_ADC_GetValue( &AdcHandle );
90-
}
91+
adcData = HAL_ADC_GetValue( &AdcHandle );
9192

92-
ADC_ConversionStop_Disable( &AdcHandle );
93+
__HAL_ADC_DISABLE( &AdcHandle );
9394

94-
if( ( adcConf.Channel == ADC_CHANNEL_TEMPSENSOR ) || ( adcConf.Channel == ADC_CHANNEL_VREFINT ) )
95-
{
96-
HAL_ADC_DeInit( &AdcHandle );
97-
}
9895
__HAL_RCC_ADC1_CLK_DISABLE( );
9996

10097
// Disable HSI

src/boards/NucleoL476/adc-board.c

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,25 @@
2424
#include "board-config.h"
2525
#include "adc-board.h"
2626

27+
//
28+
// DEFINED HERE UP UNTIL THE HAL DRIVERS AREN'T UPDATED
29+
//
30+
/**
31+
* @brief Disable the ADC peripheral.
32+
* @param __HANDLE__ ADC handle.
33+
* @retval None
34+
*/
35+
#define ADC_DISABLE(__HANDLE__) \
36+
do{ \
37+
(__HANDLE__)->Instance->CR |= ADC_CR_ADDIS; \
38+
__HAL_ADC_CLEAR_FLAG((__HANDLE__), (ADC_FLAG_EOSMP | ADC_FLAG_RDY)); \
39+
} while(0)
40+
2741
ADC_HandleTypeDef AdcHandle;
2842

2943
void AdcMcuInit( Adc_t *obj, PinNames adcInput )
3044
{
31-
AdcHandle.Instance = ( ADC_TypeDef* )ADC1_BASE;
45+
AdcHandle.Instance = ADC1;
3246

3347
__HAL_RCC_ADC_CLK_ENABLE( );
3448

@@ -43,6 +57,7 @@ void AdcMcuInit( Adc_t *obj, PinNames adcInput )
4357
void AdcMcuConfig( void )
4458
{
4559
// Configure ADC
60+
AdcHandle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV1;
4661
AdcHandle.Init.Resolution = ADC_RESOLUTION_12B;
4762
AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
4863
AdcHandle.Init.ContinuousConvMode = DISABLE;
@@ -71,30 +86,24 @@ uint16_t AdcMcuReadChannel( Adc_t *obj, uint32_t channel )
7186

7287
__HAL_RCC_ADC_CLK_ENABLE( );
7388

89+
// Calibrate ADC if any calibraiton hardware
90+
HAL_ADCEx_Calibration_Start( &AdcHandle, ADC_SINGLE_ENDED );
91+
7492
adcConf.Channel = channel;
7593
adcConf.Rank = ADC_REGULAR_RANK_1;
7694
adcConf.SamplingTime = ADC_SAMPLETIME_92CYCLES_5;
7795

7896
HAL_ADC_ConfigChannel( &AdcHandle, &adcConf );
7997

80-
// Enable ADC
81-
if( ADC_Enable( &AdcHandle ) == HAL_OK )
82-
{
83-
// Start ADC Software Conversion
84-
HAL_ADC_Start( &AdcHandle );
98+
// Start ADC Software Conversion
99+
HAL_ADC_Start( &AdcHandle );
85100

86-
HAL_ADC_PollForConversion( &AdcHandle, HAL_MAX_DELAY );
101+
HAL_ADC_PollForConversion( &AdcHandle, HAL_MAX_DELAY );
87102

88-
adcData = HAL_ADC_GetValue( &AdcHandle );
89-
}
103+
adcData = HAL_ADC_GetValue( &AdcHandle );
90104

91-
ADC_ConversionStop( &AdcHandle, ADC_REGULAR_GROUP );
92-
HAL_ADC_Stop( &AdcHandle );
105+
ADC_DISABLE( &AdcHandle );
93106

94-
if( ( adcConf.Channel == ADC_CHANNEL_TEMPSENSOR ) || ( adcConf.Channel == ADC_CHANNEL_VREFINT ) )
95-
{
96-
HAL_ADC_DeInit( &AdcHandle );
97-
}
98107
__HAL_RCC_ADC_CLK_DISABLE( );
99108

100109
// Disable HSI

0 commit comments

Comments
 (0)