目录

  • 三种低功耗模式介绍
  • 睡眠模式(sleep mode)
  • 停止模式(stop mode)
  • 待机模式(standby mode)
  • 总结
  • 实战测试
    • 个别电路原理图
    • 功耗分析
    • ADC功耗大解决方案
    • ADC电池采样电路优化

前言:最近朋友所托,需要一个可以持续运作至少一天的计数器,我感觉头大,因为之前在制作宿舍门禁的时候利用arduino没能实现低功耗模式,所以先到网上找了很多资料,发现立创开源平台上有一个大佬利用STC15实现了低功耗宿舍门禁,能够待机3~6个月,膜拜。本来打算去学习STC15,模仿这个大佬了,但是因为之前学了很久的stm32,所以就上网查了一下资料,实测32也能实现低功耗,所以开始一边学习一边记录。

大佬的STC15低功耗宿舍门禁

文章大部分参考:【STM32】HAL库-电源控制(低功耗模式)

三种低功耗模式介绍

睡眠模式:只有内核时钟关闭,外设仍在运行;可以通过任意一个中断或唤醒事件唤醒;唤醒后回到睡眠的位置向后执行。(CM3内核停止,外设仍然运行)(数据保存)

停止模式:关闭内核时钟、外设时钟,保留内核1.8V供电,寄存器和RAM中的数据可以保持,IO口状态也可保持;可以通过任意一个外部中断唤醒;唤醒后可回到停止的代码处向后执行,但要重新初始化时钟和外设。(所有时钟都停止)(数据保存)

待机模式:关闭所有时钟,关闭内核1.8V供电,寄存器和RAM数据不能保持(除了电源控制/状态寄存器(PWR_CSR)、备份寄存器,其他数据都丢失);可通过唤醒引脚(PA0)上升沿、RTC闹钟中断,或者复位唤醒; 从待机模式唤醒后的代码执行等同于复位后的执行 进入Standby模式后,只能有Wake-up脚和RTC唤醒,特别是唤醒后,程序将从最开始运行,也就是相当于软件复位。(最省电)(数据丢失)

正常模式下:芯片配置:

板子的大概状态:

电流表实测有33左右mA(拔掉OLED有30mA左右)


睡眠模式(sleep mode)


使能外部中断:

有个博主说不用的IO口设置为模拟输入态最省电

main函数和外部中断的主要代码:

int times=0;
while (1){HAL_Delay(1000);//延时1000毫秒HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_4);//翻转点亮LEDif(times > 4){HAL_SuspendTick();//停止系统滴答计时器// HAL_PWR_EnableSleepOnExit();//设置SCR寄存器的SLEEPONEXIT位,在中断处理结束后重新进入SLEEP模式。HAL_PWR_EnterSLEEPMode(0, PWR_SLEEPENTRY_WFI);//WFI指令进入睡眠模式times = 0;HAL_ResumeTick();//恢复系统滴答计时器}times++;//循环次数加一
}void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{//外部中断可以加自己相加的东西,也可以啥也不加,执行完返回睡眠前的位置继续执行
}

通过执行WFI或WFE指令进入睡眠状态。由于系统的滴答定时器也能够解除睡眠状态,所以要记得停止掉。

使能和停止滴答定时器在:注释说明这个函数可以对系统中断进行使能和停止

HAL_PWR_EnableSleepOnExit();在下图的文件中:注释说当外部中断执行完返回主线程序的时候,如果调用该函数那么将重新进入睡眠模式,否则就接着睡眠前的程序执行。

睡眠模式下电流表实测有18mA左右(去掉OLED有15.8mA)


停止模式(stop mode)

SRAM和寄存器内容被保留下来
PLL、HSI和HSE RC振荡器的功能被禁止
所有的I/O引脚都保持它们在运行模式时的状态

系统时钟:停止模式唤醒后,STM32会使用 HSI(f1的HSI为8M,f4为12M)作为系统时钟。所以,有必要在唤醒以后,在程序上重新配置系统时钟,将时钟切换回HSE。
唤醒延迟 :基础延迟为 HSI振荡器的启动时间,若调压器工作在低功耗模式,还需要加上调压器从低功耗切换至正常模式下的时间,若 FLASH 工作在掉电模式,还需要加上 FLASH 从掉电模式唤醒的时间。

程序和上面类似,还是中断唤醒,只不过设置停止模式的函数不一样,第一个参数是低功耗管理(PWR_LOWPOWERREGULATOR_ON)

int times=0;
while (1){HAL_Delay(1000);//延时1000毫秒HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_4);//翻转点亮LEDif(times > 4){//停止模式HAL_SuspendTick();//停止系统滴答计时器HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);//电压调节器为低功耗模式,WFI指令进入停止模式SystemClock_Config();//重新配置系统时钟times = 0;HAL_ResumeTick();//恢复系统滴答计时器}times++;//循环次数加一
}void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{//外部中断可以加自己相加的东西,也可以啥也不加,执行完返回睡眠前的位置继续执行
}

停止模式下电流表实测有8.35mA左右(拔掉OLED变成5.9mA左右)


待机模式(standby mode)

待机模式可实现系统的最低功耗。该模式是在Cortex-M3深睡眠模式时关闭电压调节器。整个1.8V供电区域被断电。PLL、HSI和HSE振荡器也被断电。SRAM和寄存器内容丢失。只有备份的寄存器和待机电路维持供电。也就是说,从待机模式唤醒后,由于没有之前代码的运行记录,只能对芯片复位,重新检测 boot条件,从头开始执行程序。

在待机模式下,所有的I/O引脚处于高阻态,除了以下的引脚
复位引脚(始终有效)
当被设置为防侵入或校准输出时的TAMPER引脚
被使能的唤醒引脚(PA0)

int main(void)
{HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);//强制使能WKUP(PA0)引脚SET_BIT(PWR->CR, PWR_CR_CWUF_Msk);//写1清除该位 唤醒位SET_BIT(PWR->CR, PWR_CR_CSBF_Msk);//写1清除该位 待机位int times=0;while(1){HAL_Delay(1000);//延时1000毫秒HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_4);if(times > 4){//待机模式SET_BIT(PWR->CR, PWR_CR_CWUF_Msk);//写1清除该位 唤醒位 如果不清楚此位 系统将保持唤醒状态HAL_PWR_EnterSTANDBYMode();//进入待机模式            }times++;//循环次数加一}
}

PA0用于唤醒单片机,下拉输入,上升沿触发。博主说PA0用cubemx配置没有用,需要强制使能PA0引脚,实践改代码可用,可PA0高电平后,程序复位

待机模式实测电流比停止模式略低一点,7mA左右


总结

无法做到网上的那么低,网上几十个uA。
目前已知的方法可能是采用stm32L系列,专用的低功耗芯片。
还有一种可能性是用一些低功耗的LDO,打了个新板子,等焊好测试完再记录。


2022.11.7更新

实战测试

个别电路原理图

制作了PCB进行了测试。发现静态电流低的LDO影响很大。利用的这个ME6290A33M3G的LDO,进入停止模式后,电流成功降到到60个uA。

同样的在OLED的供电口上,加上了Pmos管控制开断

增加了一个ADC电池电量采集,但是ADC采集的没有控制开断的,电流应该是180uA。

现在整体体是990多uA。

功耗分析

原因分析:
(1)ADC采集的电路占用了180uA左右
(2)OLED完全没有占用,因为G脚是高电平关断
(3)剩下的800uA全部都是芯片ADC的原因,如果在程序中利用HAL的ADC轮询采集函数,即使进入停止模式,都会占用800uA

ADC功耗大解决方案

ADC耗能解决方案:
发现停止模式下ADC没有关掉,突然想起之前学习HAL库下ADC操作时,有一个轮询模式下的HAL_ADC_Stop函数,尝试了一下发现就是这个问题。

首先函数的注释解释为:
停止常规组的ADC转换(如果是自动注入模式,则停止注入通道),禁用ADC外设。
ADC外设禁用是强制停止注入组的潜在转换。如果注入组正在使用,它应该使用HAL_ADCEx_InjectedStop函数初步停止。

程序中应用:

for(int i=0;i<40;i++)
{HAL_ADC_Start(&hadc1);      //开始if(HAL_OK==HAL_ADC_PollForConversion(&hadc1,100))    //等待转换,100ms超时时间  3850ADC_Ver+=HAL_ADC_GetValue(&hadc1);    //读取值
}ADC_Ver=ADC_Ver/40;   HAL_ADC_Stop(&hadc1);

ADC采集误差大,我这里用了简单的平均,比较好的应该是排序取中间几个数的平均值,之后再试。
只要采集完成之后HAL_ADC_Stop(&hadc1);关掉就行,在进入停止模式前关掉。

如果不会HAL库下的ADC操作,见下面文章:
HAL库(STM32CubeMX)——ADC学习总结(包含单次/连续模式下的轮询/中断/DMA)(蓝桥杯STM32G431RBT6)

ADC电池采样电路优化

现在板子的功耗就是190uA左右了,现在再查找一下ADC分压电阻能不能再大一些,功耗还能降低。

上网查阅了一些资料,发现ADC采样电阻是有要求的:(stm32f103c6手册)

图中说明了ADC采样的外部输入电阻一般最大不能超过50k,但是具体情况下这个值和采样周期有关,见下图

有博主说是因为采样是靠电容的充放电测量的,所以关于ADC采样不精确,可能是采样周期太短,导致采样数据变小。我选了41.5cycles,由上图,手头小于50k的只有33k电阻,所以选分压电阻为33k。

实际测试停止模式下,电流变成了70多uA,其中20多uA应该是ADC采样电路的。省电情况进一步改善了。

我用的电池是600mah,所以理论上停止模式能持续8000多天,但是工作电流还是挺大的(28mA),得看具体工作时间的情况了
实际测试板子图:


2022.11.11更新
几天前买了个oled显示屏,商家发错了货,VCC和GND反了,我没有看直接插到板子上了,结果OLED烧掉了,之后查找原理图修理的时候,发现OLED上自带一个稳压3v3的芯片。

就是网上一般说的622K三端稳压器,这是个低功耗芯片,所以之前一直疑惑在停止模式下,为什么oled亮着的时候功耗也很低。


一般来说,之后把屏幕集成到板子上的时候,622K不需要也行。

stm32f103c6t6下的HAL库搭建三种低功耗模式及实战分析(stm32通用)相关推荐

  1. BME680传感器-BESC空气质量IAQ算法库的三种工作模式

    模式介绍 BSEC_SAMPLE_RATE_LP模式(功耗最高) BSEC_SAMPLE_RATE_ULP模式(功耗最低) BSEC_SAMPLE_RATE_ULP加上ULP Plus模式 1.BSE ...

  2. 一文搞懂人脸识别技术的三种应用模式

    刷脸登机.刷脸取厕纸.刷脸支付.刷脸考勤.刷脸识别闯红灯的行人--人脸识别技术已成人工智能最火热的应用之一.但是,说了那么久的人脸识别,你真的了解吗?你知道人脸识别分为三种应用模式吗?今天就让我们来科 ...

  3. STM32的三种Boot模式地址分配

    STM32的三种Boot模式地址分配 一.STM32的三种Boot模式 1.主闪存存储器 2.系统存储器 3.内置SRAM 二.三种模式地址分配验证 主闪存存储器 系统存储器 三.汇编程序完成每间隔1 ...

  4. 32怎么通过一个按键实现不同工作模式_stm32几种低功耗模式的实现和差别

    点击上方蓝字关注我哦- 01 前言 按功耗由高到低排列,STM32具有运行.睡眠.停止和待机四种工作模式.上电复位后 STM32 处于运行状态,当内核不需要继续运行,就可以选择进入后面的三种低功耗模式 ...

  5. 详解虚拟机下三种联网模式

    目录 一,前言 二,虚拟机联网模式 2.1,仅主机模式(Host-Only) 2.2,NAT模式 2.2.1,NAT模式精髓 2.3,桥接模式 2.3.1,如何让虚拟机连接桥接模式 一,前言 小编最近 ...

  6. Linux下查看磁盘挂载的三种方法

    Linux下查看磁盘挂载的三种方法 2009-06-05 23:17 好久没有更新日志了,呵呵.不是没有要写的东东.实在抽不出时间来写,要准备公司的考试呢,C++考试.已经有七个月没有写C++代码了, ...

  7. qpython3 安装库_qpython3安装库的三种方法

    一个利用碎片化时间学习Python的利器:QPython.这是一款能够在安卓手机上运行Python的软件,你可以在地铁上.公交车上甚至在无聊的会议上随时随地练习Python. QPython是一种通用 ...

  8. Pycharm安装第三方库的三种方法

    Pycharm安装第三方库的三种方法 一.内部安装 二.终端安装 三.下载wheel文件安装 一.内部安装 在Setting中找到Python Interpreter,点击"+"号 ...

  9. linux文件编辑器的三种模式,Linux中文本编辑器三种工作模式切换及vi编辑器三种工作模式下命令详解...

    文本编辑器的作用 创建或修改文本文件 维护Linux系统中的各种配置文件 Linux中最常用的文本编辑器 Linux中最常用的文本编辑器 vi:类UNIX操作系统的默认文本编辑器 vim:vim时vi ...

最新文章

  1. BCH将于9月1日进行压力测试
  2. 监控 Linux 性能的 18 个命令行工具
  3. jquery和php怎么链接地址,jQuery操作url地址(附代码)
  4. kotlin键值对数组_Kotlin程序以升序对数组进行排序
  5. Vue + Element UI 实现 登陆注册基本demo实例
  6. html页面缓存meta,html中怎么用meta语句禁用页面缓存?
  7. 从用户的角度看 c语言中函数有两种,【南开大学】20秋学期(1709、1803、1809、1903、1909、2003、2009 )《C语言程序设计》在线作业答卷...
  8. 关于git clone 下载apex 过程中,缺少libssl.so.1.0.0的问题
  9. Encoder与Decoder
  10. ORACLE查询通用查询被锁对象以及解锁方案
  11. 7月28日吃鸡端游服务器维护,绝地求生7月28日维护到什么时候结束
  12. 游戏中的角色是如何“动”起来的?
  13. python统计列分布_pd.DataFrame统计各列数值多少的实例
  14. 基于Vue3+Go本地视频管理与播放系统设计与实现
  15. 【汤家凤考研数学手稿】第四章 不定积分(就找原函数,为定积分莱布尼茨公式铺垫)
  16. 14福师计算机导论在线作业一,(随机)福师18秋《计算机导论》在线作业一资料...
  17. 延边大学计算机专业考研,计算机专业考研成功经验谈
  18. aText--问题四:Need a valid command-line; Edit the string resources accordingly
  19. java.lang.NoSuchMethodError: net.sf.jsqlparser.statement.select.PlainSelect.getGroupBy()Lnet/sf/jsql
  20. IN指令和OUT指令

热门文章

  1. bxlx视频弹幕信息采集抓取软件使用教程
  2. oracle键盘不出来,告诉你笔记本键盘没反应怎么解决
  3. Unity2017.4.35f1发布安卓
  4. html h1 h2 h3并列,H1、H2、H3标签分别在什么情况下使用?
  5. Java GUI编程 简单的学号 姓名输入框,并可导入保存在txt文档中
  6. java获取服务器信息
  7. 解决问题:AttributeError: ‘_io.BufferedWriter‘ object has no attribute ‘wirte‘
  8. 【STM32H7教程】第20章 STM32H7的GPIO应用之无源蜂鸣器
  9. 【Kesci】【正式赛】2019中国高校计算机大赛——大数据挑战赛(基于FastText的新闻点击率预测qauc=0.558)
  10. 云集转型之路初见成效