ATxmega128A1休眠例子
一个关于ATxmega128A1休眠例子,使用外部中断唤醒,进入各种休眠模式。 回复【楼主位】firehuohuo-----------------------------------------------------------------------
第一次发新帖,不熟悉,也不知道例子的附件放上去没有! 回复【楼主位】firehuohuo
-----------------------------------------------------------------------
还是直接粘程序吧
/***********************************************
****AVR ATXmega 电源管理_睡眠模式范例 ***
**** ***
**** 作者:firehuohuo ***
**** 编译器:WinAVR-20100110 ***
**** ***
**** 2010.3.30 ***
***********************************************/
/*
本程序简单的示范了如何令AVR ATXMEGA128A1进入睡眠状态及唤醒
电源管理及睡眠模式的介绍
进入最低耗电的掉电模式
关闭各种模块
外部中断唤醒
使用网上购买的Atxmega128A1的最小系统板,并将电源指示LED去掉(LED正常工作电流大概1.1mA)
测量的数字万用表是UNI-T UT60E,分辨率0.01uA
这个程序需要MCU进入休眠状态,未关闭JTAG接口,通过LED的变化来观察程序的运行。
这个实验里面,用MKII-cn下载线来烧录。
*/
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
//时钟定为内部RC 2MHz,F_CPU=2000000 也可以采用其他时钟
#include <avr/sleep.h>
//管脚定义
#define LED 0 //PK0 驱动LED,低电平有效
void delay_10ms(unsigned int t)
{
/*
由于内部函数_delay_ms() 最高延时较短
262.144mS@1MHz / 32.768ms@8MHz / 16.384ms@16MHz
故编写了这条函数,实现更长的延时,并能令程序能适应各种时钟频率
*/
while(t--)
_delay_ms(10);
}
volatile int sleeptime;
int main(void)
{
unsigned char i;
unsigned int tmp;
sleeptime=0;
//上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻
cli();
PORTA.OUT=0xFF; //不用的管脚使能内部上拉电阻。
PORTB.OUT=0xFF;
PORTC.OUT=0xFF;
PORTD.OUT=0xFF;
PORTE.OUT=0xFF;
PORTF.OUT=0xFF;
PORTH.OUT=0xFF;
PORTJ.OUT=0xFF;
PORTK.OUT=0xFF;
PORTQ.OUT=0xFF;
PORTR.OUT=0xFF;
PORTK.DIR=(1<<LED); //Port K的第0口控制LED闪烁
/*
看门狗定时器(上电默认是关闭的)
如果系统无需利用看门狗,这个模块也可以关闭。
若使能,则在任何休眠模式下都持续工作,从而消耗电流。
在深层次的睡眠模式下,这个电流将占总电流的很大比重。
假设看门狗定时器使能了,关闭程式如下
1. 在同一个指令内对WDTOE 和WDE 写"1“,即使WDE 已经为"1“
2. 在紧接的4 个时钟周期之内对WDE 写"0”
*/
//1<<WDT_CEN_bp 看门狗修改使能,1<<WDT_ENABLE_bp 使能看门狗,看门狗定时器控制寄存器-WDT.CTRL
WDT.CTRL=(1<<WDT_CEN_bp)|(1<<WDT_ENABLE_bp);
WDT.CTRL=(0<<WDT_ENABLE_bp); //关闭看门狗
/*
模数转换器(上电默认是关闭的)
使能时, ADC在睡眠模式下继续工作。
为了降低功耗,在进入睡眠模式之前需要禁止ADC。
重新启动后的第一次转换为扩展的转换。
假设模数转换器使能了,关闭程式如下
*/
//ADC 控制和状态寄存器A -ADCSRA, 1<<ADC_ENABLE_bp: ADC 使能,0<<ADC_ENABLE_bp: ADC 关闭
ADCA.CTRLA=(0<<ADC_ENABLE_bp);
// MCU.MCUCR=(1<<MCU_JTAGD_bp); //此命令关闭JTAG接口,谨慎使用
// MCU.MCUCR=(1<<MCU_JTAGD_bp);
//使用PORTC 的第0口作为中断唤醒,低电平唤醒【注:在使用SLEEP_MODE_PWR_DOWN模式时,只能使用电平唤醒,而不能使用上升、下降沿唤醒】
PORTC.PIN0CTRL=PORT_OPC_TOTEM_gc|PORT_ISC_LEVEL_gc;
PORTCFG.MPCMASK=0x01;
PORTC.DIR=(1<<0);
PORTC.INTCTRL=(PORTC.INTCTRL&~PORT_INT0LVL_gm)|PORT_INT0LVL_MED_gc;
PORTC.INT0MASK=0x01;
PMIC.CTRL|=PMIC_MEDLVLEN_bm;
while(1)
{
sei(); //使能全局中断
if(sleeptime>=4)
{
sleeptime=0;
}
else
{
sleeptime++;
}
//Port K的第0口控制LED闪烁
for (i=0;i<sleeptime+1;i++)//LED闪动是sleep+1次后进入掉电模式的睡眠状态
{
delay_10ms(10);
PORTK.OUT&=~(1<<LED); //点亮LED
delay_10ms(10);
PORTK.OUT|=(1<<LED); //熄灭LED
}
//通过判断sleep值,来进入不同的休眠模式
switch(sleeptime)
{
case 0:
{
set_sleep_mode(SLEEP_MODE_PWR_DOWN); //设定为掉电模式 47.94uA
}
break;
case 1:
{
set_sleep_mode(SLEEP_MODE_IDLE); //868.1uA
}
break;
case 2:
{
set_sleep_mode(SLEEP_MODE_PWR_SAVE); //47.95uA
}
break;
case 3:
{
set_sleep_mode(SLEEP_MODE_STANDBY); //150.44uA
}
break;
case 4:
{
set_sleep_mode(SLEEP_MODE_EXT_STANDBY); //150.48uA
}
break;
}
sleep_mode(); //进入睡眠状态
}
}
//使用PORTC 的第0口作为中断唤醒
ISR(PORTC_INT0_vect)
{
cli(); //禁用全局中断
delay_10ms(1);
} 顶一下,学习xmega中。 上传文件或图片时,要点击提交按钮下方的“上传文件”。如下图:
http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_542610.JPG
(原文件名:上传文件.JPG) 不错 不错 好了吗 楼主还有更多例程序吗 我买了MCUZONE的ATXMEGA128A1开发板,什么例程序都没有带,很需要一点例程序做实验。谢谢楼主 好!! 回复【7楼】smartter
楼主还有更多例程序吗 我买了mcuzone的atxmega128a1开发板,什么例程序都没有带,很需要一点例程序做实验。谢谢楼主
-----------------------------------------------------------------------
你看xmega 的AN和 datasheet就可以了
欢迎一起学习xmega 记号一下 mark ,不错,收下一了 mark,正要用,谢谢 标记,马上试一下 被迫学习中
页:
[1]