1 /*!
2  * \file      adc-board.c
3  *
4  * \brief     Target board ADC driver implementation
5  *
6  * \copyright Revised BSD License, see section \ref LICENSE.
7  *
8  * \code
9  *                ______                              _
10  *               / _____)             _              | |
11  *              ( (____  _____ ____ _| |_ _____  ____| |__
12  *               \____ \| ___ |    (_   _) ___ |/ ___)  _ \
13  *               _____) ) ____| | | || |_| ____( (___| | | |
14  *              (______/|_____)_|_|_| \__)_____)\____)_| |_|
15  *              (C)2013-2017 Semtech
16  *
17  * \endcode
18  *
19  * \author    Miguel Luis ( Semtech )
20  *
21  * \author    Gregory Cristian ( Semtech )
22  */
23 #include "stm32l1xx.h"
24 #include "board-config.h"
25 #include "adc-board.h"
26 
27 ADC_HandleTypeDef AdcHandle;
28 
AdcMcuInit(Adc_t * obj,PinNames adcInput)29 void AdcMcuInit( Adc_t *obj, PinNames adcInput )
30 {
31     AdcHandle.Instance = ADC1;
32 
33     __HAL_RCC_ADC1_CLK_ENABLE( );
34 
35     HAL_ADC_DeInit( &AdcHandle );
36 
37     if( adcInput != NC )
38     {
39         GpioInit( &obj->AdcInput, adcInput, PIN_ANALOGIC, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
40     }
41 }
42 
AdcMcuConfig(void)43 void AdcMcuConfig( void )
44 {
45     // Configure ADC
46     AdcHandle.Init.Resolution            = ADC_RESOLUTION_12B;
47     AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;
48     AdcHandle.Init.ContinuousConvMode    = DISABLE;
49     AdcHandle.Init.DiscontinuousConvMode = DISABLE;
50     AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE;
51     AdcHandle.Init.ExternalTrigConv      = ADC_EXTERNALTRIGCONV_T6_TRGO;
52     AdcHandle.Init.DMAContinuousRequests = DISABLE;
53     AdcHandle.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;
54     AdcHandle.Init.NbrOfConversion       = 1;
55     AdcHandle.Init.LowPowerAutoWait      = DISABLE;
56     AdcHandle.Init.LowPowerAutoPowerOff  = DISABLE;
57     HAL_ADC_Init( &AdcHandle );
58 }
59 
AdcMcuReadChannel(Adc_t * obj,uint32_t channel)60 uint16_t AdcMcuReadChannel( Adc_t *obj, uint32_t channel )
61 {
62     ADC_ChannelConfTypeDef adcConf = { 0 };
63     uint16_t adcData = 0;
64 
65     // Enable HSI
66     __HAL_RCC_HSI_ENABLE( );
67 
68     // Wait till HSI is ready
69     while( __HAL_RCC_GET_FLAG( RCC_FLAG_HSIRDY ) == RESET )
70     {
71     }
72 
73     // Wait the the Vrefint used by adc is set
74     while( __HAL_PWR_GET_FLAG( PWR_FLAG_VREFINTRDY ) == RESET )
75     {
76     }
77 
78     __HAL_RCC_ADC1_CLK_ENABLE( );
79 
80     adcConf.Channel = channel;
81     adcConf.Rank = ADC_REGULAR_RANK_1;
82     adcConf.SamplingTime = ADC_SAMPLETIME_192CYCLES;
83 
84     HAL_ADC_ConfigChannel( &AdcHandle, &adcConf );
85 
86     // Start ADC Software Conversion
87     HAL_ADC_Start( &AdcHandle );
88 
89     HAL_ADC_PollForConversion( &AdcHandle, HAL_MAX_DELAY );
90 
91     adcData = HAL_ADC_GetValue( &AdcHandle );
92 
93     __HAL_ADC_DISABLE( &AdcHandle );
94 
95     __HAL_RCC_ADC1_CLK_DISABLE( );
96 
97     // Disable HSI
98     __HAL_RCC_HSI_DISABLE( );
99 
100     return adcData;
101 }
102