整理:Miler Shao
对于STM8S系列或STM8L101系列芯片的低功耗模式中,有个活跃停机模式[Active Halt],可以使用AWU中断唤醒。

从上表可以看出,活跃停机模式[Active Halt]有两种情形,细节这里就不延伸了,反正都可以
通过AWU 或外部中断唤醒。下面主要就AWU及其应用作些基本的介绍。
此处所说的 AWU,是指STM8S芯片内部的一个外设单元,叫自动唤醒单元[Auto Wake up Unit]。
是用来当STM8S芯片进入低功耗的活跃停机模式[ACTIVE HALT MODE]时提供一个内部的唤醒时
间基准。该时间基准的时钟源来自LSI或者分频过的HSE。自进入活跃停机休眠模式起,每经过唤
醒时间基准单位后,便利用AWU中断唤醒MCU。 事后根据HALT指令再次进入活跃停机模式,如
此往复循环。
当使用LSI时,为了保障尽可能高的时间精度,它的频率可以通过TIMER3或TIMER1的输入
捕捉进行测定。具体用那个 TIMER要看具体的数据手册。下面是AWU的时钟框图:

AWU的时钟源可以是LSI或者是经过分频后的HSE,得到的Fls,可以进行预分频,之后
给AWU计数器进行计数。
其中预分频系数由AWU_APR寄存器中的 APR[5:0]决定,最大64分频;那AWU计数器的
计数个数由AWU_TBR寄存器中的 AWU_TB[3:0]决定,分为15个时基,是它最终决定唤醒
延时的时间长度。最长时间为 64*30*2048个AWU的 Fls脉冲所占时间,如果以Fls 128K来
算,最长时间约为30.72s 。
AWU的操作步骤如下:

第1步 意思很清楚了,上面提过。
第2、3 步是为了设定从进入休眠到唤醒的时间长度,即设置唤醒时基。
第4步是使能AWU 唤醒功能。
第5步就是发布让STM8S MCU 进入活跃停机模式的指令。
关于AWU唤醒时间的计算
上面提到过了,跟2个寄存器有关,分别是AWU_APR寄存器中的 APR[5:0]和AWU_TBR中的AWU_TB[3:0]。
APR[5:0]负责对AWU的时钟源进行分频,然后给AWU的计数器计数。AWU_TB[3:0]负责控制AWU计数器
记多少个脉冲,一共有15个数据档,不同的档对应不同的计数个数。
由于寄存器设置数据本身具有一定离散性和2个寄存器数据有可能有多种乘积组合,不难理解,对于具体的
唤醒间隔,这2个寄存器的参数有个最佳组合问题,原则是尽可能靠近你所希望的时间间隔。关于这点,ST
官方参考手册有示例说明,可以借鉴参考。
最后温馨提醒:
1、AWU的时钟源Fls,是通过对CKAWUSEL选项位编程选择,经常有人找不到位置;
2、AWU的计数器只有在HALT指令之后 且MCU进入活跃停机模式时才开始计数,与此同时并使能AWU中断。
3、AWU_APR寄存器中的 APR[5:0]的系统复位后的默认值是0x3f,切不可顺手就使用该
默认值,否则AWU的计数器不工作。这点也的确有人在此流连忘返过。
4、接着第2点罗嗦下,当MCU回到运行模式时AWU是停止计数工作的。当再次进入活跃停机模式时重新初始化
并开始计数延时。