关于stm32单片机低功耗的实现和唤醒

发布者:bemaii最新更新时间:2023-08-24 来源: zhihu关键字:stm32  单片机  低功耗  唤醒 手机看文章 扫描二维码
随时随地手机看文章

最近做的项目中要求低功耗,在单片机完成了手头上的工作之后,就进入低功耗模式,项目的需求是单片机进入低功耗模式的时候系统时钟从HSE切到HSI,但是在未进入低功耗模式之前引脚是什么状态,进入低功耗模式之后也不应该改变。可以通过RTC定时唤醒,或者接收到串口数据就唤醒,处理完数据后再进入stop模式。查询了一些资料之后,发现stop模式最符合项目需求。下面讲述一下什么是低功耗:
一、stm32支持三种低功耗模式,可以在低功耗,短启动,多种唤醒模式下寻找平衡。
1、SleepMode睡眠模式,只有CPU停止运行,所有的外设处于工作状态并且可以在发生中断/事件时唤醒CPU。
2、StopMode停机模式,保持SRAM和寄存器内容不丢失,达到最低的电能消耗。停止所有内部1.8V部分的供电, PLL、 HSI的RC振荡器和HSE晶体振荡器被关闭,调压器可以被置于普通模式或低功耗模式。可以通过任一EXTI从停机模式中唤醒, EXTI信号可以是16个外部I/O口之一、 PVD的输出、 RTC闹钟或USB的唤醒信号。
3、StandbyMode待机模式。最低的电能消耗。内部1.8V部分的供电被切断; PLL、 HSI的RC振荡器和HSE晶体振荡器关闭;SRAM和寄存器的内容将消失,但后备寄存器的内容仍然保留,待机电路仍工作。从待机模式退出的条件是: NRST上的外部复位信号、 IWDG复位、 WKUP引脚上的一个上升边沿或RTC的闹钟到时。
二、低功耗模式基于HAL库的常用API
2.1睡眠模式SleepMode

  • __HAL_RCC_PWR_CLK_ENABLE();//电源管理使能

  • HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);//进入睡眠模式


2.2停机模式StopMode

  • __HAL_RCC_PWR_CLK_ENABLE();//电源管理使能

  • HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI);//进入停机模式


2.3 待机模式StandbyMode

  • __HAL_RCC_PWR_CLK_ENABLE();//电源管理使能

  • PWR_Check_Standby();//检查是否是待机模式

  • __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);//清除唤醒标志

  • __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);//清除待机标志

  • __HAL_PWR_GET_FLAG(PWR_FLAG_SB);//获得待机模式标志

  • HAL_PWR_EnterSTANDBYMode();//进入待机模式


以上相关描述参考https://blog.csdn.net/u010058695/article/details/100008613
三、Stop模式中遇到的一些问题及解决方法
1、没有配置好唤醒机制,导致进入stop模式后没能唤醒,导致无法识别到st-link,无法重新烧录程序。即使重新上电也不能识别到st-link。
我在这个问题上栽了跟头,因为单片机重新上电后依然不能识别到st-link,所以以为是单片机坏了,重新换了单片机再烧录同样的程序,结果问题还是一样,我开始意识到问题不是那么简单,上网找了一下资料,才知道是进入stop模式后不能唤醒,具体的做法有几种:
①  可以将单片机的NRST引脚引出来,外接复位键。(关于引脚查看可用ST官方软件STM32cubeMX,很方便)如图:把NRST引出来通过一个按键连接到GND,当进入STOP模式不能烧录程序的时候只需要在按下按键后,点击keil的

,然后松手即可。




②  通过ISP的方式下载程序,必须将boot0接高电平,boot1(PB2)接低电平,然后必须断电后重启,此时单片机会进入ISP模式,就可以通过串口1(一般单片机都是只有串口1才可下载程序)再用flymcu等软件烧入hex文件就可以了。
关于boot0和boot1,在每个stm32单片机都会有这两个引脚,这两个引脚在复位时的电平状态决定了芯片在复位后从哪个区域开始执行程序。
  boot1=x boot0=0从用户闪存启动,这是正常的工作模式。
  boot1=0 boot0=1从系统存储器启动(进入ISP模式)。
  boot1=1 boot0=1从内置SRAM启动,这种模式可以用于调试。
  如此一来,单片机无法进入正常的工作模式,就无法进行休眠,就可以通过ISP来下载程序。
③  使用STlink烧写程序,STlink至少要接4根线(SWDIO、SWCLK、GND、SW-RST),一般的下载程序只需要前三根就可以了,但是以防出现休眠无法唤醒的情况,这时有复位键就可以将SWDIO和SWCLK重置,如果板子设计没有与SW-RST相对应的,此时需要把单片机上的NRST引出来接到SW-RST上。下载程序之前boot0接高电平,boot1不用管(也需要断电后重启)。
下载配置这里按如下配置,RESET那里HW RESET和SYSRESETREQ任选一个。



配置好之后load一个空程序即可,不要再烧一个休眠的程序了,之后就可以正常烧程序了。
以上解决方法参考https://blog.csdn.net/geekjin/article/details/79232405,总结就是复位NRST这个引脚是最简单的方法,以后做项目还是要提醒硬件工程师把这个引脚引出来。
2、项目需要单片机在进入stop 模式后过5秒钟就唤醒,实际上RTC闹钟中断也是挂在EXTI中断上的。我是用CubeMX配置的RTC,但是一直没有唤醒,后面终于找到问题所在了:



红色框框里的前三个应该配置为Enable,第四个应该配置为Disable,前三个是闹钟屏蔽星期,闹钟屏蔽小时,闹钟屏蔽分钟,如果不是这样配置的话,只能等到时间达到了设定好的某天某时某分某秒才能发生中断,那么只能一周唤醒一次了。如果是这样设置的话,就是一分钟唤醒一次,那么怎么才能5秒钟唤醒一次呢?我的做法是每次进入stop模式前就调用一次MX_RTC_Init()函数一次,因为我的时间是设置为x年x月x日星期x x时x分0秒,所以相当于每次进入stop模式前初始化一次RTC,5秒钟后就会发生闹钟中断。这种办法可能是比较笨的方法,但是好歹实现了这个功能哈哈


3、为了方便调试,我还配置了LED,每隔200ms闪烁一次,但是我发现从stop模式唤醒后灯的闪烁明显变得很慢,而且串口数据的接收和发送也不能完成,这是为什么呢?


  原来进入stop模式后系统时钟默认切换到内部8M时钟,所以频率就会变慢了


  我的解决方法是重新配置系统时钟:

/**************************************

*函数名称:void SYSCLKConfig_STOP(void)

*函数功能:选择HSE作为时钟源

*函数形参:无

*函数返回值:无

****************************************/

void SYSCLKConfig_STOP(void)

{

    __HAL_RCC_HSE_CONFIG(RCC_HSE_ON);

     

    while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET)

    {

    }

     

     /* 使能 PLL */

  __HAL_RCC_PLL_ENABLE();

 

  /* 等待 PLL 准备就绪 */

  while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET)

  {

  }

 

  /* 选择PLL作为系统时钟源 */

  __HAL_RCC_SYSCLK_CONFIG(RCC_SYSCLKSOURCE_PLLCLK);

 

  /* 等待PLL被选择为系统时钟源 */

  while(__HAL_RCC_GET_SYSCLK_SOURCE() != 0x08)

  {

  }

}


4、接收到串口数据后怎么唤醒stop模式?
   其实RTC闹钟中断唤醒stop模式也是因为闹钟事件是连接着外部中断线的,但是串口接收中断并不能唤醒stop模式啊,怎么办?


解决方法有两种,一种是在RX引脚上接上光耦连接到其他IO口上,把该IO口配置为外部中断,但是这种方案比较麻烦,所以可以采取第二种方案,在进入stop模式之前把RX引脚配置为外部中断模式,这样的话,RX引脚上有电平变化的时候就会发生外部中断,在服务函数中记得把RX引脚再配置为复用为UART的接收引脚。并且重新配置系统时钟,选择HSE为时钟源。这样就可以实现唤醒并接收数据了。但是因为第一次接收到串口数据的时候只能唤醒stop模式,并不能接收到数据,所以应该跟发送方约定好,一帧数据要发送两次。而且中间要有一定间隔,我的间隔是500ms。这样确实比较麻烦,但是暂时没有更好的办法。


5、串口接收引脚配置为外部中断引脚后还是没有正常接收到数据。在唤醒后延时1秒钟就可以接收到数据。
  这是因为stop模式唤醒后,因为没有延时,很快又进入stop模式,这个时候第二帧数据还没到来,等到第二帧数据到来的时候处于stop模式中,这帧数据只能起到唤醒的作用,很快又进入了stop模式,变成一个恶性循环。

以上就是我对stop模式和唤醒的总结,不正确的地方请大家斧正!

关键字:stm32  单片机  低功耗  唤醒 引用地址:关于stm32单片机低功耗的实现和唤醒

上一篇:单片机通过蓝牙与手机通信:android中的蓝牙
下一篇:STM32F407 独立看门狗 (IWDG)

推荐阅读最新更新时间:2024-11-19 11:39

基于STM32的NB-IoT模块驱动
一、概述 目前这个NB-IoT在国内还是比较火的,最近刚好使用了一款NB-IoT模块。将驱动程序贡献给大家。希望能对用到的朋友有点帮助。 二、NB-IoT模块介绍 本次采用的是有人物联网公司的WHNB75模块。(支持电信网络)WH-NB75 是基于 WH-NB73 模块开发出来的 DIP 封装的模块产品,该产品能够更方便的嵌入到客户产品中。WH-NB75 是我们 NB75 模块系列的一个总称,针对不同运营商网络有不同的模块型号对应。请在选购模块时注意选择支持当地运营商的模块。稳恒正在基于海思 Hi2115 芯片打造支持全频段的 NB 模组 WH-NB71,到时候可以一款模块支持多家运营商的网络。下表为不同型号产品对应的运营商。
[单片机]
少走弯路,PIC单片机中断总结
PIC单片机有多个中断源,16系列只有一个中断入口,18系列有两个中断入口,不同编译器下书写格式又不大一样。网上资源千篇一律,也不够系统,只是简单的罗列程序,代码生存的环境不一样也少有说明。在此做个简单的总结,因为又走了弯路... 1.先说18系列(MCC18编译器下): MPLAB C18不自动把中断服务程序放在中端向量处。通常将GOTO指令放在中断向量处,从而把控制权转交给相应中断服务程序。 void low_isr(void); void high_isr(void); *****************************低级中断入口及服务子程序***************************
[单片机]
基于DSP+MCU的平流层验证飞艇组合导肮系统
  平流层空域处于飞行高度最高的飞机和轨道最低的卫星之间,加之其具有良好的电磁特性和非常稳定的气象条件,因此人们不断地尝试利用平流层飞艇作为可长期驻空的平台进行通信、对地观测、国土资源监测和预警等。由于飞艇具有独特的优势:可直升、可长时间滞空,且具有较大的有效载荷能力和低能耗等特点,被人们称为“多功能航空器,因此世界各国都在飞艇方面开展了多种多样的研究。   鉴于平流层高空飞艇组合导航系统设计的复杂性,工程中利用低空飞艇对其进行验证分析。由于低空飞艇所提供的升力有限,因此组合导航系统的小型化及经济化势在必行。针对这种现状,本文设计了基于DSP+MCU的专用导航计算机。小型验证飞艇飞行试验验证了该系统可满足实时性和精度的要求,为平
[单片机]
基于DSP+<font color='red'>MCU</font>的平流层验证飞艇组合导肮系统
stm32专题十一:USART(五)USART发送命令解析
通过串口,用电脑发数据给单片机来控制单片机实现相应的功能,能够实现简单的人机交互。 很简单,通过getchar()接收,然后switch...case...来实现不同的功能。值得注意的是,串口发送接收的均为字符。 #include stm32f10x.h #include bsp_led.h #include bsp_usart.h #include stdio.h void delay(uint32_t count); int main(void) { uint8_t ch; USART_config(); LED_GPIO_Config(); printf( 串口发送数据
[单片机]
提供远程更新,ST推出全新网联汽车MCU
大容量片上存储器,支持ECU软件安全OTA更新,便于车企简化车辆维护步骤,向客户推广更多产品服务 千兆和百兆以太网端口驱动高速车载网络 完全兼容EVITA的硬件安全模块保障网联汽车和乘客的安全 横跨多重电子应用领域的全球领先的半导体供应商意法半导体 推出最新的高性能多接口多核汽车微控制器,让网联汽车变得更安全,应用开发更灵活,为获得最新的性能升级提供保障。 随着车辆动力总成、车身、底盘和信息娱乐系统等关键功能日益软件化,通过空中下载技术(OTA)安全地提供修复补丁、可选包等更新程序,汽车厂商可以提高成本效益,为用户提供更多便利。意法半导体最新的Chorus汽车微控制器拥有最先进的安全技术和充裕的片上代码存储容量
[汽车电子]
提供远程更新,ST推出全新网联汽车<font color='red'>MCU</font>
STM32】4—UART串口(查询模式)
0 实验预期效果 完成串口数据的接收和发送 1 相关原理图 2 硬件配置 DAPLINK、STM32F407VET6: TXD —— PA10 注意!!!!一定要看清!!!不要接错!!TXD是接PA10!!! RXD —— PA9 注意!!!!一定要看清!!!不要接错!!RXD是接PA9!!! GND —— GND 5V —— 5V 3 软件配置 USART相关知识 USART 简介、功能说明、框图见博客:【STM32】基于STM32F407实现串口通信_Max_Shy的博客-CSDN博客_stm3
[单片机]
【<font color='red'>STM32</font>】4—UART串口(查询模式)
51单片机LED点阵上移程序!(汇编)
注释:行采用74LS154+PNP三极管驱动 列采用两个74HC595驱动! 此程序可以实现上移!下面是视频链接实拍效果,请大家查看!链接地址:视频祥见: http://www.tudou.com/programs/view/D0SCJyO4RBQ/ SDATA EQU P1.0 ;串行数据 SCLK EQU P1.1 ;移位时钟脉冲 RCK EQU P1.2 ;输出锁存器控制脉冲 ORG 000H JMP MAIN ORG 0030H MAIN: MOV SP,#5FH MOV 20H,#00H MAIN1: MOV R0,#5 MAIN2: MOV R3,#10H MOV R1,#00H MOV R2,20H
[单片机]
51<font color='red'>单片机</font>LED点阵上移程序!(汇编)
NEC电子扩展车身控制用32位微控制器“V850ES/Fx3”产品线
以13种低价格32位微控制器开拓16位微控制器市场 NEC电子为了进一步扩展用于空调及座位自动调节、防盗功能等车身控制、及安全气囊控制等安全控制的32位车载用微控制器“V850ES/Fx3”的产品线,研制了13种“V850ES/Fx3-L”产品,并将于今年10月正式推出样品。 新产品最大的优势在于使用了车载微控制器领域中最先进的工艺--0.15微米工艺,工作频率为20MHz,低于V850ES/Fx3,因此可以用与16位微控制器相同的成本实现29MIPS的高速处理,该处理速度是16位微控制器的2倍。该系列囊括了引脚数从64个到100个、闪存容量从64KB到256KB的13种产品,可以满足用户的多种系统要求。此外,该系列产品还具有
[新品]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved