OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3571|回复: 1

STM32L051C8进入低功耗模式电流偏大

[复制链接]

2

主题

10

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-5-29
在线时间
15 小时
发表于 2020-8-5 16:43:50 | 显示全部楼层 |阅读模式
2金钱
最近倒腾STM32L051C8的低功耗模式,看了官方给的例程跟一些大佬的代码,然后自己就开始琢磨。我这边是将stm32设置成stop mode with rtc,经测试发现,stm32第一次进入stop mode with rtc的电流是0.8-0.9ua(这跟手册上面的电流大小是相符的),但是从第二次进入stop mode with rtc电流就一直是2.6ua。附上程序
  1. #include "main.h"
  2. #include "led.h"

  3. /* RTC handler declaration */
  4. RTC_HandleTypeDef RTCHandle;

  5. static void Stop_rtc_config(uint32_t sleep);
  6. static void Enter_stop_rtc_mode(void);
  7. static void System_config_before_stop(void);
  8. static void SystemClock_Config(void);
  9. static void SystemClockConfig_STOP(void);


  10. int main(void)
  11. {

  12.                 HAL_Init();
  13.                 SystemClock_Config();

  14. //                LED_Init();
  15.                 while (1)
  16.                 {
  17. //                        LED_ON; //点亮LED
  18.                         HAL_Delay(3000);
  19.                         Enter_stop_rtc_mode();//进入stop whit rtc mode
  20.                 }
  21. }


  22. static void Enter_stop_rtc_mode(void)
  23. {
  24.                 //1. 配置stop之前各外设
  25.                 System_config_before_stop();

  26.                 //2.设置rtc唤醒时间(s)
  27.                 Stop_rtc_config(3);

  28.                 //3. 进入stop
  29.                 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);

  30.                 //3.退出stop后恢复时钟
  31.                 SystemClockConfig_STOP();

  32.                 //4.恢复各外设
  33. //                LED_Init();
  34. }


  35. //退出stop后重新设置时钟
  36. //static void clock_config_after_stop(void)
  37. static void SystemClock_Config(void)
  38. {
  39.                 HAL_StatusTypeDef ret = HAL_OK;
  40.                 RCC_OscInitTypeDef RCC_OscInitStructure = {0};
  41.                 RCC_ClkInitTypeDef RCC_ClkInitStructure = {0};

  42.                 /* Enable Power Control clock */
  43.                 __HAL_RCC_PWR_CLK_ENABLE();

  44.                 /* The voltage scaling allows optimizing the power consumption when the device is
  45.                    clocked below the maximum system frequency, to update the voltage scaling value
  46.                    regarding system frequency refer to product datasheet.  */
  47.                 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);//电压缩放降低当器件处于工作状态时的功耗

  48. //                /* Get the Oscillators configuration according to the internal RCC registers */
  49. //                HAL_RCC_GetOscConfig(&RCC_OscInitStructure);

  50.                 /* After wake-up from STOP reconfigure the system clock: Enable HSI and PLL */
  51.                 RCC_OscInitStructure.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  52.                 RCC_OscInitStructure.HSEState = RCC_HSE_OFF;
  53.                 RCC_OscInitStructure.HSIState = RCC_HSI_ON;
  54.                 RCC_OscInitStructure.PLL.PLLState = RCC_PLL_ON;
  55.                 RCC_OscInitStructure.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  56.                 RCC_OscInitStructure.PLL.PLLMUL = RCC_PLLMUL_4;
  57.                 RCC_OscInitStructure.PLL.PLLDIV = RCC_PLLDIV_2;
  58.                 RCC_OscInitStructure.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;               
  59.                 ret = HAL_RCC_OscConfig(&RCC_OscInitStructure);
  60.                 if (ret != HAL_OK) while (1);

  61.                 /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
  62.                    clocks dividers */
  63.                 RCC_ClkInitStructure.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  64.                 RCC_ClkInitStructure.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  65.                 RCC_ClkInitStructure.AHBCLKDivider = RCC_SYSCLK_DIV1;
  66.                 RCC_ClkInitStructure.APB1CLKDivider = RCC_HCLK_DIV1;  
  67.                 RCC_ClkInitStructure.APB2CLKDivider = RCC_HCLK_DIV1;                 
  68.                 ret = HAL_RCC_ClockConfig(&RCC_ClkInitStructure, FLASH_LATENCY_1);
  69.                 if (ret != HAL_OK) while (1);
  70. }


  71. //设置进入stop mode之后rtc唤醒时间(s)
  72. static void Stop_rtc_config(uint32_t sleep)
  73. {
  74.                 /* Disable Wakeup Counter */
  75.                 HAL_RTCEx_DeactivateWakeUpTimer(&RTCHandle);
  76.        
  77.                 /*## Set wake up timer with interrupt */
  78.                 HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, sleep, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);//选择1Hz时钟
  79. }


  80. //进入stop之前外设设置
  81. static void System_config_before_stop(void)
  82. {
  83.                 HAL_StatusTypeDef ret = HAL_OK;

  84.                 GPIO_InitTypeDef GPIO_InitStructure;
  85.        
  86.                 /* Enable Ultra low power mode */
  87.                 HAL_PWREx_EnableUltraLowPower();//VREFINT 在低功耗模式下关闭

  88.                 /* Enable the fast wake up from Ultra low power mode */
  89.                 HAL_PWREx_EnableFastWakeUp();
  90.        
  91.                 /* Select HSI as system clock source after Wake Up from Stop mode */
  92.                 __HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI);

  93.                 /* Enable GPIOs clock */
  94.                 __HAL_RCC_GPIOA_CLK_ENABLE();
  95.                 __HAL_RCC_GPIOB_CLK_ENABLE();
  96.                 __HAL_RCC_GPIOC_CLK_ENABLE();
  97.        
  98.                 /* Configure all GPIO port pins in Analog Input mode (floating input trigger OFF) */
  99.                 GPIO_InitStructure.Pin = GPIO_PIN_All;
  100.                 GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
  101.                 GPIO_InitStructure.Pull = GPIO_NOPULL;
  102.                 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
  103.                 HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
  104.                 HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);

  105.                 /* Disable GPIOs clock */
  106.                 __HAL_RCC_GPIOA_CLK_DISABLE();
  107.                 __HAL_RCC_GPIOB_CLK_DISABLE();
  108.                 __HAL_RCC_GPIOC_CLK_DISABLE();

  109.                 /* Configure RTC 1Hz,LSE做RTC时钟*/
  110.                 RTCHandle.Instance = RTC;
  111.                 RTCHandle.Init.HourFormat = RTC_HOURFORMAT_24;
  112.                 RTCHandle.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;
  113.                 RTCHandle.Init.SynchPrediv = RTC_SYNCH_PREDIV;
  114.                 RTCHandle.Init.OutPut = RTC_OUTPUT_DISABLE;
  115.                 RTCHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  116.                 RTCHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  117.                 ret = HAL_RTC_Init(&RTCHandle);
  118.                 if (ret != HAL_OK) while (1);
  119. }


  120. /**
  121.   * @brief  System Clock Configuration
  122.   *         The system Clock is configured as follow :
  123.   *            System Clock source            = PLL (HSI)
  124.   *            SYSCLK(Hz)                     = 32000000
  125.   *            HCLK(Hz)                       = 32000000
  126.   *            AHB Prescaler                  = 1
  127.   *            APB1 Prescaler                 = 1
  128.   *            APB2 Prescaler                 = 1
  129.   *            HSI Frequency(Hz)              = 16000000
  130.   *            PLL_MUL                        = 4
  131.   *            PLL_DIV                        = 2
  132.   *            Flash Latency(WS)              = 1
  133.   *            Main regulator output voltage  = Scale1 mode
  134.   * [url=home.php?mod=space&uid=271674]@param[/url]  None
  135.   * @retval None
  136.   */
  137. //void systemClockConfig(void)
  138. static void SystemClockConfig_STOP(void)
  139. {
  140.                 HAL_StatusTypeDef ret = HAL_OK;
  141.                 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  142.                 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  143.                 /* Enable Power Control clock */
  144.                 __HAL_RCC_PWR_CLK_ENABLE();

  145.                 /* The voltage scaling allows optimizing the power consumption when the device is
  146.                  clocked below the maximum system frequency, to update the voltage scaling value
  147.                  regarding system frequency refer to product datasheet.  */
  148.                 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  149.                 /* Get the Oscillators configuration according to the internal RCC registers */
  150.                 HAL_RCC_GetOscConfig(&RCC_OscInitStruct);               
  151.                
  152.                 /* After wake-up from STOP reconfigure the system clock: Enable HSI and PLL */
  153.                 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  154.                 RCC_OscInitStruct.HSEState = RCC_HSE_OFF;
  155.                 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  156.                 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  157.                 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  158.                 RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL4;
  159.                 RCC_OscInitStruct.PLL.PLLDIV = RCC_PLL_DIV2;
  160.                 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  161.                 ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);
  162.                 if (ret != HAL_OK) while (1);

  163.                 /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
  164.                 clocks dividers */
  165.                 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
  166.                 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  167.                 ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
  168.                 if (ret != HAL_OK) while (1);
  169. }



复制代码
看了一些资料也没能搞清楚这多的电流是从哪里来的,有大佬知道吗

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2018-6-17
在线时间
57 小时
发表于 2021-1-2 18:00:01 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-15 10:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表