zoukankan      html  css  js  c++  java
  • STM32电源管理

    

    (1)3时钟模式

    ①睡眠模式②停止模式③待机模式

    1.睡眠模式:Cortex-M3内核(理解为CPU)停止工作,CPU供电1.8V有着,周边任何执行。执行

    2.停机模式:全部时钟都停止,CPU电源1.8V没断。唤醒后从原来位置运行

    3.待机模式:时钟全断,CPU电源1.8V也断,唤醒后程序又一次运行

    可形象參考:

    CPU:皇上

    CPU电源1.8V:皇后

    外设:将军

    那么:

    1.睡眠模式:仅仅有皇上睡觉

    2.停机模式:皇上,将军睡觉

    3.待机模式:皇上,皇后。将军全睡觉了

    (原则:皇后不睡觉,程序可被保留,唤醒后从原来位置运行)

    (二)程序简单介绍(库函数)

    1.睡眠模式

    	while(1)                            
    	{			
    		/* wait interrupt */
    		LED1( ON );			
    		Delay(0xFFFFF);
    		LED1( OFF );		  
    
    		LED2( ON );			  
    		Delay(0xFFFFF);
    		LED2( OFF );		  
    
    		LED3( ON );			 
    		Delay(0xFFFFF);
    		LED3( OFF );		  	   
    		
    		__WFI();					
    	}
    

     __WFI(); 进入睡眠模式,随意中断唤醒。唤醒后不用再配置时钟

    2.停止模式

    ①/*由于要使用其外设时钟等。故需用到pwr*/

    #include "stm32f10x_pwr.h" 
    

    ②/*使能电源管理单元的时钟*/

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
    

    ③进入停止模式

    PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
    

    ④唤醒:外部中断

    由于将军睡了,(及外设时钟关了,因此须要又一次配置)唤醒后须要又一次启动HSE

    SYSCLKConfig_STOP(); 

    void SYSCLKConfig_STOP(void)
    {
    	ErrorStatus HSEStartUpStatus;
      /* 使能 HSE */
      RCC_HSEConfig(RCC_HSE_ON);
    
      /* 等待HSE准备就绪*/
      HSEStartUpStatus = RCC_WaitForHSEStartUp();
    
      if(HSEStartUpStatus == SUCCESS)
      {
    
        /* 使能 PLL */ 
        RCC_PLLCmd(ENABLE);
    
        /* 等待 PLL 准备就绪 */
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
        {
        }
    
        /* 选择PLL作为系统时钟源*/
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    
        /*等待PLL被选择为系统时钟源 */
        while(RCC_GetSYSCLKSource() != 0x08)
        {
        }
      }
    }
    

     3.待机模式

    ①/*由于要使用其外设时钟等,故需用到pwr*/

    #include "stm32f10x_pwr.h" 
    

    ②/*使能电源管理单元的时钟*/

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
    

    ③进入待机模式

    /*使能WKUP引脚的唤醒功能,WKUP是第二功能。不用配置它的输出模式(不是太懂)*/
    PWR_WakeUpPinCmd (ENABLE);
    /*进入待机模式*/
    PWR_EnterSTANDBYMode();
    

    ④唤醒,复位唤醒。PA0上升沿唤醒

    ⑤检測是复位唤醒还是PA0上升沿唤醒

    if(PWR_GetFlagStatus(PWR_FLAG_WU) == SET)
    {
      printf("
     PA0上升沿唤醒
    ");
    
    }
    else
      printf("
     其它
    ");
    

     由于待机唤醒程序从头运行,故不用多加配置时钟的函数了

                                                          狂人用脑子

    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    LeetCode Find Duplicate File in System
    LeetCode 681. Next Closest Time
    LeetCode 678. Valid Parenthesis String
    LeetCode 616. Add Bold Tag in String
    LeetCode 639. Decode Ways II
    LeetCode 536. Construct Binary Tree from String
    LeetCode 539. Minimum Time Difference
    LeetCode 635. Design Log Storage System
    LeetCode Split Concatenated Strings
    LeetCode 696. Count Binary Substrings
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4850976.html
Copyright © 2011-2022 走看看