• 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("
     其他
    ");
    

     因为待机唤醒程序从头执行,故不用多加配置时钟的函数了

                                                          瘋子随记

  • 相关阅读:
    Day9
    详解大端模式和小端模式
    gcc常用命令
    Vim自动补全插件----YouCompleteMe安装与配置
    Linux gdb调试器用法全面解析
    JavaSE——javac、javap、jad
    intellij IDEA 常用快捷键
    生成heap dump
    JVM——九大工具助你玩转Java性能优化
    JVM——参数设置、分析
  • 原文地址:https://www.cnblogs.com/Ph-one/p/4026775.html
Copyright © 2020-2023  润新知