找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15428|回复: 12
打印 上一主题 下一主题
收起左侧

STM32学习-功耗控制sleep模式

  [复制链接]
跳转到指定楼层
楼主
ID:81272 发表于 2015-5-27 16:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
完整程序源代码工程文件下载地址: 功耗控制sleep模式.rar (122.79 KB, 下载次数: 120)

  1. /*******************************************************************************

  2. STM32学习日志(15)---- 功耗控制 sleep 模式

  3. 编译环境:        EWARM V5.30
  4. STM32 FW:        V3.0.0
  5. 作者        :        szlihongtao
  6. 时间        :          2016-07-17
  7. 说明        :   全速运行,实测功耗为31mA,sleep,实测功耗为10mA,即降低了21mA的功耗
  8. *******************************************************************************/
  9. #include "stm32f10x.h"
  10. #include "stm32_m.h"
  11. //******************************************************************************
  12. INT8U f_tb;
  13. //******************************************************************************
  14. static void delayms(INT16U cnt)
  15. {
  16.         INT16U i;

  17.         while(cnt--)
  18.                 for (i=0; i<7333; i++);
  19. }
  20. //******************************************************************************
  21. // 时钟设置初始化
  22. //******************************************************************************
  23. static void RCC_Configuration(void)
  24. {
  25.   ErrorStatus HSEStartUpStatus;
  26. /*
  27. RCC_AdjustHSICalibrationValue 调整内部高速晶振(HSI)校准值
  28. RCC_ITConfig 使能或者失能指定的RCC中断
  29. RCC_ClearFlag 清除RCC的复位标志位
  30. RCC_GetITStatus 检查指定的RCC中断发生与否
  31. RCC_ClearITPendingBit 清除RCC的中断待处理位
  32. */
  33.           /* RCC system reset(for debug purpose) */
  34.           // 时钟系统复位
  35.           RCC_DeInit();

  36.         // 使能外部的8M晶振
  37.         // 设置外部高速晶振(HSE)
  38.           /* Enable HSE */
  39.           RCC_HSEConfig(RCC_HSE_ON);

  40.         // 使能或者失能内部高速晶振(HSI)
  41.         RCC_HSICmd(DISABLE);

  42.         // 等待HSE起振
  43.         // 该函数将等待直到HSE就绪,或者在超时的情况下退出
  44.           /* Wait till HSE is ready */
  45.           HSEStartUpStatus = RCC_WaitForHSEStartUp();

  46.           if(HSEStartUpStatus == SUCCESS)
  47.           {
  48.             /* HCLK = SYSCLK */
  49.                 // 设置AHB时钟(HCLK)
  50.             RCC_HCLKConfig(RCC_SYSCLK_Div1);        // 72 MHz

  51.             /* PCLK1 = HCLK/2 */
  52.                 // 设置低速AHB时钟(PCLK1)
  53.             RCC_PCLK1Config(RCC_HCLK_Div2);        // 36 MHz

  54.             /* PCLK2 = HCLK */
  55.                 // 设置高速AHB时钟(PCLK2)
  56.             RCC_PCLK2Config(RCC_HCLK_Div1);        // 72 MHz

  57.             /* ADCCLK = PCLK2/8 */
  58.                 // 设置ADC时钟(ADCCLK)
  59.                    RCC_ADCCLKConfig(RCC_PCLK2_Div8);

  60.                 // 设置USB时钟(USBCLK)
  61.                 // USB时钟 = PLL时钟除以1.5
  62.                 RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);

  63.                 // 设置外部低速晶振(LSE)
  64.                 RCC_LSEConfig(RCC_LSE_OFF);

  65.                 // 使能或者失能内部低速晶振(LSI)
  66.                 // LSE晶振OFF
  67.                 RCC_LSICmd(DISABLE);

  68.                 // 设置RTC时钟(RTCCLK)
  69.                 // 选择HSE时钟频率除以128作为RTC时钟
  70.                 RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);

  71.                 // 使能或者失能RTC时钟
  72.                 // RTC时钟的新状态
  73.                 RCC_RTCCLKCmd(DISABLE);

  74.             /* Flash 2 wait state */
  75.             FLASH_SetLatency(FLASH_Latency_2);

  76.             /* Enable Prefetch Buffer */
  77.             FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

  78.             /* PLLCLK = 8MHz * 9 = 72 MHz */
  79.                 // 设置PLL时钟源及倍频系数
  80.             RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

  81.             /* Enable PLL */
  82.                 // 使能或者失能PLL
  83.             RCC_PLLCmd(ENABLE);

  84.             /* Wait till PLL is ready */
  85.                 // 检查指定的RCC标志位设置与否
  86.             while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  87.             {
  88.             }

  89.             /* Select PLL as system clock source */
  90.                 // 设置系统时钟(SYSCLK)
  91.             RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  92.             /* Wait till PLL is used as system clock source */
  93.                 // 返回用作系统时钟的时钟源
  94.             while(RCC_GetSYSCLKSource() != 0x08)
  95.             {
  96.             }
  97.   }

  98.         // 使能或者失能AHB外设时钟
  99.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1
  100.                                                         |RCC_AHBPeriph_DMA2
  101.                                                         |RCC_AHBPeriph_SRAM
  102.                                                         |RCC_AHBPeriph_FLITF
  103.                                                         |RCC_AHBPeriph_CRC
  104.                                                         |RCC_AHBPeriph_FSMC
  105.                                                         |RCC_AHBPeriph_SDIO,DISABLE);
  106.         // 使能或者失能APB1外设时钟
  107.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_ALL,DISABLE);

  108.         // 强制或者释放高速APB(APB2)外设复位
  109.         RCC_APB2PeriphResetCmd(RCC_APB2Periph_ALL,ENABLE);
  110.         // 退出复位状态
  111.         RCC_APB2PeriphResetCmd(RCC_APB2Periph_ALL,DISABLE);

  112.         // 强制或者释放低速APB(APB1)外设复位
  113.         RCC_APB1PeriphResetCmd(RCC_APB1Periph_ALL,ENABLE);
  114.         // 退出复位状态
  115.         RCC_APB1PeriphResetCmd(RCC_APB1Periph_ALL,DISABLE);

  116.         // 强制或者释放后备域复位
  117.         RCC_BackupResetCmd(ENABLE);

  118.         // 使能或者失能时钟安全系统
  119.         RCC_ClockSecuritySystemCmd(DISABLE);
  120. }
  121. //******************************************************************************
  122. // SysTick设置初始化
  123. //******************************************************************************
  124. static void SysTick_Config1(void)
  125. {
  126.         #define SystemFreq                72000000.0        // 单位为Hz
  127.         #define TB_SysTick                50000.0                // 单位为uS

  128.         INT32U ticks;

  129.         ticks=(INT32U)((TB_SysTick/1000000.0)*SystemFreq);
  130.         SysTick_Config(ticks);
  131. }//******************************************************************************
  132. // GPIO设置
  133. //******************************************************************************
  134. static void GPIO_Configuration(void)
  135. {
  136.         GPIO_InitTypeDef GPIO_InitStructure;

  137.         // 使能或者失能APB2外设时钟
  138.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  139.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  140.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  141.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  142.           GPIO_Init(GPIOB, &GPIO_InitStructure);
  143. }
  144. //******************************************************************************
  145. static void myPWR_EnterSleepMode(void)
  146. {
  147. /*
  148. 通过执行WFI或WFE指令进入睡眠状态。根据Cortex.-M3系统控制寄存器中的SLEEPONEXIT
  149. 位的值,有两种选项可用于选择睡眠模式进入机制:
  150. ● SLEEP-NOW:如果SLEEPONEXIT位被清除,当WRI或WFE被执行时,微控制器立即进
  151. 入睡眠模式。
  152. ● SLEEP-ON-EXIT:如果SLEEPONEXIT位被置位,系统从最低优先级的中断处理程序中退
  153. 出时,微控制器就立即进入睡眠模式。
  154. */
  155.         NVIC_SystemLPConfig(NVIC_LP_SLEEPDEEP,DISABLE);
  156.         NVIC_SystemLPConfig(NVIC_LP_SLEEPONEXIT,DISABLE);
  157.         __WFI();                                                 /* Request Wait For Interrupt */
  158. }
  159. //******************************************************************************
  160. // 主程序
  161. //******************************************************************************
  162. int main(void)
  163. {
  164.         INT8U i;

  165.         RCC_Configuration();
  166.           GPIO_Configuration();
  167.         SysTick_Config1();

  168.         for (i=0;i<100;++i)                        // 全速运行,实测功耗为31mA
  169.         {
  170.                 GPIOB->ODR ^= GPIO_Pin_1;        // led toogle
  171.                 delayms(50);
  172.         }
  173. //------------------------------------------------------------------------------
  174.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  175.         for (;;)
  176.         {
  177.                 myPWR_EnterSleepMode();        // sleep,实测功耗为10mA
  178.                 if (f_tb)
  179.                 {
  180.                         f_tb=0;
  181.                         GPIOB->ODR ^= GPIO_Pin_1;// led toogle
  182.                 }
  183.         }
  184. }
  185. //******************************************************************************
  186. #ifdef  USE_FULL_ASSERT

  187. /**
  188.   * @brief  Reports the name of the source file and the source line number
  189.   *   where the assert_param error has occurred.
  190.   * @param file: pointer to the source file name
  191.   * @param line: assert_param error line source number
  192.   * @retval : None
  193.   */
  194. void assert_failed(uint8_t* file, uint32_t line)
  195. {
  196.   /* User can add his own implementation to report the file name and line number,
  197.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  198.   /* Infinite loop */
  199.   while (1)
  200.   {
  201.   }
  202. }
  203. #endif

  204. /**
  205.   * @}
  206.   */
  207. //******************************************************************************
  208. /******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/
  209. //******************************************************************************

复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:96950 发表于 2015-11-24 15:03 | 只看该作者
请教楼主,您的功耗是如何测量的?
回复

使用道具 举报

板凳
ID:1 发表于 2015-12-7 06:25 | 只看该作者
Jsir 发表于 2015-11-24 15:03
请教楼主,您的功耗是如何测量的?

用万用表测电流
回复

使用道具 举报

地板
ID:99124 发表于 2015-12-10 13:20 | 只看该作者
sleep下systick停不停啊?
回复

使用道具 举报

5#
ID:114936 发表于 2016-4-18 14:40 | 只看该作者
谢谢分享,
回复

使用道具 举报

6#
ID:138166 发表于 2016-9-1 15:24 | 只看该作者





完整程序源代码工程文件下载地址:  功耗控制sleep模式.rar (122.79 KB, 下载次数: 26)   
回复

使用道具 举报

7#
ID:158012 发表于 2016-12-27 13:13 | 只看该作者
kidlu1412 发表于 2016-9-1 15:24
**** 作者被禁止或删除 内容自动屏蔽 ****

谢谢您的分享
回复

使用道具 举报

8#
ID:161252 发表于 2017-1-11 09:15 | 只看该作者
感谢楼主分享!!!
回复

使用道具 举报

9#
ID:232462 发表于 2018-1-5 16:57 | 只看该作者
感谢楼主分享
回复

使用道具 举报

10#
ID:322741 发表于 2018-5-5 13:58 | 只看该作者
感谢,正好可以参考参考
回复

使用道具 举报

11#
ID:475858 发表于 2019-9-18 13:48 | 只看该作者
分享非常好
回复

使用道具 举报

12#
ID:384006 发表于 2020-6-11 00:25 | 只看该作者
没多大用
回复

使用道具 举报

13#
ID:777315 发表于 2020-6-12 15:00 | 只看该作者
这个功耗有多少??
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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