|
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] |