这篇文章我们聊下功耗管理,不仅仅是STM8S,51,32,等等单片机都绕不过这个坎,在文章最后试图给出一些设计的通法。
对于由电池供电的系统来说,功耗是非常重要的指标。通常,要求系统的平均功耗小于某个目标值来保证一个适当的电池续航时间。这意味着系统可以在短时间内功耗较大,而把平均功耗维持在目标值以下。
在互补金属氧化物半导体(CMOS)数字逻辑电路中,功耗为下列因子之和:
● 静态功耗(主要由晶体管的偏置电流和漏电流产生)
● 动态功耗,取决于电源电压和工作时钟频率,按照下面公式:动态功耗 = CV^2f,其中
─ C为CMOS负载电容
─ V为电源电压
─ f为时钟频率
在CMOS逻辑电路以一定时钟频率运行时,静态功耗与动态功耗相比是可以忽略的。但在一些低功耗模式下,时钟不再运行,此时静态功耗是主要的功耗源。
因此,功耗主要取决于:
● 微控制器单元(MCU)的芯片面积:所采用的工艺,晶体管的数量,片上集成和使用的模拟功能/外设。
● MCU电源电压:CMOS逻辑电路中消耗的电流与电源电压的平方成正比。因此,可以通过降低供电电压来降低功耗。
● 时钟频率:在不要求进行高速处理的应用中,降低时钟频率可以降低功耗。
● 激活的外设数目或使用的MCU功能数目(CSS、BOR、PVD……):激活的外设数目越多,或使用的MCU功能数目越多,则功耗越大。
● 工作模式:功耗会随着应用所处的不同功耗模式而改变(CPU开启/关闭,晶振开启/关闭……)。
系统在3v-5.5v之间,其实是比较宽的,看框图有两个稳压器。
就分为内外两种
完整的时钟树
从这里输入
主时钟源(f MASTER )为内核和外设提供时钟,只读寄存器CLK_CMSR包含了当前主时钟源的选择信息。可以读出来。
这些就是时钟管理
STM8S的时钟管理起来比较自由,随便的开关。
给大家表演个封装库。
先搞个转换用的宏函数.
从基地址开始+相应的偏移地址就算封装好啦!
偏移的地址在数据手册里面,是0。 复位值是重启以后寄存器的值,在单片机或者现代数字编程领域,一切都是精确可控。
也就是说,是这样的一种地址的转换方式
在看这个,高速的外部晶振有没有准备就绪
左到右,上到下的看。7:2之间都是保留的位置,为什么是8个,记得单片机是8位的吗?
下面的r是说,你对这个寄存器可以干什么?无非就是读和写。r是读,读出来的是意思是什么?
下面的表格中有解释,怎么样,是不是很简单?
同样的在固件库里面是这样的方式。
在复位后,微控制器默认工作在运行模式。按照寄存器HSIDIV的复位值,默认的CPU时钟频率为HSI的16MHz除以8。
在不需要CPU运行,例如等待某外部事件时,有好几个低功耗模式可用来节省能耗。用户应当在低功耗、短启动时间、适当的外设功能和可用的唤醒源这几个因素间,折衷选择使用哪一种低功耗模式。
STM8S产品具有3种主要的低功耗模式:
● 等待模式(CPU停止,外设保持工作)
● 活跃停机(Active HALT)模式(CPU停止,如果使能AWU(自动唤醒)和IWDG(独立看门狗),则它们保持工作,其余外设停止)
● 停机(HALT)模式(一切工作停止)
在运行和等待模式下,还可以采取以下手段来降低功耗:
● 降低系统时钟频率
● 关闭不使用外设的时钟
下面总结了STM8S产品的所有功能模式。该表给出了不同工作模式下MCU各部分工作情况的概述。不同模式组合可以满足不同应用对功耗和唤醒时间的不同要求。
使用LPVR(低功耗稳压器)时,MVR(主稳压器)会自动关闭。
上面频繁的出现几种运行的模式,比如:
这个模式的性能最强
等待模式,等一个中断,等一个美好的未来。
模式第一步,先进入,通过汇编指令进入,下面是这些外设可以推出等待模式,进入运行模式。
这个比较有趣,确实是唤醒了CPU,但是是ISR,很小,独立主函数外。可以不进行完整的进出栈的控制。
AWU是自动唤醒的功能。
其实就是一个外设在运行。
这里我不知道理解的对不对,AWU来了一个中断,MCU也同步的有了变化,我看不懂这里是颠倒个啥???接着开始进入停机的模式,AWU在工作,CPU在呼呼。
在活跃停机模式的停机阶段,用户可以选择使用哪个稳压器(主稳压器MVR或者低功耗稳压器LPVR),也可以选择闪存的状态(工作模式或者掉电模式)。使用LPVR并将闪存设置成掉电模式可以降低功耗,但是会增加唤醒时间。
活跃停机模式可以有效地降低以MCU为核心系统的平均功耗。
说是可以自己控制这个LDO,但是没有找到寄存器。
功耗设置
这个是数据手册的说明
这里也是封装库的时候的写法
这个设计真骚呢~快速时钟启动,之后再切换,或者不切换。
这个就说的更详细了,AWU就是个变花样的中断。
停机模式,没什么好说的,我tm直接晚安啊!
那如何设计呢?
最小化功耗规则
● 关闭所有不使用的外设(除了USART、LINUSART和SWIM以外所有外设默认关闭),并使用PCG功能(通过CLK_PCKENRx寄存器)来关闭不使用外设的时钟(时钟默认为打开)。
● 在运行模式下,如果一个循环的大小小于一个存储器块,循环代码必须位于同一个存储器块中。
● 所有不使用的管脚都应当设置为输出低电平。绝对不能设置任何不用管脚为悬空输入状态,这会导致不必要的高功耗。
● 如果需要某些外设持续工作和外部中断功能时,选择等待模式作为低功耗模式。
● 选择合适的V DD 值,V DD 值越高,功耗越高。
● 使用尽可能小的时钟频率,可以通过设置CPU的8个预分频数和4个HSI预分频数来得到适合应用程序的时钟频率。
为应用选择最佳的低功耗模式
● 由电池供电的应用,在大多数时间MCU处于睡眠模式:
─ 如果MCU由外部事件唤醒,且唤醒周期并不固定,而要求功耗尽可能低。这时,建议使用停机模式来尽可能延长电池续航时间。
─ 如果MCU的唤醒不依靠外部事件,而是依赖于某个不严格精准的周期,建议使用AWU和活跃停机模式。
● 由电池供电的应用,在大多数时间MCU处于唤醒模式:
─ 如果MCU需要执行一些周期性的工作,且没有需要持续运行的外设,建议使用活跃停机模式
─ 如果至少有一个外设要持续工作,且中断可以唤醒MCU,建议使用等待模式。
● 由固定电源供电的应用,但是功耗是重要指标
─ 如果需要MCU持续工作,建议使用运行模式,但是应当选择时钟预分频系数获得合适的时钟频率。