首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32学习-功耗控制sleep模式

STM32学习-功耗控制sleep模式

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


  • /*******************************************************************************
  • STM32学习日志(15)---- 功耗控制 sleep 模式
  • 编译环境:        EWARM V5.30
  • STM32 FW:        V3.0.0
  • 作者        :        szlihongtao
  • 时间        :          2016-07-17
  • 说明        :   全速运行,实测功耗为31mA,sleep,实测功耗为10mA,即降低了21mA的功耗
  • *******************************************************************************/
  • #include "stm32f10x.h"
  • #include "stm32_m.h"
  • //******************************************************************************
  • INT8U f_tb;
  • //******************************************************************************
  • static void delayms(INT16U cnt)
  • {
  •         INT16U i;
  •         while(cnt--)
  •                 for (i=0; i<7333; i++);
  • }
  • //******************************************************************************
  • // 时钟设置初始化
  • //******************************************************************************
  • static void RCC_Configuration(void)
  • {
  •   ErrorStatus HSEStartUpStatus;
  • /*
  • RCC_AdjustHSICalibrationValue 调整内部高速晶振(HSI)校准值
  • RCC_ITConfig 使能或者失能指定的RCC中断
  • RCC_ClearFlag 清除RCC的复位标志位
  • RCC_GetITStatus 检查指定的RCC中断发生与否
  • RCC_ClearITPendingBit 清除RCC的中断待处理位
  • */
  •           /* RCC system reset(for debug purpose) */
  •           // 时钟系统复位
  •           RCC_DeInit();
  •         // 使能外部的8M晶振
  •         // 设置外部高速晶振(HSE)
  •           /* Enable HSE */
  •           RCC_HSEConfig(RCC_HSE_ON);
  •         // 使能或者失能内部高速晶振(HSI)
  •         RCC_HSICmd(DISABLE);
  •         // 等待HSE起振
  •         // 该函数将等待直到HSE就绪,或者在超时的情况下退出
  •           /* Wait till HSE is ready */
  •           HSEStartUpStatus = RCC_WaitForHSEStartUp();
  •           if(HSEStartUpStatus == SUCCESS)
  •           {
  •             /* HCLK = SYSCLK */
  •                 // 设置AHB时钟(HCLK)
  •             RCC_HCLKConfig(RCC_SYSCLK_Div1);        // 72 MHz
  •             /* PCLK1 = HCLK/2 */
  •                 // 设置低速AHB时钟(PCLK1)
  •             RCC_PCLK1Config(RCC_HCLK_Div2);        // 36 MHz
  •             /* PCLK2 = HCLK */
  •                 // 设置高速AHB时钟(PCLK2)
  •             RCC_PCLK2Config(RCC_HCLK_Div1);        // 72 MHz
  •             /* ADCCLK = PCLK2/8 */
  •                 // 设置ADC时钟(ADCCLK)
  •                    RCC_ADCCLKConfig(RCC_PCLK2_Div8);
  •                 // 设置USB时钟(USBCLK)
  •                 // USB时钟 = PLL时钟除以1.5
  •                 RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);
  •                 // 设置外部低速晶振(LSE)
  •                 RCC_LSEConfig(RCC_LSE_OFF);
  •                 // 使能或者失能内部低速晶振(LSI)
  •                 // LSE晶振OFF
  •                 RCC_LSICmd(DISABLE);
  •                 // 设置RTC时钟(RTCCLK)
  •                 // 选择HSE时钟频率除以128作为RTC时钟
  •                 RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);
  •                 // 使能或者失能RTC时钟
  •                 // RTC时钟的新状态
  •                 RCC_RTCCLKCmd(DISABLE);
  •             /* Flash 2 wait state */
  •             FLASH_SetLatency(FLASH_Latency_2);
  •             /* Enable Prefetch Buffer */
  •             FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
  •             /* PLLCLK = 8MHz * 9 = 72 MHz */
  •                 // 设置PLL时钟源及倍频系数
  •             RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
  •             /* Enable PLL */
  •                 // 使能或者失能PLL
  •             RCC_PLLCmd(ENABLE);
  •             /* Wait till PLL is ready */
  •                 // 检查指定的RCC标志位设置与否
  •             while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  •             {
  •             }
  •             /* Select PLL as system clock source */
  •                 // 设置系统时钟(SYSCLK)
  •             RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  •             /* Wait till PLL is used as system clock source */
  •                 // 返回用作系统时钟的时钟源
  •             while(RCC_GetSYSCLKSource() != 0x08)
  •             {
  •             }
  •   }
  •         // 使能或者失能AHB外设时钟
  •         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1
  •                                                         |RCC_AHBPeriph_DMA2
  •                                                         |RCC_AHBPeriph_SRAM
  •                                                         |RCC_AHBPeriph_FLITF
  •                                                         |RCC_AHBPeriph_CRC
  •                                                         |RCC_AHBPeriph_FSMC
  •                                                         |RCC_AHBPeriph_SDIO,DISABLE);
  •         // 使能或者失能APB1外设时钟
  •         RCC_APB1PeriphClockCmd(RCC_APB1Periph_ALL,DISABLE);
  •         // 强制或者释放高速APB(APB2)外设复位
  •         RCC_APB2PeriphResetCmd(RCC_APB2Periph_ALL,ENABLE);
  •         // 退出复位状态
  •         RCC_APB2PeriphResetCmd(RCC_APB2Periph_ALL,DISABLE);
  •         // 强制或者释放低速APB(APB1)外设复位
  •         RCC_APB1PeriphResetCmd(RCC_APB1Periph_ALL,ENABLE);
  •         // 退出复位状态
  •         RCC_APB1PeriphResetCmd(RCC_APB1Periph_ALL,DISABLE);
  •         // 强制或者释放后备域复位
  •         RCC_BackupResetCmd(ENABLE);
  •         // 使能或者失能时钟安全系统
  •         RCC_ClockSecuritySystemCmd(DISABLE);
  • }
  • //******************************************************************************
  • // SysTick设置初始化
  • //******************************************************************************
  • static void SysTick_Config1(void)
  • {
  •         #define SystemFreq                72000000.0        // 单位为Hz
  •         #define TB_SysTick                50000.0                // 单位为uS
  •         INT32U ticks;
  •         ticks=(INT32U)((TB_SysTick/1000000.0)*SystemFreq);
  •         SysTick_Config(ticks);
  • }//******************************************************************************
  • // GPIO设置
  • //******************************************************************************
  • static void GPIO_Configuration(void)
  • {
  •         GPIO_InitTypeDef GPIO_InitStructure;
  •         // 使能或者失能APB2外设时钟
  •         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  •           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  •           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  •           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  •           GPIO_Init(GPIOB, &GPIO_InitStructure);
  • }
  • //******************************************************************************
  • static void myPWR_EnterSleepMode(void)
  • {
  • /*
  • 通过执行WFI或WFE指令进入睡眠状态。根据Cortex.-M3系统控制寄存器中的SLEEPONEXIT
  • 位的值,有两种选项可用于选择睡眠模式进入机制:
  • ● SLEEP-NOW:如果SLEEPONEXIT位被清除,当WRI或WFE被执行时,微控制器立即进
  • 入睡眠模式。
  • ● SLEEP-ON-EXIT:如果SLEEPONEXIT位被置位,系统从最低优先级的中断处理程序中退
  • 出时,微控制器就立即进入睡眠模式。
  • */
  •         NVIC_SystemLPConfig(NVIC_LP_SLEEPDEEP,DISABLE);
  •         NVIC_SystemLPConfig(NVIC_LP_SLEEPONEXIT,DISABLE);
  •         __WFI();                                                 /* Request Wait For Interrupt */
  • }
  • //******************************************************************************
  • // 主程序
  • //******************************************************************************
  • int main(void)
  • {
  •         INT8U i;
  •         RCC_Configuration();
  •           GPIO_Configuration();
  •         SysTick_Config1();
  •         for (i=0;i<100;++i)                        // 全速运行,实测功耗为31mA
  •         {
  •                 GPIOB->ODR ^= GPIO_Pin_1;        // led toogle
  •                 delayms(50);
  •         }
  • //------------------------------------------------------------------------------
  •         RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  •         for (;;)
  •         {
  •                 myPWR_EnterSleepMode();        // sleep,实测功耗为10mA
  •                 if (f_tb)
  •                 {
  •                         f_tb=0;
  •                         GPIOB->ODR ^= GPIO_Pin_1;// led toogle
  •                 }
  •         }
  • }
  • //******************************************************************************
  • #ifdef  USE_FULL_ASSERT
  • /**
  •   * @brief  Reports the name of the source file and the source line number
  •   *   where the assert_param error has occurred.
  •   * @param file: pointer to the source file name
  •   * @param line: assert_param error line source number
  •   * @retval : None
  •   */
  • void assert_failed(uint8_t* file, uint32_t line)
  • {
  •   /* User can add his own implementation to report the file name and line number,
  •      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  •   /* Infinite loop */
  •   while (1)
  •   {
  •   }
  • }
  • #endif
  • /**
  •   * @}
  •   */
  • //******************************************************************************
  • /******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/
  • //******************************************************************************

复制代码
返回列表