STM32L476G_EVAL BSP User Manual: stm32l476g_eval_idd.c Source File

STM32L476G_EVAL BSP

stm32l476g_eval_idd.c
Go to the documentation of this file.
00001 /**
00002   ******************************************************************************
00003   * @file    stm32l476g_eval_idd.c
00004   * @author  MCD Application Team
00005   * @version $VERSION$
00006   * @date    $DATE$
00007   * @brief   This file includes the Idd measurement driver for
00008   *          STM32L476G-Eval board.
00009   ******************************************************************************
00010   * @attention
00011   *
00012   * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
00013   *
00014   * Redistribution and use in source and binary forms, with or without modification,
00015   * are permitted provided that the following conditions are met:
00016   *   1. Redistributions of source code must retain the above copyright notice,
00017   *      this list of conditions and the following disclaimer.
00018   *   2. Redistributions in binary form must reproduce the above copyright notice,
00019   *      this list of conditions and the following disclaimer in the documentation
00020   *      and/or other materials provided with the distribution.
00021   *   3. Neither the name of STMicroelectronics nor the names of its contributors
00022   *      may be used to endorse or promote products derived from this software
00023   *      without specific prior written permission.
00024   *
00025   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00026   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00027   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00028   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
00029   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00030   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
00031   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00032   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
00033   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00034   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00035   *
00036   ******************************************************************************
00037   */
00038 
00039 /* Includes ------------------------------------------------------------------*/
00040 #include "stm32l476g_eval_idd.h"
00041 
00042 /** @addtogroup BSP
00043   * @{
00044   */
00045 
00046 /** @addtogroup STM32L476G_EVAL
00047   * @{
00048   */
00049   
00050 /** @defgroup STM32L476G_EVAL_IDD STM32L476G_EVAL IDD
00051   * @brief This file includes the Idd driver for STM32L476G-EVAL board.
00052   *        It allows user to measure MCU Idd current on board, especially in 
00053   *        different low power modes.
00054   * @{
00055   */
00056 
00057 /** @defgroup STM32L476G_EVAL_IDD_Private_Defines Private Defines
00058   * @{
00059   */
00060 
00061 /**
00062   * @}
00063   */
00064 
00065 
00066 /** @defgroup STM32L476G_EVAL_IDD_Private_Variables Private Variables
00067   * @{
00068   */
00069 ADC_HandleTypeDef      heval_AdcHandle;
00070 ADC_ChannelConfTypeDef heval_AdcChannelConfig;
00071 
00072 /**
00073   * @}
00074   */
00075 
00076 /** @defgroup STM32L476G_EVAL_IDD_Private_Functions Private Functions
00077   * @{
00078   */
00079 
00080 /**
00081   * @}
00082   */
00083 
00084 /** @defgroup STM32L476G_EVAL_IDD_Exported_Functions Exported Functions
00085   * @{
00086   */
00087 
00088 /**
00089   * @brief  Configures IDD measurement components.
00090   * @retval BSP_IDD_OK if no problem during initialization
00091   */
00092 uint8_t BSP_IDD_Init(void)
00093 { 
00094   uint8_t ret;
00095   GPIO_InitTypeDef GPIO_InitStruct;
00096   
00097   /* Set IDD_CNT_EN  PF 10 to high */ 
00098   HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_SET);
00099 
00100   /* Configure IDD_CNT_EN PF 10 */
00101   __HAL_RCC_GPIOF_CLK_ENABLE();
00102   GPIO_InitStruct.Pin   = GPIO_PIN_10;
00103   GPIO_InitStruct.Pull  = GPIO_NOPULL;
00104   GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
00105   GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
00106   HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
00107 
00108   /* Set IDD_CNT_EN  PF 10 to high */ 
00109   HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_SET);
00110   
00111   /* Configure WakeUp External Pin */
00112   __HAL_RCC_GPIOC_CLK_ENABLE();
00113   GPIO_InitStruct.Pin   = GPIO_PIN_5;
00114   GPIO_InitStruct.Pull  = GPIO_NOPULL;
00115   GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
00116   GPIO_InitStruct.Mode  = GPIO_MODE_IT_RISING;
00117   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
00118 
00119   /* Enable and set WakeUp EXTI Interrupt to the highest priority */
00120   HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0x0, 0x0);
00121   HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
00122   
00123   heval_AdcHandle.Instance          = ADC1;
00124   /* DeInitialized ADC for IDD measurement */ 
00125   if (HAL_ADC_DeInit(&heval_AdcHandle) != HAL_OK)
00126   {
00127     /* ADC de-initialization Error */
00128     ret = BSP_IDD_ERROR;
00129   }
00130   else
00131   {
00132     /* ADC initialization for IDD measurement */
00133     /* Handle Initialization */
00134     heval_AdcHandle.Init.ClockPrescaler        = ADC_CLOCK_ASYNC_DIV1;          /* Asynchronous clock mode, input ADC clock not divided */
00135     heval_AdcHandle.Init.Resolution            = ADC_RESOLUTION_12B;            /* 12-bit resolution for converted data */
00136     heval_AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;           /* Right-alignment for converted data */
00137     heval_AdcHandle.Init.ScanConvMode          = DISABLE;                       /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */
00138     heval_AdcHandle.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;           /* EOC flag picked-up to indicate conversion end */
00139     heval_AdcHandle.Init.LowPowerAutoWait      = DISABLE;                       /* Auto-delayed conversion feature disabled */
00140     heval_AdcHandle.Init.ContinuousConvMode    = DISABLE;                       /* Continuous mode disabled to have only 1 conversion at each conversion trig */
00141     heval_AdcHandle.Init.NbrOfConversion       = 1;                             /* Parameter discarded because sequencer is disabled */
00142     heval_AdcHandle.Init.DiscontinuousConvMode = DISABLE;                       /* Parameter discarded because sequencer is disabled */
00143     heval_AdcHandle.Init.NbrOfDiscConversion   = 1;                             /* Parameter discarded because sequencer is disabled */
00144     heval_AdcHandle.Init.ExternalTrigConv      = ADC_SOFTWARE_START;            /* Software start to trig the 1st conversion manually, without external event */
00145     heval_AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE; /* Parameter discarded because software trigger chosen */
00146     heval_AdcHandle.Init.DMAContinuousRequests = DISABLE;                       /* DMA one-shot mode selected (not applied to this example) */
00147     heval_AdcHandle.Init.Overrun               = ADC_OVR_DATA_OVERWRITTEN;      /* DR register is overwritten with the last conversion result in case of overrun */
00148     heval_AdcHandle.Init.OversamplingMode      = DISABLE;                       /* No oversampling */
00149 
00150     /* Channel Config Initialization */
00151     heval_AdcChannelConfig.Channel                      = ADC_CHANNEL_10;                /* Sampled channel number */
00152     heval_AdcChannelConfig.Rank                         = ADC_REGULAR_RANK_1;          /* Rank of sampled channel number ADCx_CHANNEL */
00153     heval_AdcChannelConfig.SamplingTime                 = ADC_SAMPLETIME_6CYCLES_5;                /* Sampling time (number of clock cycles unit) */
00154     heval_AdcChannelConfig.SingleDiff                   = ADC_SINGLE_ENDED;            /* Single-ended input channel */
00155     heval_AdcChannelConfig.OffsetNumber                 = ADC_OFFSET_NONE;             /* No offset subtraction */ 
00156     heval_AdcChannelConfig.Offset                       = 0;                                 /* Parameter discarded because offset correction is disabled */
00157 
00158     /* Initialization OK */
00159     ret = BSP_IDD_OK;
00160   }
00161   
00162   return ret;
00163 }
00164 
00165 /**
00166   * @brief  Board Enter Stop Mode 2.
00167   * @retval None.
00168   */
00169 void BSP_IDD_EnterStopMode2(void)
00170 {
00171 #if (PREFETCH_ENABLE != 0)
00172   /* Disable Prefetch Buffer */
00173   __HAL_FLASH_PREFETCH_BUFFER_DISABLE();
00174 #endif /* PREFETCH_ENABLE */
00175 
00176   /* Set IDD_CNT_EN PF 10 to low */ 
00177   HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_RESET);
00178 
00179   /* Enter STOP 2 mode */
00180   HAL_SuspendTick();
00181 
00182   HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
00183 }
00184 
00185 /**
00186   * @brief  Board Enter Stop Mode 1.
00187   * @retval None.
00188   */
00189 void BSP_IDD_EnterStopMode1(void)
00190 {
00191   /* Enter STOP 1 mode */
00192   HAL_SuspendTick();
00193 
00194   HAL_PWREx_EnterSTOP1Mode(PWR_LOWPOWERREGULATOR_ON , PWR_STOPENTRY_WFE);
00195   HAL_PWREx_DisableLowPowerRunMode();
00196   
00197 }
00198 
00199 /**
00200   * @brief  Board Exit Stop Mode.
00201   * @retval None.
00202   */
00203 void BSP_IDD_ExitStopMode(void)
00204 {
00205   HAL_ResumeTick();
00206 
00207 #if (PREFETCH_ENABLE != 0)
00208   /* Re-enable Prefetch Buffer */
00209   __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
00210 #endif /* PREFETCH_ENABLE */
00211 }
00212 
00213 /**
00214   * @brief  Board Enter Sleep Mode.
00215   * @retval None.
00216   */
00217 void BSP_IDD_EnterSleepMode(void)
00218 {
00219 #if (PREFETCH_ENABLE != 0)
00220   /* Disable Prefetch Buffer */
00221   __HAL_FLASH_PREFETCH_BUFFER_DISABLE();
00222 #endif /* PREFETCH_ENABLE */
00223   
00224   /* Set IDD_CNT_EN PF 10 to low */ 
00225   HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_RESET);
00226 
00227   RCC->AHB1SMENR  = 0x0; 
00228   RCC->AHB2SMENR  = 0x0;
00229   RCC->AHB3SMENR  = 0x0;
00230   
00231   RCC->APB1SMENR1 = 0x0;
00232   RCC->APB1SMENR2 = 0x0; 
00233   RCC->APB2SMENR  = 0x0; 
00234 
00235   /* Enter SLEEP mode */
00236   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/10);
00237 
00238   HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
00239 }
00240 
00241 /**
00242   * @brief  Board Exit Sleep Mode.
00243   * @retval None.
00244   */
00245 void BSP_IDD_ExitSleepMode(void)
00246 {
00247   /* Reset tick period to 1 ms */
00248   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
00249   
00250 #if (PREFETCH_ENABLE != 0)
00251   /* Re-enable Prefetch Buffer */
00252   __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
00253 #endif /* PREFETCH_ENABLE */
00254 }
00255 
00256 /**
00257   * @brief  Board Enter Run Mode.
00258   * @retval None.
00259   */
00260 void BSP_IDD_EnterRunMode(void)
00261 {
00262   /* Set IDD_CNT_EN  PF 10 to low */ 
00263   HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_RESET);
00264 
00265   RCC->AHB1SMENR  = 0x0; 
00266   RCC->AHB2SMENR  = 0x0;
00267   RCC->AHB3SMENR  = 0x0;
00268   
00269   RCC->APB1SMENR1 = 0x0;
00270   RCC->APB1SMENR2 = 0x0; 
00271   RCC->APB2SMENR  = 0x0; 
00272 }
00273 
00274 /**
00275   * @brief  Board Enter Standby Mode.
00276   * @retval None.
00277   */
00278 void BSP_IDD_EnterStandbyMode(void)
00279 {
00280   HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN5);
00281 
00282   /* Clear wake up Flag */
00283   __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WUF5);
00284   
00285   /* Enable wakeup pin WKUP5 */
00286   HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN5_HIGH);
00287  
00288   HAL_PWREx_EnableGPIOPullDown(PWR_GPIO_F, PWR_GPIO_BIT_10);
00289   HAL_PWREx_EnablePullUpPullDownConfig();
00290 
00291   HAL_PWR_EnterSTANDBYMode();
00292 }
00293 
00294 /**
00295   * @brief  Get IDD current consumption value.
00296   * @param  LowPowerMode: Low Power Mode (STOP, SLEEP, RUN, STANDBY).
00297   * @param  Calibration: Offset Calibration.
00298   * @param  IddValue: Pointer on u32 to store Idd. Value unit is nA.
00299   * @retval BSP_IDD_OK if no problem during initialization
00300   */
00301 uint32_t BSP_IDD_GetValue(IDD_ModeTypdef LowPowerMode, uint32_t Calibration, uint32_t *IddValue)
00302 {
00303   uint32_t ADCxConvertedValue = 0;
00304   GPIO_InitTypeDef GPIO_InitStruct;
00305   uint32_t index;
00306   
00307   /*##-1- Enable peripherals and GPIO Clocks #################################*/
00308   /* ADC Periph clock enable */
00309   __HAL_RCC_ADC_CLK_ENABLE();
00310   /* ADC Periph interface clock configuration */
00311   __HAL_RCC_ADC_CONFIG(RCC_ADCCLKSOURCE_SYSCLK);
00312   /* Enable GPIO clock ****************************************/
00313   __HAL_RCC_GPIOA_CLK_ENABLE();
00314 
00315   /*##-2- Configure peripheral GPIO ##########################################*/
00316   /* ADC Channel GPIO pin configuration */
00317   GPIO_InitStruct.Pin = GPIO_PIN_5;
00318   GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
00319   GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
00320   GPIO_InitStruct.Pull = GPIO_NOPULL;
00321   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
00322 
00323   if (HAL_ADC_DeInit(&heval_AdcHandle) != HAL_OK)
00324   {
00325     /* ADC de-initialization Error */
00326     return BSP_IDD_ERROR;
00327   }
00328 
00329   if (HAL_ADC_Init(&heval_AdcHandle) != HAL_OK)
00330   {
00331     /* ADC initialization Error */
00332     return BSP_IDD_ERROR;
00333   }
00334   
00335   
00336   if (HAL_ADC_ConfigChannel(&heval_AdcHandle, &heval_AdcChannelConfig) != HAL_OK)
00337   {
00338     /* Channel Configuration Error */
00339     return BSP_IDD_ERROR;
00340   }
00341 
00342   /*##-3- Calibrate ADC then Start the conversion process ####################*/  
00343   if (HAL_ADCEx_Calibration_Start(&heval_AdcHandle, ADC_SINGLE_ENDED) !=  HAL_OK)
00344   {
00345     /* ADC Calibration Error */
00346     return BSP_IDD_ERROR;
00347   }
00348 
00349   ADCxConvertedValue = 0;
00350   /* Compute an average of 4 measures */
00351   for (index = 0; index < 4; index++)
00352   {  
00353     if (HAL_ADC_Start(&heval_AdcHandle) != HAL_OK)
00354     {
00355       /* Start Conversation Error */
00356       return BSP_IDD_ERROR;
00357     }
00358     
00359     if (HAL_ADC_PollForConversion(&heval_AdcHandle, 100) != HAL_OK)
00360     {
00361       /* End Of Conversion flag not set on time */
00362       return BSP_IDD_ERROR;
00363     }
00364     
00365       /* Check if the continous conversion of regular channel is finished */
00366     if ((HAL_ADC_GetState(&heval_AdcHandle) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)
00367     {
00368       /*##-5- Get the converted value of regular channel  ########################*/
00369       ADCxConvertedValue += HAL_ADC_GetValue(&heval_AdcHandle);
00370     }
00371   }  
00372 
00373   /* Set IDD_CNT_EN  PF 10 to high */ 
00374   HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_SET);
00375 
00376   /* Calculate the average of the converted value */
00377   ADCxConvertedValue >>= 2;
00378 
00379   if(LowPowerMode != BSP_IDD_MODE_CALIBRATION)
00380   {
00381     if(ADCxConvertedValue <= Calibration)
00382     {
00383       ADCxConvertedValue = 0;
00384     }
00385     else
00386     {
00387       ADCxConvertedValue -= Calibration;
00388     }
00389 
00390     /* V_shunt = (Vdd(in mV) / ADC_FULL_SCALE) * ADCxConvertedValue / IDD_AMPLI_GAIN in mV */
00391     /* V_shunt = 1000 * (Vdd / ADC_FULL_SCALE) * ADCxConvertedValue / IDD_AMPLI_GAIN in uV */
00392     /* V_shunt = (20 * ADCxConvertedValue * 3300 ) / 4096 is the voltage in uV. */
00393     /* With a resistor @ 1000 Ohm, Idd = V_shunt / 1000 is the current in nA
00394       or, seen differently, Idd = V_shunt is the current in nA. */
00395     IddValue[0] = (20 * ADCxConvertedValue * EVAL_IDD_VDD ) / EVAL_IDD_FULL_SCALE; 
00396   }
00397   else
00398   {
00399     /* Return Offset Calibration */
00400     IddValue[0] = ADCxConvertedValue;
00401   }
00402   
00403   return BSP_IDD_OK;
00404 }
00405 
00406 
00407 /**
00408   * @}
00409   */
00410 
00411 /**
00412   * @}
00413   */
00414 
00415 /**
00416   * @}
00417   */
00418 
00419 /**
00420   * @}
00421   */
00422 
00423 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
00424 
Generated on Sun Jun 21 2015 23:46:41 for STM32L476G_EVAL BSP User Manual by   doxygen 1.7.6.1