历史上的今天
返回首页

历史上的今天

今天是:2025年12月05日(星期五)

正在发生

2022年12月05日 | STM32低功耗控制心得体会

2022-12-05 来源:zhihu

1.说明

本文主要叙述在stm32进入stop时如何保持最低功耗的问题,并对部分细节问题进行分析整理。STM32L提供5种低功耗模式:低功耗运行模式、睡眠模式、低功耗睡眠模式、停止模式、待机模式。


待机模式电流最低,但是待机模式时的MCU处于不受控制的状态,所有的IO口都工作在高阻抗的状态的下,只有专门的几个引脚能够将MCU唤醒,而每次唤醒后相当于系统复位,RAM中的数据全部丢失,在外部器件连接的情况下,器件的引脚可能会吸收大量的电流,反而达不到低功耗的要求。


停止模式的功耗仅次于待机模式,在STOP模式下,PLL,HSL,HSE都被停止,RAM和寄存器的值保留。


2.引脚配置


在stop模式下,由于所有的引脚的状态都可以保留,所以需要进行适当的引脚配置才能达到效果。在实际的配置过程中,如果在stm32最小系统中,要在stop模式下保持最低功耗,可将所有的GPIO设置成模拟输入,如果不进行配置,将是默认是浮空输入,此时stop模式的电流很大。在设置的过程中,有几个特殊的引脚需要注意。




对于stm32来说,除了PA,PB,PC每个组有16个GPIO之外,还有PD2,PH0, PH1这三个GPIO。不能错过任何一个引脚的配置,否则功耗会很大。


在所有的引脚配置成GPIO模式后,在stm32最小系统中采用3.3V电压供电,实测电流为0.75uA。但是如果将全部的引脚都配置成模拟输入的GPIO后,将不能正常的使用,根据实际使用的情况,预留9个中断口作为唤醒源。当配置完成之后,可以将电流控制在3.5uA。


降低功耗的控制,主要需要注意的是引脚的上下拉,在有中断引脚上有外设时,可以将引脚配置成浮空输入的模式,不需要配置上下拉。而当该引脚上未接任何外设时,一定需要设置内部的上拉或者下拉,这是比较关键和重要的。


3.通讯类外设的控制


对于stm32内部的通信类的外设,除了设置GPIO的引脚之外,还需要将内部的uart或者i2c或者spi等通信类设备关闭。由于目前只使用了uart,所以在关闭uart可以通过HAL的HAL_UART_MspDeInit(&huart1);函数进行deinit。该函数会关闭中断,清空内部寄存器,并且设置引脚为GPIO模式。所以可以达到降低功耗的目的。


在测试过程中,也遇到了一个问题,就是唤醒后,串口将无法接收和发送数据。刚开始认为休眠时DeInit,唤醒后Init即可,但是还有一个重要的步骤没有做,就是开启串口的中断。

HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);HAL_NVIC_EnableIRQ(USART1_IRQn);HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);HAL_NVIC_EnableIRQ(USART2_IRQn);HAL_NVIC_SetPriority(USART3_IRQn, 0, 0);HAL_NVIC_EnableIRQ(USART3_IRQn);


目前三路串口采用的是DMA+空闲中断的方式进行的,所以这里需要重新开启中断才行。


第二个问题就是ADC,当时测试,一采用ADC进行采样后,下次休眠后电流就很大,实测可达到1.8mA,而不采用ADC进行采样的情况下只有38uA。所以ADC也在耗电,ADC不属于通信类的外设,但是采用了DMA,所以需要关闭掉ADC的中断即可HAL_ADC_Stop_IT(&hadc);,一般来说,如果不是采用DMA的方式,非通讯类的外设只需要关掉时钟即可。__HAL_RCC_ADC1_CLK_DISABLE();


4.特殊引脚的控制


有一个引脚也是需要注意,PH0,该引脚以前是作为外部的32k晶振使用,可用作独立看门狗的时钟源,由于该引脚目前作为了GPIO,所以在使用时作为普通的GPIO使用。作为普通的GPIO使用的必要条件是HSE时钟关闭。但是在测试过程中还是遇到一个问题,该引脚配置成模拟输入后,stop模式下的电流仍有800uA,后来经过测试,发现是Debug调试器未关,也就是HAL_DBGMCU_DisableDBGSleepMode();函数没有有调用。所以在测试时电流才有800多uA。


5. 总结


对于降低功耗来说,standy模式功耗最低,但是唤醒源比较少,可以选择stop模式。由于stop模式的引脚状态和断电前保持一致,所以在进入stop之前需要将不需要控制的引脚设置成模拟输入。同时中断引脚设置相应的浮空或者上拉,这时,如果在中断引脚上未接任何的东西,内部需要上拉或者下拉,这样才能保证最低功耗。


推荐阅读

史海拾趣

ABB Group公司的发展小趣事

ABB Group是一家全球性的工程技术公司,提供电力和自动化技术解决方案。以下是该公司发展的五个相关故事:

  1. 公司成立和早期发展: ABB Group的前身可以追溯到1883年,当时由瑞士的Brown, Boveri & Cie (BBC)和瑞典的ASEA公司合并成立。这个合并创造了一个跨国电气工程公司,专注于发电机、电气传动和电力系统的设计和制造。该公司成立后迅速扩展了国际业务,并在世界各地建立了分支机构和生产基地。

  2. 技术创新和产品多样化: ABB Group一直致力于技术创新,并不断推出新产品和解决方案,以满足客户的需求。公司在电力输送、工业自动化、机器人技术等领域拥有丰富的经验和专业知识,为各种行业提供了全面的电力和自动化解决方案。

  3. 国际化战略和全球扩张: ABB Group通过收购、合并和战略合作,加速了在全球范围内的扩张。公司在100多个国家设有分支机构和办事处,形成了覆盖全球的销售和服务网络。这种国际化战略使ABB能够更好地满足不同国家和地区客户的需求。

  4. 可持续发展和环保责任: ABB Group致力于推动可持续发展和环保责任,在产品设计、生产和运营过程中注重减少能源消耗和减排。公司积极推动清洁能源和智能电网的发展,为全球的环境保护和可持续发展做出贡献。

  5. 未来展望和发展方向: ABB Group将继续致力于技术创新和市场拓展,加强在电力和自动化领域的领先地位。公司将加大在数字化技术和人工智能领域的投入,推动工业智能化和数字化转型,为客户提供更智能、更高效的解决方案。

Antenna Factor公司的发展小趣事

随着无线通信技术的快速发展,Antenna Factor公司始终保持敏锐的洞察力,不断推出创新产品。他们研发的智能天线系统,能够根据信号环境的变化自动调整参数,显著提高通信质量和稳定性。这一技术创新在市场上引起了广泛的关注,使得Antenna Factor公司在行业中树立了技术领先的形象。

DUCATI公司的发展小趣事

Antenna Factor公司始终注重产品质量和客户体验。他们建立了严格的质量管理体系,从原材料采购到产品生产的每一个环节都进行严格的把控。同时,公司还加强了对售后服务的管理和改进,确保客户在使用过程中能够得到及时、有效的支持。这些举措使得Antenna Factor公司的产品质量和品牌形象得到了显著提升。

DRS Technologies公司的发展小趣事

DRS Technologies公司成立于1968年,由Leonard Newman和David Gross两位工程师共同创立。当时,他们正在Loral Corporation研究反潜战的信号处理技术。然而,当Loral决定转向其他技术方向时,Newman和Gross决定继续他们的研究,并创立了DRS。他们的努力最终导致了AN/SQR-17无源潜艇探测系统的开发,这一系统至今仍在广泛使用。

Datapro International Inc公司的发展小趣事

随着技术的不断进步和市场的不断扩大,Datapro International Inc公司开始寻求新的市场机会。他们发现,随着企业信息化程度的提高,对数据存储和处理的需求也越来越大。于是,公司决定进军企业市场,并开发了一系列针对企业的数据存储解决方案。

在拓展企业市场的过程中,Datapro International Inc公司面临着来自竞争对手的激烈竞争。然而,他们凭借卓越的产品质量、专业的技术服务和灵活的商业模式,成功赢得了客户的信任和支持。随着企业市场的不断拓展,Datapro International Inc公司的业务规模也逐渐扩大。

Alan Industries Inc公司的发展小趣事

随着产品技术的不断提升,Alan Industries Inc.开始积极拓展市场。公司制定了详细的市场营销策略,通过线上线下的多渠道推广,成功将产品打入国内外市场。同时,公司还注重品牌建设,通过优质的产品和服务赢得了消费者的信任和口碑。随着品牌知名度的提升,公司的市场份额不断扩大,成为电子行业中的佼佼者。

问答坊 | AI 解惑

一起来制作EZ_ICD2调试器

乾隆盛电子的一个制作小资料 与初学者的交流中,经常有人问怎么学单片机,怎么入门。搜遍了网上所有资料,几乎所有回答都是:先看书,然后动手做实验。提到实验就少不了工具,如实验板、编程器、调试器(仿真器)。由于调试器配合PC 机可以 ...…

查看全部问答>

时钟恢复电路设计

难得一见的资料,其它中文网站几乎没下载…

查看全部问答>

求教 匀速升温的算法

我现在实现升温和保温的功能,比如要升100度 然后就能稳到100度一跳也不跳。用到算法是PID。但是要做匀速升温我不知道具体应该怎么改呢…

查看全部问答>

关于ui和菜单,急!

大家好:   谁对UI比较熟,还有就是做菜单的技术,菜单就像是彩屏手机里的菜单或是数字电视里的菜单等,这项技术如何实现,我开发过程中要用到,挺急的,请大家帮忙给我点建议或资料吧。先谢谢了。…

查看全部问答>

ARM9 多播 sendto 问题

在用ARM9 将数据发送到一个多播地址,发现sendto 总是返回-1, 但是如果只是把地址改成不是多播地址。那么sendto就能够发送成功。问下为什么?怎么解决? 就是发送到224.2.2.2  sendto返回-1,失败 发送到192.168.0.208 成功。能够抓到 ...…

查看全部问答>

驱动程序安装错误 0xE000022B

打包用DPInst安装驱动, 修改了Inf中是  \"AddServer = ........\" 服务名之后,再安装就会出现错误 DPinst.log 中错误是 Installation failed Error code 0xE000022B 类别安装程序拒绝安装或更新此设备, 我想可能是之前安装的驱动 ...…

查看全部问答>

哈哈,俺告别"落伍",用上了RealviewMDK

兴奋中.... 相关链接:http://group.ednchina.com/999/…

查看全部问答>

请问版主能否在STM32程序内部判断芯片型号?

                                 主要是想根据型号判断Flash和RAM的地址范围。…

查看全部问答>

新手求指点

编了一个流水灯的程序,程序是这样的:按下键1,流水灯从右往左一秒亮一个灯;按下键2,流水灯从左往右一秒亮一个灯。遇到了一个小问题,我先按下键1,再按下键2,按照我编写的程序,应该是左边第一个灯先亮,但是现在用protues仿真时,它是从我按 ...…

查看全部问答>