欢迎光临MCUWAY! 本站网名:单片机之路  永久域名:www.mcuway.com

设为首页

加入收藏

电子基础 初学MCU 单片机类型 MCU程序 MCU应用 设计软件 测控电路 技术论坛
 您现在的位置: 单片机之路 >> 单片机类型 >> AVR系列 >> 文章正文

AVR电源管理——睡眠模式范例


在软件中关闭JTAG接口的方法
*/
MCUCSR=(1<<JTD);
MCUCSR=(1<<JTD);
/*
掉电模式
当SM2..0 为010 时, SLEEP 指令将使MCU 进入掉电模式。
在此模式下,外部晶体停振,而外部中断、两线接口地址匹配及看门狗(如果使能的话)继续工作。
只有外部复位、看门狗复位、BOD 复位、两线接口地址匹配中断、外部电平中断INT0 或INT1,或外部中断INT2 可以使MCU 脱离掉电模式。
这个睡眠模式停止了所有的时钟,只有异步模块可以继续工作。
当使用外部电平中断方式将MCU 从掉电模式唤醒时,必须保持外部电平一定的时间。
从施加掉电唤醒条件到真正唤醒有一个延迟时间,此时间用于时钟重新启动并稳定下来。
唤醒周期与由熔丝位CKSEL 定义的复位周期是一样的。
如果在睡眠过程中发生了复位,则MCU 唤醒后从中断向量开始执行
使能的中断可以将进入睡眠模式的MCU 唤醒, 经过启动时间,外加4个时钟周期后,MCU就可以运行中断例程了。然后返回到SLEEP 的下一条指令。
*/
MCUCSR=(0<<ISC2); //INT2 的下降沿激活中断(默认的,这句话可以不写)
GICR=(1<<INT2); //使能外部中断INT2
sei(); //使能全局中断
while(1)
{
for (i=0;i<10;i++) //LED闪动10次后进入掉电模式的睡眠状态
{
delay_10ms(30);
PORTB&=~(1<<LED); //点亮LED
delay_10ms(30);
PORTB|=(1<<LED); //熄灭LED
}
set_sleep_mode(SLEEP_MODE_PWR_DOWN); //设定为掉电模式
sleep_mode(); //进入睡眠状态
/*
也可以自行编写
MCUCR=(0<<SM2)|(1<<SM1)|(0<<SM0); //设定为掉电模式
asm volatile(“sleep” : : ); //进入睡眠状态
*/
}
}

SIGNAL(SIG_INTERRUPT2) //外部中断2服务程序 唤醒源
{
PORTB&=~(1<<LED); //点亮LED
delay_10ms(500);
PORTB|=(1<<LED); //熄灭LED
delay_10ms(100);
/*LED长亮5秒钟,熄灭1秒钟后,退出中断服务程序,然后返回到SLEEP 的下一条指令*/
}

/*
程序运行效果
万用表打到直流电流的最小档位(uA分辨率),接到开关的两头
烧录后要把STK500拔出,否则无法测得正确的电流数据。
上电后LED闪动10次后进入掉电模式的睡眠状态
此时可断开开关
看看万用表的读数
然后接通开关
按下 INT2按键,将会发现LED长亮5秒钟,熄灭1秒钟后,退回主程序,LED闪动10次后进入掉电模式的睡眠状态
如果按下复位按键,马上复位。
网友可以编写其他睡眠模式/开关各种模块/其他时钟源/其他电源电压来测试电流消耗情况
*/

/*
电源管理及睡眠模式
睡眠模式可以使应用程序关闭MCU中没有使用的模块,从而降低功耗。
AVR 具有不同的睡眠模式,允许用户根据自己的应用要求实施剪裁。
进入睡眠模式的条件是置位寄存器MCUCR的SE,然后执行SLEEP 指令。
具体哪一种模式( 空闲模式、ADC 噪声抑制模式、掉电模式、省电模式、Standby 模式和扩展Standby模式) 由MCUCR 的SM2、SM1 和SM0 决定。
使能的中断可以将进入睡眠模式的MCU 唤醒。
经过启动时间,外加4个时钟周期后,MCU就可以运行中断例程了。然后返回到SLEEP 的下一条指令。
唤醒时不会改变寄存器文件和SRAM的内容。
如果在睡眠过程中发生了复位,则MCU 唤醒后从中断向量开始执行
需要了解AVR芯片内部不同的时钟系统及其分布,在选择合适的睡眠模式时非常有用。
MCU控制寄存器-MCUCR
MCU控制寄存器包含了电源管理的控制位。
Bits 7, 5, 4 – SM2..0: 休眠模式选择位 2、1 和0
这些位用于选择具体的休眠模式。
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)
Note:1 仅在使用外部晶体或谐振器时Standby 模式与扩展Standby 模式才可用。
Bit 6 – SE: 休眠使能
为了使MCU 在执行SLEEP 指令后进入休眠模式, SE必须置位。
为了确保进入休眠模式是程序员的有意行为,建议仅在SLEEP 指令的前一条指令置位SE。
MCU 一旦唤醒立即清除SE。
关于各种睡眠模式的特点与唤醒要求,内容繁多,请参考数据手册
*/

上一页  [1] [2] [3] 

普通文章28课:单片机音乐汇编程序设计
普通文章27课:单片机的一些基本概念
普通文章26课:单片机矩阵式键盘接口技术
普通文章非常详细的51单片机引脚介绍
普通文章图解使用Keil C51软件的九个步骤
普通文章哈佛(Harvard)结构的单片机的原理图
普通文章单片机引脚及功能说明
普通文章c51单片机c语言教程介绍
普通文章第一课 建立你的第一个KeilC51项目
普通文章第二课 HEX文件的生成和MCU最小系统
普通文章第三课 C51语言的数据类型
普通文章第四课 C51常量
普通文章第五课 C51变量
普通文章第六课 C51运算符和表达式
普通文章第七课 运算符和表达式(关系运算符)
普通文章第八课 运算符和表达式(位运算符)
普通文章第九课 C51运算符和表达式(指针和地址
普通文章第十课 C51表达式语句及仿真器
普通文章第十一课 C51复合语句和条件语句
普通文章第十二课 C51开关分支语句
普通文章第十三课 C51循环语句
普通文章第十四课 C51函数
普通文章第十五课 C51数组的使用
普通文章第十六课 C51指针的使用
普通文章第十七课 C51结构、联合和枚举的使用

  • 上一篇文章:
  • 下一篇文章:
  • 更多精彩内容>>>

    普通文章电流单位
    普通文章功率单位
    普通文章什么是达林顿管?
    普通文章晶闸管的作用与原理

    学习单片机的必经之路——单片机之路,永久域名:www.mcuway.com