STM32L476G_EVAL BSP User Manual
|
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>© 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
