STM32低功耗模式测试

最新更新时间:2022-01-26来源: eefocus关键字:stm32  低功耗模式  分析测试 手机看文章 扫描二维码
随时随地手机看文章

stm32单片机低功耗模式共有3种,下来对3种低功耗进行分析测试。

先看手册上相关低功耗资料介绍:

在这里插入图片描述

先来分析睡眠模式:

进入睡眠模式比较简单,只需一条指令即可。唤醒睡眠模式,我们使用串口中断来唤醒,通过对串口发送数据。利用串口RXD引脚来唤醒睡眠模式,代码如下:

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

//进入睡眠模式 任意中断唤醒  WKUP不能唤醒

void sleep_mode_wfi(void)

{

    __WFI(); //WFI指令进入睡眠

}

//进入睡眠模式 唤醒事件唤醒  WKUP 不能唤醒

void sleep_mode_wfe(void)

{

    __WFE();

}


通过调用这两个函数就可以直接进入睡眠模式,给串口发送数据可以退出睡眠模式。睡眠模式退出后,程序会从进入睡眠模式的下一行代码继续执行。相当于程序被暂停了。


下来看停止模式:

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

停止模式通过调用库函数PWR_EnterSTOPMode(),可进入停止模式,停止模式唤醒需要用外部中断,将串口的RXT引脚设置为外部中断,上升沿触发,这样当串口接收到数据时,就会触发RXD引脚的外部中断。这样可通过串口直接唤醒停止模式。相关代码如下:


void EXIT_UART_Init(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;

    EXTI_InitTypeDef EXTI_InitStructure;


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);


    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource10);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

    GPIO_Init(GPIOA, &GPIO_InitStructure);


    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);


    EXTI_InitStructure.EXTI_Line = EXTI_Line10;

    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;

    EXTI_InitStructure.EXTI_LineCmd = ENABLE;

    EXTI_Init(&EXTI_InitStructure);


}

void EXTI15_10_IRQHandler(void)

{

    if(EXTI_GetITStatus(EXTI_Line10) != RESET)

    {

        EXTI_ClearITPendingBit(EXTI_Line10);

        __set_FAULTMASK(1); //关闭所有中断

        NVIC_SystemReset();  //系统复位

    }


}


//进入停止模式   任意外部中断唤醒  WKUP不能唤醒

void enter_stop_mode(void)

{

    EXIT_UART_Init(); //RX引脚配置为外部中断

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //开电源管理时钟


    PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI); //进入停机模式

}

在这里插入图片描述
在这里插入图片描述

进入停止模式后,所有IO口保持为当前状态。当退出停止模式后,HSI RC振荡器会被选为系统时钟,而开发版用的是外部时钟,需要重新设置系统时钟。为了避免重新设置时钟的麻烦,在中断程序中,直接执行系统软件复位命令。直接对系统重新进行复位。如果在实际项目中需要外部IO口状态保持不变,就不能用系统复位命令,需要自己重新配置系统时钟和其他外设的时钟。


下来看待机模式:


进入待机模式后系统功耗最低,外部IO口都会处于高阻状态。退出待机模式后,系统会重新初始化,相当于按下了复位按键。相关代码如下:


void Sys_Standby(void)

{

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR外设时钟

    PWR_WakeUpPinCmd(ENABLE); //使能唤醒管脚功能  WKUP

    PWR_EnterSTANDBYMode();    //进入待机(standby)模式

}


//系统进入待机模式   WKUP引脚上升沿、RTC脑子、NRST复位、IWDG复位 唤醒  中断不能唤醒

void Sys_Enter_Standby(void)

{

    RCC_APB2PeriphResetCmd(0X01FC, DISABLE); //复位所有IO口,屏蔽这条语句也没有看到什么影响

    Sys_Standby();

}


为了方便测试,用了WKUP唤醒。进入低功耗模式后,按下WKUP按键,系统会被唤醒,唤醒后系统复位,程序重新开始执行。

主函数测试代码如下:


int main(void)

{

    u8 i = 0, j = 0;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    delay_init();        //延时函数初始化

    LED_Init();          //初始化与LED连接的硬件接口

    KEY_Init();

    uart_init(9600);


    LED = 1;

    delay_ms(500);

    printf("low power test! rnrn");

    while(1)

    {

        i =  KEY_Scan(1);


        switch(i)

        {

        case 0:

            break;

        case 1:

            printf("进入停机模式rnrn");

            enter_stop_mode(); //唤醒后从程序开始位置执行

            printf("退出停机模式rnrn");              //执行不到这块

            break;

        case 2:

            printf("进入待机模式rnrn");

            Sys_Enter_Standby(); //唤醒后从程序开始位置执行

            printf("退出待机模式rnrn"); //执行不到这块

            break;

        case 3:

            printf("进入睡眠模式 中断唤醒 rnrn");

            sleep_mode_wfi(); //唤醒后接着下一条语句执行

            printf("退出睡眠模式 中断唤醒 rnrn");      //唤醒后执行当前语句

            break;

        case 4:

            printf("进入睡眠模式 事件唤醒 rnrn");

            sleep_mode_wfe(); //唤醒后接着下一条语句执行

            printf("退出睡眠模式 事件唤醒 rnrn"); //唤醒后执行当前语句

            break;

        }


        j++;

        if(j > 5)

        {

            j = 0;

            LED = !LED;

        }


        delay_ms(10);


    }

}


通过LED闪烁指示程序执行状态,进入低功耗模式后,LED灯停止闪烁。退出低功耗模式后,LED灯继续闪烁,用串口输出相关信息,便于观察。

关键字:stm32  低功耗模式  分析测试 编辑:什么鱼 引用地址:STM32低功耗模式测试

上一篇:利用STM32F103单片机输出SPWM波
下一篇:STM32复位源判断

推荐阅读

STM32学习日志——CAN通信实验
1、概述CAN是Controller Area Network的缩写,是ISO的国际标准化的串行通信协议。在当前的汽车产业中,有各种各样的电子控制系统,这些系统之间所用的数据类型及对可靠性的要求不尽相同。1986年电气商博世公司开发出面向汽车的CAN通信协议。现在,CAN的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。CAN控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐形电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。CAN的特点:多主控制。总线空闲时,所有单元都可以发送消息;最先访问总线的单元优先;同时发送看ID优先级。消息的发送。所有消息以固定的格式
发表于 2023-01-13
STM32学习日志——基于NT35510驱动芯片的LCD屏显示
之前写过关于LCD屏的学习日志,当时学得很懵逼,最后先暂时跳过,把教材的例程当成库函数来用,等后面开窍了再回过头来学习一遍。回想大学学习51单片机的时候,也是觉得LCD屏很困难,我觉得新手很容易就在这里从就入门到放弃了,因为相比前面的知识,个人认为LCD算是一个比较复杂的外设,难度有阶梯式的上升。再加上学习的教材为了兼容各种驱动芯片,程序看起来比较乱。所以这次单把NT35100这款驱动芯片拎出来分析学习。这里使用的是ATK-4.3'TFTLCD模块,他是采用NT35510芯片驱动,分辨率为800*480,自带GRAM。ATK-4.3’ TFTLCD模块正面图一、引脚与GRAM它一共有34个引脚。原理图及引脚功能如下。因为LC
发表于 2023-01-13
STM32学习日志——按键的单击、双击、长按
前两天去面试的时候,面试官看了我的业余小设计,问了个问题,怎么实现按键的双击,当时的设计只有单击和长按的功能,当时没回答出来。回来后看了下资料,整理并尝试了一下。大概的思路是这样的,单击与长按的区别在于按下后弹起时间的长短,如果按键一直按着,且大于一个时间值,判断为长按;否则为非长按,那么就要继续判断是单击还是双击,区别在于弹起后的一个较短时间内是否再次被按下,如果是,则为双击,反之则为单击。不知道大佬们有没有更好的办法,可以指导下吗?主函数
发表于 2023-01-13
STM32学习日志——主函数框架:时间轮
读大学时候,老师曾教了一种叫时间轮的方法,当时没好好学习。自己在写程序时经常乱用延时,一方面占用CPU资源,原本单片机可以执行更多的任务,却被用来延时,特别浪费,另一方面可能出现各种各样的问题。使用时间轮的方法,可以使单片机像人一样,以时间为尺度,来规划任务。人可以决定今天几点吃饭,几点看书,几点睡觉。而单片机依靠定时器的中断,每隔0.5ms进入一次中断,可以设定在任意的时间点执行合适的任务,比如需要usart发送比较重要的数据的,可以让它以1ms间隔发送,比如不重要的数码管显示,可以让他200ms执行一次。而这个框架可以直接套用于主程序。配置定时器主程序框架主程序框架
发表于 2023-01-13
总结大佬经验,如何学习STM32?(入门、进阶)
一、想快速入门进阶,面向工作时先把工作中需要的东西学会,一项一项的来,比如先把GPIO弄清楚,怎么初始化,怎么输入输出,然后定时器、串口、ADC、DAC、DMA、SPI等等先把用得着的一个一个地做,都弄明白了再往一块整合,从简单到复杂,硬件操控起来了也就算对这种单片机入门了吧,软件方面,不管用什么单片机,用什么编译器,区别不大初学的最好还是买个开发板,不需要多高级的,有几个常用功能做出来,其它就容易了。--------hdxet关于初学者是否需要弄清底层函数问题:先玩起来再说底层函数,一般就用现成的库,绝大多数应用都没问题的,至于库里面是什么,先不管它,到了高级阶段再去看--------hdxet二、进阶步骤会点灯-入门;会使用各个
发表于 2023-01-13
一图搞懂单片机STM32的5个时钟源知识!
众所周知STM32有5个时钟源HSI、HSE、LSI、LSE、PLL,其实他只有四个,因为从上图中可以看到PLL都是由HSI或HSE提供的。其中,高速时钟(HSE和HSI)提供给芯片主体的主时钟.低速时钟(LSE和LSI)只是提供给芯片中的RTC(实时时钟)及独立看门狗使用,图中可以看出高速时钟也可以提供给RTC。内部时钟是在芯片内部RC振荡器产生的,起振较快,所以时钟在芯片刚上电的时候,默认使用内部高速时钟。而外部时钟信号是由外部的晶振输入的,在精度和稳定性上都有很大优势,所以上电之后我们再通过软件配置,转而采用外部时钟信号.高速外部时钟(HSE):以外部晶振作时钟源,晶振频率可取范围为4~16MHz,我们一般采用8MHz的晶振。
发表于 2023-01-13

推荐帖子

怎么用STC89C52给nRF24l01无线模块编程呀!真是一点头绪都没?
在朋友那找了块nRF24l01无线模块模块,也有些资料,但看着代码就一头雾水,不知道从那下手 求高手指点指点。怎么用STC89C52给nRF24l01无线模块编程呀!真是一点头绪都没?
墙角转向 RF/无线
如何降低开关电源的EMI
开关电源的功率MOSFET安装在电路板上,由于电路板上MOSFET走线和环路存在杂散电容和寄生电感,开关频率越高,这些杂散电容和寄生电感更加不能够忽略。由于MOSFET上的电压和电流在开关时会快速变化,快速变化的电压和电流与这些杂散电容和寄生电感相互作用,会导致电压和电流出现尖峰,使输出噪声明显增加,影响系统EMI特性。 如何降低开关电源的EMI
伟林电源 电源技术
单片机HC05蓝牙模块问题
我用的HC05蓝牙模块,进入AT指令模式后,查看ROLE、ADDR、PSWD、IAC等都正常,为啥AT+NAME?就不行呢,调试工具自动加上换行的啊、哪位大神能处理下这个问题 单片机HC05蓝牙模块问题
ning_dan 51单片机
新型电池技术为电子、混合动力车带来更便宜的能源(图)
作者:——AlixL.Paultre 日期:2006-6-1 来源:今日电子MIT的研究者们正在开发用具有规则晶体结构的锂镍氧化锰材料制作电池的技术,希望用它来取代使用在混合动力和电动汽车上的电池。目前使用的锂化合物电池没有快速充电能力或不符合汽车上的安全要求,而用改进过的LiNiMno材料制成的电池将比锂氧化钴电池更稳定,能在10分钟内充电或放电。图LiNiMno材料内部结构为了让锂离子更加顺畅的流动,改进的LiNiMno结构中增加了一个金属层,它同锂离子层之间由氧来隔离。当然,在
fighting 模拟电子
招聘兼职PDA 软件开发(北京)
本公司需要开发一套PDA点检系统,欢迎有开发经验的联系!hj3850@163.com13511070298qq:942582560招聘兼职PDA软件开发(北京)
sunxinyu 嵌入式系统
有偿求启航开发板STM32F103VET6 全套资料【悬赏20元】
朋友送了一个启航开发板STM32F103VET6-KIT-V3,但是资料却没有,在网上只有零星的。 有偿求启航开发板STM32F103VET6-KIT-V3全套资料,20元 有的朋友请发送到我的邮箱yans88@126.com 有偿求启航开发板STM32F103VET6全套资料【悬赏20元】
yans88 stm32/stm8
小广播
设计资源 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2023 EEWORLD.com.cn, Inc. All rights reserved