进行电池供电的产品作业时, 能耗低这一要点是无法避开不谈的主题。像STM32这种类型的单片机给出了好些种能耗低的模式, 当中最容易致使混淆不清的便是Stop以及。有不少人晓得功耗更低, 然而, 低了多少, 究竟牺牲了些什么, 以及何时应当选用哪一个, 并不一定能够说得明白。就在今日, 把这两种模式掰开了用力研磨, 好好聊一聊。先搞清楚两种模式到底是什么Stop模式, 按其字面意思理解就是处于“停”的状态, 也就是将时钟予以停掉, 在该Stop模式情形下, 所有的时钟源都会被关闭, CPU以及外设均会停止运行, 不过SRAM和寄存器的内容是得以保持的唤醒之后能够接着之前的状态继续运行。假如打个比方来说, Stop恰似那电脑的睡眠模式, 内存依旧带电, 被唤醒之后很快就能回转到工作状态。模式, 呈现出“待机”状态, 此乃STM32里功耗算是最低的模式当中的一种情况。在这种情况之下, 不但时钟停止运转了, 甚至连大部分的电源域也都被关闭掉了。SRAM以及寄存器的内容是会发生丢失现象的, 唤醒之后等同于一次重新进行复位操作, 程序是要从头开始运行的。就好似电脑呈现出的关机情形, 那种状态下几乎不耗费电量, 然而开启机器却需要齐备完善十分完整的启动流程呢。核心区别到底在哪我整理了几个关键维度的对比一看就明白功耗差一个数量级代价就是唤醒的便利性和状态保持。实际项目中怎么选说几个常见的场景你大概就有谱了。针对于必须要快速做出反应的场景而言, 采用Stop。举例有便携式测量仪表, 当用户按下一下按键之时, 就必须得马上呈现出读数这样子的情况。要是运用, 那么唤醒还得等待初始化以及屏幕点亮才行, 如此一来用户所获得的体验是比较糟糕的。以几微秒的唤醒所需时间来讲, 用户全然没法察觉到存在延迟这一现象。针对那种功耗敏锐度极高、唤醒频率不高的场景, 采用。举例来说, 就像物联网里的传感器节点每隔半小时才采集一回数据并发送出去。处于这种情形下, 每次唤醒时即便重新进行初始化也无妨害, 重点在于休眠期间要尽可能地节省电量。相差几微秒的唤醒时间, 相较于半小时的休眠时长, 是完全能够被忽略不计的。只能使用Stop来保持需要处于运行状态的情况。要是你的设备伴随着复杂的状态机, 在休眠前的那种状态十分关键, 唤醒之后还得继续进行处理, 那么这是不合适的——待到醒来后一切都忘却了, 状态全然丧失。唯有 Stop 模式能够维持 SRAM 以及寄存器, 唤醒后紧接着直接运行。几个容易踩的坑说两个我踩过的坑省得你们再走弯路。首先, 不少人在配置Stop模式之后察觉到功耗存在问题, 呈现出比手册所标示的数值高出许多的状况。极有可能是GPIO未配置妥当——处于浮空状态的输入引脚会招致额外的功耗。在进入低功耗模式之前, 将那些不使用的GPIO全都设定为模拟输入的模式, 或者设置为带有上拉或者下拉的输出模式, 如此一来, 功耗能够降低相当大的幅度。其次, 在使用之际, 切勿将那些需要进行保存的数据放置于普通SRAM当中。一旦进入某种状态普通SRAM随即就会断电, 进而那些数据便会全部丢失。要是确实存在保存少量数据的需求, 那么可以采用备份寄存器BKP或者RTC的备份域, 这些在下述情况里是保持着的。要是数据量较多, 那就存储到Flash里面。容易被忽视的还有一点, 那便是唤醒源的选择, 在Stop模式下, 几乎所有的外部中断都具备唤醒的能力, 不过可用于唤醒的源却少了许多, 仅仅就那么几个, 在进行选型之际, 就得考虑周全, 可别等到画板完成之后, 才察觉到唤醒源并不合适。简单总结一下停下, 不存在绝对的优劣之分, 只是一种关于“功耗”以及“便利性”的权衡态势, 是这样的情况。要是期望唤醒速度快, 并且能够维持状态, 那就选用Stop, 其弊端是功耗稍微高那么一丁点儿实际上已经很低了。要是渴望达成极致低功耗, 唤醒频率不高, 且不在意启动时间, 那就采用, 能够将功耗压制到最低程度。许多情况下实际项目之中, 存在着两种模式搭配使用的状况, 那便是——如果是短时间的休眠, 那么便选用Stop, 可要是长时间都不需要使用, 那就进入。而究竟如何进行组合, 这就得依据你的产品需求来定了。