AVR单片机的睡眠模式

合集下载

avr各种休眠模式

avr各种休眠模式

ATmega16 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 噪声抑制模式唤醒。

ATmega16掉电模式当SM2..0 为010 时,SLEEP 指令将使MCU 进入掉电模式。

在此模式下,外部晶体停振,而外部中断、两线接口地址匹配及看门狗(如果使能的话)继续工作。

只有外部复位、看门狗复位、BOD 复位、两线接口地址匹配中断、外部电平中断INT0 或INT1,或外部中断INT2 可以使MCU 脱离掉电模式。

这个睡眠模式停止了所有的时钟,只有异步模块可以继续工作。

当使用外部电平中断方式将MCU 从掉电模式唤醒时,必须保持外部电平一定的时间。

具体请参见P65“ 外部中断”。

从施加掉电唤醒条件到真正唤醒有一个延迟时间,此时间用于时钟重新启动并稳定下来。

唤醒周期与由熔丝位CKSEL 定义的复位周期是一样的,如P23“ 时钟源” 所示。

ATmega16省电模式当SM2..0 为011 时,SLEEP 指令将使MCU 进入省电模式。

这一模式与掉电模式只有一点不同:如果定时器/ 计数器2 为异步驱动,即寄存器ASSR 的AS2 置位,则定时器/ 计数器2 在睡眠时继续运行。

除了掉电模式的唤醒方式,定时器/ 计数器2 的溢出中断和比较匹配中断也可以将MCU 从休眠方式唤醒,只要TIMSK 使能了这些中断,而且SREG 的全局中断使能位I 置位。

51单片机STM32单片机AVR单片机的区别

51单片机STM32单片机AVR单片机的区别

51单片机STM32单片机AVR单片机的区别51 单片机、STM32 单片机、AVR 单片机的区别在单片机的世界里,51 单片机、STM32 单片机和 AVR 单片机都是常见的选择,但它们在性能、架构、应用场景等方面存在着显著的差异。

首先,从性能方面来看,STM32 单片机通常具有更高的处理速度和更大的存储容量。

它采用了先进的 CortexM 内核,工作频率可以达到几百兆赫兹,并且拥有丰富的片上资源,如大量的闪存、RAM、定时器、ADC 等。

这使得 STM32 能够应对复杂的实时控制和数据处理任务,适用于对性能要求较高的应用,比如工业自动化、智能家居、无人机等领域。

相比之下,51 单片机的性能则相对较弱。

它的处理速度较慢,存储资源也比较有限。

然而,51 单片机的优势在于其简单易用、成本低廉,并且在一些对性能要求不高的简单控制场景中仍然能够发挥作用,比如小型家电、玩具等。

AVR 单片机在性能上处于 51 单片机和 STM32 单片机之间。

它具有较高的运行速度和较好的稳定性,同时也具备一定的片上资源。

在一些中等复杂度的控制任务中,AVR 单片机能够提供较为平衡的性能和成本。

在架构方面,51 单片机采用的是经典的 8 位架构,指令集相对简单。

这使得编程相对容易上手,但在处理复杂数据和算法时可能会显得有些力不从心。

STM32 单片机则基于 32 位的 ARM 架构,具有更强大的指令系统和数据处理能力。

其编程方式相对复杂,需要对 32 位编程有一定的了解,但也提供了更多的灵活性和扩展性。

AVR 单片机采用的是增强型 RISC 架构,具有高效的指令执行效率和较低的功耗。

其架构特点使得 AVR 单片机在一些对功耗和性能有一定要求的应用中表现出色。

在开发工具和生态方面,STM32 单片机拥有丰富的开发工具和资源,包括各种集成开发环境(IDE)、库函数、示例代码等。

这大大降低了开发的难度,提高了开发效率。

同时,STM32 单片机在全球范围内拥有广泛的用户群体和社区支持,开发者可以方便地交流和分享经验。

单片机的休眠模式

单片机的休眠模式

AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。

空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。

掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

单片机空闲与掉电模式2009-04-23 00:03特别对于电池供电系统来说,功耗是首要考虑的问题.我们知道单片机内部有一个电源管理寄存器PCON,这个寄存器的最低两位,IDL和PD这两位分别用来设定是否使单片机进入空闲模式和掉电模式。

1. 空闲模式当单片机进入空闲模式时,除CPU处于休眠状态外,其余硬件全部处于活动状态,芯片中程序未涉及到的数据存储器和特殊功寄存器中的数据在空闲模式期间都将保持原值。

但假若定时器正在运行,那么计数器寄存器中的值还将会增加。

单片机在空闲模式下可由任一个中断或硬件复位唤醒,需要注意的是,使用中断唤醒单片机时,程序从原来停止处继续运行,当使用硬件复位唤醒单片机时,程序将从头开始执行。

让单片机进入空闲模式的目的通常是为了降低系统的功耗,举个很简单的例子,大家都用过数字万用表,在正常使用的时候表内部的单片机处于正常工作模式,当不用时,又忘记了关掉万用表的电源,大多数表在等待数分钟后,若没有人为操作,它便会自动将液晶显示关闭,以降低系统功耗,通常类似这种功能的实现就是使用了单片机的空闲模式或是掉电模式。

以STC89系列单片机为例,当单片机正常工作时的功耗通常为4mA~7mA,进入空闲模式时其功耗降至2mA,当进入掉电模式时功耗可降至0.1μA以下。

2. 休眠模式当单片机进入掉电模式时,外部晶振停振、CPU、定时器、串行口全部停止工作,只有外部中断继续工作。

使单片机进入休眠模式的指令将成为休眠前单片机执行的最后一条指令,进入休眠模式后,芯片中程序未涉及到的数据存储器和特殊功能寄存器中的数据都将保持原值。

可由外部中断低电平触发或由下降沿触发中断或者硬件复位模式换醒单片机,需要注意的是,使用中断唤醒单片机时,程序从原来停止处继续运行,当使用硬件复位唤醒单片机时,程序将从头开始执行。

avr单片机的低功耗设计

avr单片机的低功耗设计

avr 单片机的低功耗设计基于AVR 单片机atmega48 的低功耗系统设计2010-08-25 11:53atmega48 单片机低功耗系统设计首要是选择合适的单片机。

atmega48 单片机是一款8 位微控制器,具有高性能、低功耗的显著特点。

由于采用risc 精简指令集结构,其指令集大多为单周期指令,具有高速运行的特点。

3v 供电时,未使能内部看门狗的情况下,atmega48 的典型掉电电流小于1ua 。

具体工作电流见图1 。

而且该单片机在1.8v~5.5v 的电压范围内均能正常工作,片内自带4k 字节的flash 、256 字节的e2prom, 以及512 字节sram ;并内置6~8 路10 位ad 转换器、看门狗、3 个16 位的定时/计数器、具有独立振荡器的实时计数器rtc 和6 路pwm 输出。

另外还具有五种休眠模式,引脚变化及中断可唤醒mcu 。

图1 工作电流与系统频率的关系图2 工作电流与供电电压的关系(128k)低功耗设计方法以单片机为核心构成的系统,其系统的总能耗是由单片机能耗及其外围电路能耗共同构成。

为了降低整个系统的功耗,除了要降低单片机自身的运行功耗外,还要降低外围电路的功耗。

对外围电路而言,首先选择低电压低功耗器件,如用lmv324 代替传统的lm324 ,sp3223eey 代替max232 等。

其次,cmos 器件输入引脚不能悬空。

如果输入引脚悬空,在输入引脚上很容易积累电荷,产生较大的感应电动势,使引脚电位处于0 至1 间的过渡区域。

另外,单片机外围电路应尽量避免采用阻性元件。

atmega48 单片机的功耗主要与系统频率,工作模式,电源电压及外围模块有关。

由图1 和图2 可知,atmega48 单片机的工作电流与其工作频率、工作电压成正比。

降低系统时钟频率功耗与工作频率有关。

工作频率增加时,功耗也线性的增加。

系统工作频率的降低,电路的延时增加导致系统性能下降,因此在利用频率降低系统功耗的时候,要在能耗和速度之间进行权衡。

单片机休眠机制

单片机休眠机制

单片机休眠机制一、引言单片机休眠机制是指单片机在特定条件下可以进入低功耗模式,以降低能耗并延长电池寿命。

随着物联网的快速发展,对于功耗要求越来越高的应用场景,单片机休眠机制显得尤为重要。

本文将介绍单片机休眠机制的原理和应用。

二、单片机休眠机制的原理单片机休眠机制的原理是通过控制单片机内部的时钟和外设的工作状态来降低功耗。

当单片机进入休眠模式后,时钟会停止运行,外设会进入低功耗模式,从而降低整个系统的功耗。

具体来说,单片机休眠机制包括以下几个关键点:1. 时钟控制:在休眠模式下,单片机的时钟会停止运行,从而降低功耗。

只有当外部中断或定时器中断触发时,单片机才会被唤醒,重新开始运行。

2. 外设控制:在休眠模式下,单片机的外设可以进入低功耗模式,从而降低整个系统的功耗。

外设低功耗模式的具体实现方式有多种,例如关闭不必要的外设、降低外设的工作频率等。

3. 状态保存:在进入休眠模式之前,单片机需要保存当前的状态信息,以便在唤醒后能够恢复到之前的工作状态。

这包括保存寄存器的值、保存外设的配置信息等。

三、单片机休眠机制的应用单片机休眠机制在很多应用场景中都得到了广泛的应用。

以下是一些常见的应用场景:1. 电池供电系统:在电池供电的系统中,为了延长电池的使用寿命,单片机通常会采用休眠机制来降低功耗。

在系统空闲时,单片机可以进入休眠模式,待外部中断或定时器中断触发时再唤醒。

2. 无线通信系统:在无线通信系统中,单片机需要不断监听来自外部的信号,但是又需要降低功耗以延长电池寿命。

单片机可以通过休眠机制实现定时唤醒,以间隔性地监听信号。

3. 物联网设备:在物联网设备中,单片机通常需要长时间运行,但是功耗要求又很高。

单片机可以利用休眠机制实现周期性地运行和休眠,以降低功耗并延长设备寿命。

四、单片机休眠机制的优势和挑战单片机休眠机制的优势在于可以降低功耗并延长电池寿命,适用于很多低功耗应用场景。

然而,单片机休眠机制也面临一些挑战:1. 唤醒时间:由于单片机进入休眠模式后时钟停止运行,重新唤醒需要一定的时间。

AVR休眠方式的设定

AVR休眠方式的设定

AVR休眠方式的设定
当需要使用休眠方式时,只要包含头文件“AVR/sleep.h”即可轻松实现。

(基于AVR-Studio 4.0+AVR-G CC,单片机型号:ATtiny24)
使用详细步骤如下:
1)包含该头文件AVR/sleep.h;
2)定义睡眠模式;
如:set_sleep_mode(SLEEP_MODE_ADC);//表示将CPU设置成ADC Noise Ca ncler模式
其它睡眠模式可在sleep.h头文件中找到,一般有:SLEEP_MODE_IDLE、SLEE P_MODE_ADC、SLEEP_MODE_PWR_DOWN等。

3)关全局中断;//cli();
4)睡眠模式允许; //sleep_enable();
5)开全局中断;//sei();
6)进入睡眠模式; //sleep_cpu();
7)等待中断将CPU唤醒
8)CPU唤醒后禁止睡眠模式; //sleep_disable();
完整的代码如下:
/*应用程序代码*/
set_sleep_mode(SLEEP_MODE_ADC);/*为提高AD转换精度,在转换时将CP U设置成ADC Noise Cancler模式*/
cli(); //关全局中断
sleep_enable(); //CPU睡眠允许
sei(); //开全局中断
/*允许ADC中断*/
/*启动AD转换*/
sleep_cpu(); /*启动AD后,CPU马上进入睡眠模式(ADC Noise Can cler),等待AD转换结束,产生ADC中断而将CPU唤醒*/
sleep_disable(); //CPU唤醒后从ADC中断返回,并接着从这里执行指令,禁止睡眠模式,。

FreeRTOS—低功耗之睡眠模式,停机模式,待机模式

FreeRTOS—低功耗之睡眠模式,停机模式,待机模式

FreeRTOS—低功耗之睡眠模式,停机模式,待机模式低功耗是 MCU 的⼀项重要的指标,⽐如某些可穿戴的设备,其携带的电量有限,如果整个电路消耗的电量特别⼤的话,就会经常出现电量不⾜的情况,影响⽤户体验。

STM32F103 睡眠模式介绍说明:在 FreeRTOS 系统上⾯实现睡眠⽅式仅需了解这⾥讲解的知识基本就够⽤了,更多睡眠⽅式的知识请看 STM32F103 参考⼿册和Cortex-M3 权威指南。

在系统或电源复位以后,微控制器处于运⾏状态。

当 CPU 不需继续运⾏时,可以利⽤多种低功耗模式来节省功耗,例如等待某个外部事件时,⽤户需要根据最低电源消耗、最快速启动时间和可⽤的唤醒源等条件,选定⼀个最佳的低功耗模式。

STM32F103 有三种低功耗模式:睡眠模式(Cortex™-M3 内核停⽌,所有外设包括 Cortex-M3 核⼼的外设,如 NVIC、系统滴答定时器 Systick 等仍在运⾏)。

停机模式(所有的时钟都已停⽌)。

待机模式(1.8V 电源关闭)。

如何进⼊睡眠模式通过执⾏ WFI(等待中断)或 WFE(等待事件)指令进⼊睡眠状态。

根据 Cortex™-M3 系统控制寄存器中的 SLEEPONEXIT 位的值,可以通过两种⽅案选择睡眠模式进⼊机制:SLEEP-NOW:如果 SLEEPONEXIT 位被清除,当 WFI 或 WFE 被执⾏时,微控制器⽴即进⼊睡眠模式。

SLEEP-ON-EXIT:如果 SLEEPONEXIT 位被置位,系统从最低优先级的中断处理程序中退出时,微控制器就⽴即进⼊睡眠模式。

实际应⽤中我们采⽤ WFI 指令进⼊睡眠模式,睡眠模式的进⼊机制是采⽤的 SLEEP-NOW。

因为系统复位上电后 SLEEPONEXIT 位是被清除的,所以这个位也不需要专门的去设置。

另外在睡眠模式下,所有的 I/O 引脚都保持它们在运⾏模式时的状态。

在 FreeRTOS 系统上,不使⽤ tickless 低功耗模式的话,我们可以将 WFI 指令放到空闲任务⾥⾯实现。

稳定的使用AVR单片机的睡眠与唤醒功能

稳定的使用AVR单片机的睡眠与唤醒功能

稳定的使用AVR单片机的睡眠与唤醒功能
最近有个项目需要用触动按键做产品的电源开关.MPU用的是
M16.既然是电源开关,那么关掉电源的时候,电能损耗应该接近0.自然想到了AVR单片机的睡眠与唤醒功能,使用外部中断实现状态转换不就OK了.可事情能有想像的那么简单吗?
1.第一个问题,睡眠了唤醒不了.可能是以下原因
a. 睡眠前没有打开对应的外部中断端口
b.外部中断端口不是异步低电平触发中断
c. 睡眠前设置了外部异步中断,但是没有开启全局中断.
d.中断信号线忘记连接或连接错误.
2.使用按钮开关做中断信号时,有时能唤醒,有时不能唤醒,有时不给信号却反复睡眠-唤醒,可能是以下原因.
a.与外围芯片信号不同,使用按钮时存在抖动信号,需要消抖,简单的办法是在
中断服务中加上延时.
硬件方面,开关并上一个电容,且用一个电阻与开关串联.
b.外部中断的端口方向最好设置为输入,并且端口的内部上拉电阻应该使能.
c.睡眠前,应尽量将睡眠中无用的端口方向设置为输入,且拉低.防止误触发.
3.虽然睡眠了,可芯片的电能损耗却达不到理想要求,可能是以下原因.
a.没有关闭模数,比较,看门狗,JTGA,掉电检测(部分功能上电默认关闭)
b.所有的端口没有设置成输入,且没有将无用的端口拉低(PINx = 0x00).
以上是我这个菜鸟的查阅和试验总结,希望能对阅读者有所帮助!
如有误点,请指正!
高手见笑!。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

AVR单片机电源管理及睡眠模式应用 AVR单片机电源管理及睡眠模式应用实例(含源代码)/*********************************************** **** AVR 电源管理_睡眠模式范例 *** **** *** **** 作者: HJJourAVR *** *AVR单片机电源管理及睡眠模式应用AVR单片机电源管理及睡眠模式应用实例(含源代码)/*************************************************** AVR 电源管理_睡眠模式范例 ******* ******* 作者: HJJourAVR ******* 编译器:WINAVR20050214 ******* **************************************************//*本程序简单的示范了如何令AVR ATMEGA16进入睡眠状态及唤醒电源管理及睡眠模式的介绍进入最低耗电的掉电模式关闭各种模块外部中断唤醒M16掉电模式的耗电情况(看门狗关闭),时钟为内部RC 1MHz0.9uA@Vcc=5.0V [手册的图表约为1.1uA]0.3uA@Vcc=3.3V [手册的图表约为0.4uA]//测量的数字万用表是FLUKE 15B,分辨率0.1uA这个程序需要MCU进入休眠状态,为实现最低功耗,JTAG接口会被关闭,只能通过LED的变化来观察程序的运行。

这个实验里面,用STK500(AVRISP) ISP下载线来烧录更方便。

熔丝位设置1 关断BOD功能 BODEN=12 如果用ISP方式烧录,就可以完全关闭JTAG口了 OCEEN=1,JTAGEN=1*/#include#include#include#include//时钟定为内部RC 1MHz,F_CPU=1000000 也可以采用其他时钟#include/*sleep.h里面定义的常数,对应各种睡眠模式#define SLEEP_MODE_IDLE 0空闲模式#define SLEEP_MODE_ADC _BV(SM0)ADC 噪声抑制模式#define SLEEP_MODE_PWR_DOWN _BV(SM1)掉电模式#define SLEEP_MODE_PWR_SAVE (_BV(SM0) | _BV(SM1))省电模式#define SLEEP_MODE_STANDBY (_BV(SM1) | _BV(SM2))Standby 模式#define SLEEP_MODE_EXT_STANDBY (_BV(SM0) | _BV(SM1) | _BV(SM2)) 扩展Standby模式函数void set_sleep_mode (uint8_t mode);设定睡眠模式void sleep_mode (void);进入睡眠状态*///管脚定义#define LED 0 //PB0 驱动LED,低电平有效#define KEY_INT2 0 //PB3 按键,低电平有效void delay_10ms(unsigned int t){/*由于内部函数_delay_ms() 最高延时较短262.144mS@1MHz / 32.768ms@8MHz / 16.384ms@16MHz故编写了这条函数,实现更长的延时,并能令程序能适应各种时钟频率*/while(t--)_delay_ms(10);}int main(void){unsigned char i;//上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻PORTA=0xFF; //不用的管脚使能内部上拉电阻。

PORTC=0xFF;PORTD=0xFF;PORTB=0xFF;DDRB =(1<<led); pb0设为输出高电平,灯灭=""/*端口引脚进入休眠模式时,所有的端口引脚都应该配置为只消耗最小的功耗。

最重要的是避免驱动电阻性负载。

在休眠模式下I/O 时钟clkI/O 和ADC 时钟clkADC 都被停止了,输入缓冲器也禁止了,从而保证输入电路不会消耗电流。

在某些情况下输入逻辑是使能的,用来检测唤醒条件。

用于此功能的具体引脚请参见“数字输入使能和休眠模式”。

如果输入缓冲器是使能的,此时输入不能悬空,信号电平也不应该接近VCC/2,否则输入缓冲器会消耗额外的电流。

IO作输出(DDR=1)时,维持状态不变*//*看门狗定时器(上电默认是关闭的)如果系统无需利用看门狗,这个模块也可以关闭。

若使能,则在任何休眠模式下都持续工作,从而消耗电流。

在深层次的睡眠模式下,这个电流将占总电流的很大比重。

假设看门狗定时器使能了,关闭程式如下1. 在同一个指令内对WDTOE 和WDE 写"1“,即使WDE 已经为"1“2. 在紧接的4 个时钟周期之内对WDE 写"0”*/WDTCR=(1<< p=""><<wde);WDTCR=(0<//或使用wdt.h里面的wdt_disable()函数/*模数转换器(上电默认是关闭的)使能时, ADC在睡眠模式下继续工作。

为了降低功耗,在进入睡眠模式之前需要禁止ADC。

重新启动后的第一次转换为扩展的转换。

假设模数转换器使能了,关闭程式如下*/ADCSRA=(0<<aden);/*模拟比较器(上电默认是打开的,需要手工关闭)在空闲模式时,如果没有使用模拟比较器,可以将其关闭。

在ADC 噪声抑制模式下也是如此。

在其他睡眠模式模拟比较器是自动关闭的。

如果模拟比较器使用了内部电压基准源,则不论在什么睡眠模式下都需要关闭它。

否则内部电压基准源将一直使能。

关闭程式如下*/ACSR=(1</*掉电检测BOD (由熔丝位BODEN控制)如果系统没有利用掉电检测器BOD,这个模块也可以关闭。

如果熔丝位BODEN 被编程,从而使能了BOD 功能,它将在各种休眠模式下继续工作。

在深层次的休眠模式下,这个电流将占总电流的很大比重。

设置熔丝位BODEN=1 关断BOD功能*//*片内基准电压使用BOD、模拟比较器和ADC 时可能需要内部电压基准源。

若这些模块都禁止了,则基准源也可以禁止。

重新使能后用户必须等待基准源稳定之后才可以使用它。

如果基准源在休眠过程中是使能的,其输出立即可以使用。

当BOD、模拟比较器和ADC都禁止了,则基准源也自动禁止了。

/*JTAG 接口与片上调试系统如果通过熔丝位OCDEN使能了片上调试系统,当芯片进入掉电或省电模式时主时钟保持运行。

在休眠模式中这个电流占总电流的很大比重。

下面有三种替代方法:1 不编程OCDEN2 不编程JTAGEN3 置位MCUCSR 的JTD当JTAG 接口使能而JTAG TAP 控制器没有进行数据交换时,引脚TDO 将悬空。

如果与TDO 引脚连接的硬件电路没有上拉电阻,功耗将增加。

器件的引脚TDI 包含一个上拉电阻,因此在扫描链中无需为下一个芯片的TDO 引脚设置上拉电阻。

通过置位MCUCSR寄存器的JTD 或不对JTAG 熔丝位编程可以禁止JTAG 接口。

JTD: 禁止JTAG 接口(MCU控制与状态寄存器MCUCSR Bit7)此位为0 时,如果JTAGEN熔丝位被编程则JTAG 接口使能。

如果这位为1, JTAG接口禁止。

为了避免无意的禁止或使能JTAG接口,必须通过一个时间序列来改变JTD 位。

应用软件必须在四个时钟周期内将期望的数值两次写入JTD。

如果JTAG 接口没有与其他JTAG电路连接, JTD应该置位。

这样做的原因是为了避免JTAG接口TDO引脚的静态电流。

在软件中关闭JTAG接口的方法*/MCUCSR=(1<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); 使能外部中断int2sei(); //使能全局中断while(1){for (i=0;i<10;i ) //LED闪动10次后进入掉电模式的睡眠状态{delay_10ms(30);PORTB&=~(1<<led); 点亮leddelay_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); 点亮leddelay_10ms(500);PORTB|=(1<<led); 熄灭leddelay_10ms(100);/*LED长亮5秒钟,熄灭1秒钟后,退出中断服务程序,然后返回到SLEEP 的下一条指令*/}/*程序运行效果万用表打到直流电流的最小档位(uA分辨率),接到开关的两头烧录后要把STK500拔出,否则无法测得正确的电流数据。

上电后LED闪动10次后进入掉电模式的睡眠状态此时可断开开关看看万用表的读数然后接通开关按下 INT2按键,将会发现LED长亮5秒钟,熄灭1秒钟后,退回主程序,LED闪动10次后进入掉电模式的睡眠状态如果按下复位按键,马上复位。

相关文档
最新文档