对应电池供电的产品,在不使用的时候,单片机和外设都应该进入休眠状态 用于减少对电池电量消耗 在使用的时候又能够通过按键或其他信号唤醒系统,然后进入正常工作状态 在电压V3.3V的情况下,应广单片机的休电流几乎在2A以下 经常测到都是一点几uA.非常不那么应广单片机的低功耗和按键唤醒是怎么实现的呢?不多说上代码.除了外部唤醒 还有一种机制是内部定时器定时唤醒
分两个部分写,省电模式和掉电模式,这也是规格书上描述的官方叫法,本文统称为休眠模式。
一:stopexe模式(省电模式)
这个省电模式可以通过IO唤醒和中断唤醒。
如果使用IO唤醒,那么设置好IO后,IO输入电平产生变化就会唤醒MCU。
arrow_forward_ios阅读文章
% buffered
00:00
00:21
01:31
如果使用中断唤醒:
1,如果使用T16定时中断,那么在定时中断产生的时候就会唤醒MCU,由此也可以看出,进入省电模式stopexe时,MCU内部时钟仍然在运行,以便计时,而关闭的只是系统时钟sysclk,因此,在使用定时中断T16作为唤醒源时,务必要使用内部时钟IHRC/ILRC作为时钟源。
2,如果使用比较器中断作为唤醒源,在选择比较器输入端时,不要使用BG作为比较源,因为在进入省电模式时,BG也会关闭,会导致无法产生中断唤醒。
在进入省电模式前,因为MCU内部时钟不会关闭,而看门狗此时有打开的话,那么有可能在省电模式中产生不必要的复位,所以在进入省电模式前要关闭看门狗。
二:stopsys模式(掉电模式)
这个模式是深度省电,只能IO唤醒,MCU所有的时钟都会关闭。
三:程序设置
关联寄存器有「 IO端口寄存器,IO端口方向寄存器,IO端口上拉寄存器和IO端口数字寄存器」。
比如设置PA0作为IO唤醒口,那么IO端口设置为:
PA = 0B_XXXX_XXX0; // "X"代表任意,供实际应用写1或者0
PAC = 0B_XXXX_XXX0; //"0"代表输入
PAPH = 0B_XXXX_XXX1; // 「1」代表开内部上拉
$ padier 0b_xxxx_xxx1; //"1"代表打开PA0的唤醒功能 和数字输入功能
...
while(1){
stopsys; //休眠
}
在仿真的时候,如果休眠了,光标会停止在stopsys这句上,如下图:
唤醒后,是跑stopsys的下一行指令,而不是先进去中断。
在程序写休眠时,因为电平有变化就产生唤醒的动作,那么可能发生的现象是,比如MCU在休眠中,按键按下MCU唤醒,程序跑了一个循环又再次进入休眠,此时按键还没松开,而等按键再松开时,又再产生了电平变化唤醒MCU,那么表现出来的现象就像是按键没有唤醒功能一样,因此要避免这个问题,可以在程序上做个时间差,比如唤醒之后,等1秒或者等按键松开之后再去跑程序大循环。