AVR单片机电源管理及睡眠模式应用 AVR单片机电源管理及睡眠模式应用实例(含源代码)/*********************************************** **** AVR 电源管理_睡眠模式范例 *** **** *** **** 作者: HJJourAVR *** *
AVR单片机电源管理及睡眠模式应用
AVR单片机电源管理及睡眠模式应用实例(含源代码)
/***********************************************
**** AVR 电源管理_睡眠模式范例 ***
**** ***
**** 作者: HJJourAVR ***
**** 编译器:WINAVR20050214 ***
**** ***
***********************************************/
/*
本程序简单的示范了如何令AVR ATMEGA16进入睡眠状态及唤醒
电源管理及睡眠模式的介绍
进入最低耗电的掉电模式
关闭各种模块
外部中断唤醒
M16掉电模式的耗电情况(看门狗关闭),时钟为内部RC 1MHz
0.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=1
2 如果用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<
<方法:
1 不编程OCDEN
2 不编程JTAGEN
3 置位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<
内容 。
如果在睡眠过程中发生了复位,则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。
关于各种睡眠模式的特点与唤醒要求,内容繁多,请参考数据手册