打印
[ZLG-MCU]

avr单片机电源管理及其睡眠模式配置说明(转)

[复制链接]
2493|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bairan168|  楼主 | 2010-12-18 20:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
睡眠模式可以使应用程序关闭 MCU 中没有使用的模块,从而降低功耗。AVR 具有不同 的睡眠模式,允许用户根据自己的应用要求实施剪裁。 /*
状态寄存器SREG
bit7      bit6      bit5      bit4      bit3      bit2      bit1      bit0
   I         T         H         S         V         N         Z         C
I:全局中断使能位。
    在I置位后,单独的中断使能由不同的中断寄存器控制。若I为0,则禁止中断。
MCU控制寄存器MCUCR
bit7      bit6      bit5     bit4      bit3      bit2       bit1      bit0
SM2        SE       SM1       SM0      ISC11     ISC10     ISC01     ISC00
SE:MCU休眠使能位
                          为了使 MCU 在执行 SLEEP 指令后进入休眠模式, SE 必须置位。为了确保进入休眠模
                           式是程序员的有意行为,建议仅在 SLEEP 指令的前一条指令置位 SE。MCU 一旦唤醒立
                           即清除 SE。
SM1~SM0:MCU休眠模式选择
     SM2             SM1              SM0                  休眠模式
      0               0                0                     空闲
      0               0                1               ADC 噪声抑制模式
      0               1                0                   掉电模式
      0               1                1                   省电模式
      1               0                0                     保留
      1               0                1                     保留
      1               1                0               Standby(1) 模式
      1               1                1             扩展Standby(1) 模式
  

空闲模式            当 SM2..0 为 000 时,SLEEP 指令将使 MCU 进入空闲模式。在此模式下, CPU 停止运
                      行,而 LCD 控制器、 SPI、 USART、模拟比较器、ADC、 USI、定时器 / 计数器、看门
                      狗和中断系统继续工作。这个休眠模式只停止了clkCPU 和clkFLASH     ,其他时钟则继续工作。
                       象定时器溢出与 USART 传输完成等内外部中断都可以唤醒 MCU。如果不需要从模拟比
                      较器中断唤醒 MCU ,为了减少功耗,可以切断比较器的电源。方法是置位模拟比较器控
                      制和状态寄存器 ACSR 的 ACD。如果 ADC 使能,进入此模式后将自动启动一次转换。
ADC 噪声抑制模式             当 SM2..0 为 001 时,SLEEP 指令将使 MCU 进入噪声抑制模式。在此模式下, CPU 停
                      止运行,而 ADC、外部中断、两线接口地址配置、定时器 / 计数器 0 和看门狗继续工作。
                      这个睡眠模式只停止了 clkI/O、 clkCPU 和 clkFLASH ,其他时钟则继续工作。
                      此模式提高了 ADC 的噪声环境,使得转换精度更高。 ADC 使能的时候,进入此模式将
                       自动启动一次AD 转换。ADC 转换结束中断、外部复位、看门狗复位、 BOD 复位、两线
                      接口地址匹配中断、定时器 / 计数器 2 中断、SPM/EEPROM 准备好中断、外部中断 INT0
                      或 INT1 ,或外部中断INT2 可以将 MCU 从 ADC 噪声抑制模式唤醒。
掉电模式                   当 SM2..0 为 010 时, SLEEP 指令将使 MCU 进入掉电模式。在此模式下,外部晶体停
                      振,而外部中断、两线接口地址匹配及看门狗 (如果使能的话)继续工作。只有外部复
                      位、看门狗复位、 BOD 复位、两线接口地址匹配中断、外部电平中断 INT0 或 INT1 ,或
                      外部中断 INT2 可以使 MCU 脱离掉电模式。这个睡眠模式停止了所有的时钟,只有异步
                      模块可以继续工作。
                       当使用外部电平中断方式将 MCU 从掉电模式唤醒时,必须保持外部电平一定的时间。具
                      体请参见 P65“ 外部中断 ” 。
                      从施加掉电唤醒条件到真正唤醒有一个延迟时间,此时间用于时钟重新启动并稳定下来。
                      唤醒周期与由熔丝位 CKSEL 定义的复位周期是一样的,如 P23“ 时钟源 ” 所示。
省电模式                   当 SM2..0 为 011 时, SLEEP 指令将使 MCU 进入省电模式。这一模式与掉电模式只有
                       一点不同:
                      如果定时器 / 计数器 2 为异步驱动,即寄存器 ASSR 的 AS2 置位,则定时器 / 计数器 2 在
                       睡眠时继续运行。除了掉电模式的唤醒方式,定时器 / 计数器 2 的溢出中断和比较匹配中
                       断也可以将 MCU 从休眠方式唤醒,只要 TIMSK 使能了这些中断,而且 SREG 的全局中
                       断使能位 I 置位。
                      如果异步定时器不是异步驱动的,建议使用掉电模式,而不是省电模式。因为在省电模式
                       下,若 AS2 为 0 ,则MCU 唤醒后异步定时器的寄存器数值是没有定义的。
                      这个睡眠模式停止了除 clkASY 以外所有的时钟,只有异步模块可以继续工作。
Standby 模式             当 SM2..0 为 110 时, SLEEP 指令将使 MCU 进入 Standby 模式。这一模式与掉电模式
                       唯一的不同之处在于振荡器继续工作。其唤醒时间只需要 6 个时钟周期。
        
扩展 Standby 模式        当 SM2..0 为 111 时, SLEEP 指令将使 MCU 进入扩展的 Standby 模式。这一模式与省
                       掉电模式唯一的不同之处在于振荡器继续工作。其唤醒时间只需要 6 个时钟周期。 .

*/
#include<iom16v.h>
#include<macros.h>
void Sleep_init(unsigned char mode)
{
switch(mode)
{
case 0: MCUCR&=~((1<<SM2)|(1<<SM1)|(1<<SM0));   break;//空闲
case 1: MCUCR&=~((1<<SM2)|(1<<SM1)); MCUCR|=1<<SM0; break;//ADC 噪声抑制模式
case 2: MCUCR&=~((1<<SM2)|(1<<SM0)); MCUCR|=1<<SM1; break;//掉电模式
case 3:   MCUCR&=~(1<<SM2); MCUCR|=3<<SM0;break;// 省电模式
case 6:   MCUCR|=1<<SM2;MCUCR|=1<<SM1;MCUCR&=~(1<<SM0); break;//Standby(1) 模式
case 7: MCUCR|=(1<<SM2)|(1<<SM1)|(1<<SM0); break;//扩展Standby(1) 模式
default: MCUCR&=~((1<<SM2)|(1<<SM1)|(1<<SM0)); break;
}
}
void SLEEP_ON(void)
{MCUCR|=1<<SE;
asm("SLEEP");
}
void SLEEP_OFF(void)
{
MCUCR&=~(1<<SE);
}

相关帖子

沙发
bairan168|  楼主 | 2010-12-18 20:56 | 只看该作者
先自己坐沙发。

使用特权

评论回复
板凳
爱在2012| | 2010-12-18 21:14 | 只看该作者
呵呵,楼主还在吗?不错。我赶上所谓的直播了。

使用特权

评论回复
地板
amini| | 2010-12-28 10:11 | 只看该作者
学习了。谢谢分享。

使用特权

评论回复
5
linas| | 2010-12-28 16:17 | 只看该作者
不错。:)

使用特权

评论回复
6
micheal0311| | 2011-3-5 18:16 | 只看该作者
程序执行顺序是从上向下吗?
顺序不同是不是结果不一样

使用特权

评论回复
7
年轻不再| | 2011-3-6 19:20 | 只看该作者
看的我很是头痛啊。太复杂了。

使用特权

评论回复
8
-自己人| | 2011-3-7 16:56 | 只看该作者
本人菜鸟,看不太懂

使用特权

评论回复
9
即时生效| | 2011-3-8 17:16 | 只看该作者
学习了,谢分享

使用特权

评论回复
10
6019赵文| | 2011-3-9 18:11 | 只看该作者
正常情况下一般用不着吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

776

帖子

2

粉丝