精华内容
下载资源
问答
  • stm32待机模式

    2021-03-03 10:25:04
    #endif wake.c #include "wakeup.h" #include "stm32f10x_pwr.h" /******************************************************************************* * 函 数 名 : Enter_Standby_Mode * 函数功能 : 待机模式函数...

    1、 运行结果

    在这里插入图片描述

    2、源代码

    (1)、目录结构

    在这里插入图片描述

    (2)、主函数

    #include "MyLed.h"
    
    #include "delayms.h"
    
    #include "MyUsart.h"
    
    #include "wakeup.h"
    
    /*******************************************************************************
     * 函 数 名         : main
     * 函数功能         : 主函数入口
     * 输    入         : 无
     * 输    出         : 无
     *******************************************************************************/
    int main(void) {
    	
        LED_Init();
    		delay_ms(50);
    		init__uart1(9600);
    		delay_ms(50);
    		NVIC_Config();
    		delay_ms(50);
        printf("测试进入待机模式\r\n");
        delay_ms(100);
        while (1) {
            printf("延时 5s \r\n");
            GPIO_ResetBits(LEDPORT, LED1);
            delay_ms(10000);
    
            printf("延时 4s \r\n");
            GPIO_SetBits(LEDPORT, LED1);
            delay_ms(10000);
    
            printf("延时 3s \r\n");
            GPIO_ResetBits(LEDPORT, LED1);
            delay_ms(10000);
    
            printf("延时 2s \r\n");
            GPIO_SetBits(LEDPORT, LED1);
            delay_ms(10000);
    
            printf("延时 1s \r\n");
            GPIO_ResetBits(LEDPORT, LED1);
    			
            delay_ms(10000);
            printf("进入待机模式 \r\n");
            Enter_Standby_Mode();                     //待机模式函数入口
        }
    }
    

    (3)、wake文件

    wake.h

    #ifndef __WAKE__H
    #define __WAKE__H
    
    
    void Enter_Standby_Mode(void);
    
    #endif
    
    wake.c
    
    #include "wakeup.h"
    
    #include "stm32f10x_pwr.h"
    
    
    
    /*******************************************************************************
     * 函 数 名         : Enter_Standby_Mode
     * 函数功能         : 待机模式函数入口
     * 输    入         : 无
     * 输    出         : 无
     *******************************************************************************/
    void Enter_Standby_Mode()
    {
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
    	
    	//设置唤醒源
    	PWR_WakeUpPinCmd(ENABLE);
    	//清除wake-up标志位
    	PWR_ClearFlag(PWR_FLAG_WU);
    	//进入待机模式
    	PWR_EnterSTANDBYMode();
    }
    

    (4)、退出待机模式

    A0引脚接高电平即可唤醒。

    展开全文
  • stm32 待机模式

    2017-08-13 17:07:07
    低功耗模式 降低系统时钟速度 不使用APBx和AHB外设时,将对应的外设时钟关闭 睡眠模式(Cortex™-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍... 待机模式(1.8V内核电源关闭)

    低功耗模式

    降低系统时钟速度
    不使用APBx和AHB外设时,将对应的外设时钟关闭

    睡眠模式(Cortex™-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行)
    停止模式(所有的时钟都已停止)
    待机模式(1.8V内核电源关闭)

    1

    待机模式配置步骤

    1.使能电源时钟
    2.设置WKUP引脚为唤醒源
    3.进入待机模式

    举例

    void WKUP_init()
    {
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能电源时钟
    
        PWR_WakeUpPinCmd(ENABLE); //设置WKUP引脚为唤醒源
    
        PWR_EnterSTANDBYMode(); //进入待机模式
    }

    当进入待机模式,仿真器无法再次下载程序,可以使用usb下载更新

    展开全文
  • STM32待机模式测试

    2019-05-05 10:38:05
    STM32待机模式测试
                   

    STM32待机模式测试


    本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.


    参考链接:http://www.docin.com/p-114352411.html


    环境:

    主机:XP

    开发环境:MDK4.10

    单片机:STM32F103C8


    功能:

    开启RTC闹钟,然后进入待机模式,用闹钟唤醒后退出.


    说明:

    1.RTC闹钟唤醒事件发生时,同时进入闹钟中断,必须在初始化时与外部中断线17关联

    2.如果仅想退出待机模式,RTC闹钟事件已经足够,不必与外部中断线17关联

    3.退出待机模式后,接下来的流程类似于按下复位按键,程序会从头开始执行


    源代码:

    初始化时钟,配置时钟为内部时钟LSI,配置RTC闹钟唤醒以及外部中断线17

    void RTC_Configuration(void)//定义中断结构体 NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure;   //中断时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //中断优先级配置 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //设置RTC闹钟中断 NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //闹钟中断接到第17线外部中断    EXTI_ClearITPendingBit(EXTI_Line17);    EXTI_InitStructure.EXTI_Line = EXTI_Line17; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE;    EXTI_Init(&EXTI_InitStructure); //PWR_WakeUpPinCmd(DISABLE);   //电源管理部分时钟开启 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能后备寄存器访问   PWR_BackupAccessCmd(ENABLE); BKP_ClearFlag();   BKP_DeInit();   //使能LSI   RCC_LSICmd(ENABLE);   //等待晶振启动 while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) {} //设置时钟为内部晶振 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);   RCC_RTCCLKCmd(ENABLE); //等待RTC_CTL寄存器中的RSF位(寄存器同步标志)被硬件置1 RTC_WaitForSynchro();   RTC_WaitForLastTask(); //使能闹钟中断 RTC_ITConfig(RTC_IT_ALR, ENABLE); RTC_WaitForLastTask(); //分频系数   RTC_SetPrescaler(40000); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */ RTC_WaitForLastTask(); //初始计数值 RTC_SetCounter(0); RTC_WaitForLastTask(); //设置闹钟时间   RTC_SetAlarm(2);   RTC_WaitForLastTask();}

    闹钟唤醒中断代码:

    void RTCAlarm_IRQHandler(void){     //等待RTC_CTL寄存器中的RSF位(寄存器同步标志)被硬件置1 RTC_WaitForSynchro();  if (RTC_GetITStatus(RTC_IT_ALR) != RESET)  {   USART_SendData(USART1,'d');                              //发送数据 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束 USART_SendData(USART1,'i');                              //发送数据 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束 // 清EXTI_Line17挂起位    EXTI_ClearITPendingBit(EXTI_Line17);    // 检查唤醒标志是否设置    if(PWR_GetFlagStatus(PWR_FLAG_WU) != RESET)    {        // 清除唤醒标志        PWR_ClearFlag(PWR_FLAG_WU);    }    /* Clear the RTC Second interrupt */    RTC_SetCounter(0); RTC_WaitForLastTask();    RTC_ClearITPendingBit(RTC_IT_ALR); RTC_WaitForLastTask();   //RTC_SetAlarm(2);   //RTC_WaitForLastTask();  }  return;}

    测试代码:(这是工程中的一部分,包含一些无关代码)

    int main(void){    struct _match_string_header match_string_header; struct _match_string_tail match_string_tail; unsigned char buffer[LEN_BUF]; unsigned char buffer1[LEN_BUF]; int len = 0int i = 0int j = 0int flag = 0int flag2 = 0int flag3 = 0int baud = 0unsigned short temp = 0;  //初始化系统 init(); //初始化蓝牙 //读取flash中波特率 //write_baud(&edit_flash,9600); //baud = read_baud(&edit_flash); //读取有效 if (baud > 0) {   set_uart_baud(1,baud);  set_uart_baud(2,baud); } else {  //设置默认波特率  set_uart_baud(1,DEFAULT_BAUD);    set_uart_baud(2,DEFAULT_BAUD); } //设置默认波特率 //Delay(10); init_blue(DEFAULT_BAUD); set_uart_baud(1,DEFAULT_BAUD); set_uart_baud(2,DEFAULT_BAUD); //Delay(500); init_blue(DEFAULT_BAUD); set_uart_baud(1,DEFAULT_BAUD); set_uart_baud(2,DEFAULT_BAUD); //初始化匹配字符 init_match_string_header(&match_string_header,"AT+BAUD"); init_match_string_tail(&match_string_tail,"END",8); //读取2号备份寄存器中的值 temp = BKP_ReadBackupRegister(BKP_DR2); if (temp == 0xabcd) {  USART_SendData(USART1,'j');                              //发送数据  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束  USART_SendData(USART1,'d');                              //发送数据  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束  USART_SendData(USART1,'h');                              //发送数据  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束 } else {  //写入2号备份寄存器  BKP_WriteBackupRegister(BKP_DR2,0xabcd);     USART_SendData(USART1,'9');                              //发送数据  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束  USART_SendData(USART1,'9');                              //发送数据  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束 } //测试低功耗:待机模式 for (i = 0;i < 30000;i++) {  for (j = 0;j < 500;j++)  {    __nop();  } } PWR_EnterSTANDBYMode(); while (1);}




               
    展开全文
  • stm32待机模式和停机模式

    千次阅读 2019-05-15 21:22:04
    出处:stm32待机模式和停机模式 这两天研究了STM32的低功耗知识,低功耗里主要研究的是STM32的待机模式和停机模式。让单片机进入的待机模式和停机模式比较容易,实验中通过设置中断口PA1来响应待机和停机模式。 ...

    出处:stm32待机模式和停机模式

    这两天研究了STM32的低功耗知识,低功耗里主要研究的是STM32的待机模式和停机模式。让单片机进入的待机模式和停机模式比较容易,实验中通过设置中断口PA1来响应待机和停机模式。

    void EXTI1_IRQHandler(void)
    {
    if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1))
    {
    delay_ms(10);
    while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1));
    if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1))
    {
    EXTI_ClearITPendingBit(EXTI_Line1);

    RTC_SetAlarm(RTC_GetCounter()+4);  //设置4S后闹钟唤醒
    RTC_ITConfig(RTC_IT_ALR, ENABLE);//使能闹钟中断. 
    RTC_WaitForLastTask();//等待上一次写RTC任务完成

    Standby();             //进入待机(停机)状态
    }
    }

    }


    void Standby()
    {
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR , ENABLE);//开电源管理时钟PWR_Regulator_LowPower

    PWR_WakeUpPinCmd(ENABLE);//使能唤醒引脚,默认PA0

             PWR_EnterSTANDBYMode();//进入待机
              //PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI|PWR_STOPEntry_WFE);//进入停机
    }


    进入的待机模式和停机模式很简单,基本一样。那么问题来了。

    主要问题有:

    1:如何对他们进行唤醒?

    2:唤醒的闹钟中断能否执行?

    2:唤醒后的程序入口在哪?

    通过各种实验和查资料,得到了如下结论:(本实验通过设定RTC_SetAlarm(RTC_GetCounter()+4); 为设置4S后进行闹钟唤醒,并开启闹钟中断,手册中可以查到闹钟中断能产生唤醒,故用闹钟中断进行实验)

    先研究待机模式下的唤醒,在闹钟中断函数如下:

    void RTCAlarm_IRQHandler(void)
    {
    if(RTC_GetFlagStatus(RTC_IT_ALR))
    {
      RTC_ClearITPendingBit(RTC_IT_ALR);
      RTC_WaitForLastTask(); 
    EXTI_ClearITPendingBit(EXTI_Line17);


            if(PWR_GetFlagStatus(PWR_FLAG_WU) != RESET)
            {
    PWR_ClearFlag(PWR_FLAG_WU);
            }
    GPIO_WriteBit(GPIOA, GPIO_Pin_5, 0);//LED指示

    }
    }

    实验结果:PA5的LED不指示,并且从其他LED灯的指示可以知道程序又重新开始运行。也就是被复位。

    因此待机模式下的唤醒结论如下:

    1:唤醒形式直接产生闹钟中断就能唤醒。

    2:唤醒后不会进入闹钟中断函数

    3:唤醒后程序复位,重新执行

    再研究停机模式下的唤醒,停机模式唤醒和待机唤醒差别很大,开始还以为两者相同,停机唤醒相对复杂些,中途调试了很长时间,才明白了停机唤醒的过程,贴上闹钟中断程序如下:

    char Wakeflag=0;

    void RTCAlarm_IRQHandler(void)
    {
    if(RTC_GetFlagStatus(RTC_IT_ALR))
    {
    EXTI_ClearITPendingBit(EXTI_Line17);
    RTC_ClearITPendingBit(RTC_IT_ALR);
    RTC_WaitForLastTask(); 
    EXTI_ClearITPendingBit(EXTI_Line7);
    EXTI_ClearITPendingBit(EXTI_Line1);//对于程序可能产生的标志位必须的清除干净,不清除会出现唤醒失灵现象!!

          if(PWR_GetFlagStatus(PWR_FLAG_WU) != RESET)
            {
    PWR_ClearFlag(PWR_FLAG_WU);//一般没用
            }
    SystemInit();//重要,由于停机下对所有时钟关闭,所以唤醒需要重新配置时钟!!

           Wakeflag=!Wakeflag;
    GPIO_WriteBit(GPIOA, GPIO_Pin_5, Wakeflag);//LED灯指示

    }
    }

    相比待机的闹钟中断是不复杂了很多,停机模式下的唤醒的中断函数需要注意这两点(能得到这两点,耗费了大量时间,终于还是搞定了,嗨皮!!):

    1:重要,对于程序可能产生的标志位必须的清除干净,不清除会出现唤醒失灵现象!!

    2:重要,由于停机下对所有时钟关闭,所以唤醒需要重新配置时钟!!

    实验现象:LED可以产生开通与关断的效果。并且从其他LED的指示可以看到程序没有被复位,而是继续原来运行。

    因此停机模式下的唤醒结论如下:

    1:唤醒形式产生闹钟中断不一定就唤醒,需要对任何可能的标志位清楚,并且时钟要重新配置。

    2:唤醒后进入闹钟中断函数

    3:唤醒后程序进入闹钟中断函数,然后再进入原来停机的位置继续运行。没有复位,单片机寄存器里的各种变量值仍然保留!!
    --------------------- 
    作者:ludaoyi123 
    来源:CSDN 
    原文:https://blog.csdn.net/ludaoyi88/article/details/50834303 
    版权声明:本文为博主原创文章,转载请附上博文链接!

     

     

    tm32f103有3种低功耗模式,本文叙述的是功耗最低的待机模式(STANBY)

    1.触发MCU进入低功耗模式根据应用的不同会有不同的方式,本文只是叙述如何配置进入待机模式的低功耗状态,如下代码所示

    1)使能PWR时钟

    2)置位PER->CR寄存器(这句的作用是使芯片可以反复进入待机模式)

    3)使能MCU的WakeUp引脚(stm32f103 的引脚是PA0),这个引脚貌似不用配置,当配置了待机模式以后,系统会检测符合唤醒的几个条件。本文采用的是检测WakeUp引脚(PA0)的上升沿。 

    4)使MCU进入待机模式。当MCU检测到WakeUP引脚(PA0)有上升沿时会被唤醒,系统会重新加载代码,和复位功能一样。

         __HAL_RCC_PWR_CLK_ENABLE();//(1)
            
           SET_BIT(PWR->CR, PWR_CR_CWUF);//(2)
           HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);//(3)
        
        HAL_PWR_EnterSTANDBYMode();//(4)

    --------------------- 
    作者:cxybc 
    来源:CSDN 
    原文:https://blog.csdn.net/u010277683/article/details/79011925 
    版权声明:本文为博主原创文章,转载请附上博文链接!

     

     

    项目背景 
    目标:进入低功耗模式120s左右唤醒。 
    结果:完成低功耗驱动,完成RTC定时驱动,完成目标; 
    Tip:使用一个新的模块时应主要参考官方文档和官方例程,有问题再上网寻找思路;(本文使用的例程在最后 ) 
    环境:STM32F205、 IAR6.7、J-Link 
    附:因为考虑到项目以后需要移植到 stm32F0系列上,而且 stm32F0系列没有 backup SRAM,所以这部分驱动不使用 backup SRAM;

    注意:看门狗是不能开启的,否则会在sleep时watch dog重启; 
    一、STOP模式 +RTC 
    STOP模式: 可以理解为程序进入STOP模式后会暂停运行,直到中断触发退出STOP模式,程序会从刚刚停止的地方继续运行; 
    代码思路 : 
    1.进入低功耗模式之前,我们首先要关闭所有外设 ; 
    2.参考官方例程,对官方例程中的RTC 1s唤醒一次,修改里面的时钟配置,得到RTC 120s唤醒; 
    所以重点是时钟配置: 
    时钟选择 LSE(外部时钟),比LSI(内部时钟)更为精准;根据自己使用的晶振不同,有不同的频率。我的时钟源是 32.768kHz; 
    查看官方 STM32F205 参考手册(RM0033) 22.3 章节可知, 
    RTC wakeup时钟可以有各种 2,4,8,16分频选择,也可以自己配置分频; 
    但是 wakeup的计数寄存器只有 0-0xFFFF,计算一下,如果是32.768kHz的16分频,也就是 
    频率 32.768kHz */16=2048Hz 
    那么 即使计数寄存器走满,也只有 
    0xFFFF/2048Hz=31秒 
    才31秒! 
    这么短算什么男人! 
    区区31秒不能满足我们! 
    额,是不能满足的120s定时唤醒的要求。不过没关系,自己动手,丰衣足食。 
    那就只能自己配置分频了,计算公式都在手册上:

     
    上面的这个RTCCLK = 32.768kHz,PREDIV_S配置为 07,PREDIV_A配置为 07, 
    分频结果时钟是 512hz; 
    然后设置 RTC_WAKEUPCOUNTER(TIME * 512); 时钟配置结束 
    3.打开RTC wakeup 
    4.进入 STOP mode,设置WFI 
    这时要注意,进入STOP模式可以理解为程序会暂停,直到中断触发退出STOP模式,程序会从刚刚停止的地方继续运行; 
    5.默默等待120s,good,RTC中断触发了; 
    6.关闭RTCwakeup,并且反初始化RTC相关(就是各种不使能); 
    7.恢复之前关闭的外设;(大功告成)

    二、STANDBY模式 +RTC 
    STANDBY 模式是最极限的低功耗模式了,内部SRAM也会断电,换句话说,进入STANDBY 模式再唤醒是和重启一样的,所有在SRAM中的参数都会丢失,程序从头开始; 
    代码思路和STOP模式基本一致,但是有个很大的坑在这里面: 
    基本流程:程序正在运行->配置并且开启RTC中断->进入STANDBY 模式->RTC中断->程序从头开始运行 
    以为这样就行了?图样图森破!忘记了之前开启RTC中断!这个中断并没有关!所以一定要在程序从头开始运行的时候把RTC中断关上。 
    很简单,在开头加上一点处理: 
    ⑴使能时钟 APB1Periph PWR 
    ⑵允许配置RTC 
    ⑶然后就是关关关 RTC 时钟,RTCwakeup使能!中断使能等等!!!

    最后是源码,要啥源码?不就是 ST的官方例程嘛。(手动滑稽)
    --------------------- 
    作者:笑斐戈 
    来源:CSDN 
    原文:https://blog.csdn.net/u011513506/article/details/52640455 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • 芯嵌STM32入门系列教程之二十三《STM32待机模式的使用》1
  • STM32待机模式唤醒测试以及独立看门狗测试
  • STM32待机模式学习笔记

    千次阅读 2014-09-05 14:17:33
    STM32待机模式学习笔记  STM32内置低功耗模式,在系统或电源复位之后,微控制器处于运行状态,当CPU不需要继续运行时,可以利用多种低功耗模式来节省功耗。例如,等待某个外部事件,用户需要更具最低电源功耗,最...
  • Stm32待机模式的进入与唤醒

    千次阅读 2018-08-11 21:27:01
    1-1:单片机的“低功耗模式”,像是手机的待机模式,不同于正常运行模式,处于一种省电省资源的状态 1-2:在运行情况下,HCLK为cpu提供时钟,cortex-m3内核执行程序的代码,如果处于中断事件的等待时,可以进入低...
  • STM32 待机模式与看门狗和谐相处

    千次阅读 2019-09-03 20:13:25
    由于在standby mode,看门狗仍然能继续工作,但是其他时钟都关闭了,没法喂狗,这样会导致mcu不停复位。网上找的方法如下:1. 开启RTC,定期喂狗后再次睡眠。该方法视乎可行,但是不够...但是实际测试有问题,STM32...
  • 这两天研究了STM32的低功耗知识,低功耗里主要研究的是STM32待机模式和停机模式。让单片机进入的待机模式和停机模式比较容易,实验中通过设置中断口PA1来响应待机和停机模式。 void EXTI1_IRQHandler(void) { if...
  • 这两天研究了STM32的低功耗知识,低功耗里主要研究的是STM32待机模式和停机模式。让单片机进入的待机模式和停机模式比较容易,实验中通过设置中断口PA1来响应待机和停机模式。 void EXTI1_IRQHandler(void) { if...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 495
精华内容 198
关键字:

stm32待机模式