power control



//=========================================================================
//  工程名称: E0_Demo2440_Power_Manage  
//  组成文件: power_manage.c
//  功能描述: 练习电源管理与时钟功能,改变主频,通过软延时观察LED
//  硬件连接: GPG0~GPG2与3位LED相连
//=========================================================================


#include "2440addr.h"           
#include "2440lib.h"


#define MPLLCON     (*(volatile unsigned *)0x4c000004) //MPLL Control
#define CLKDIVN (*(volatile unsigned *)0x4c000014) //Clock divider control
#define CAMDIVN (*(volatile unsigned *)0x4c000018)
#define CLKSLOW (*(volatile unsigned *)0x4c000010)
#define CLKCON (*(volatile unsigned *)0x4c00000c)


#define MPLL400MHz      0x5c<<12 | 0x1 <<4 | 0x1<<0
#define CLKDIV2         0x05            


#define CONT_NUM 0


void  delay(unsigned long dly)
{
for(; dly > 0; dly--);
}


void enable_irq_pend(void)
{


ClearPending(BIT_EINT2); //清除中断标志,防止勿中断
ClearPending(BIT_EINT3);
ClearPending(BIT_EINT4_7);
rEINTPEND |= (0x01<<4);//清子中断标志

EnableIrq(BIT_EINT2);           //使能中断
EnableIrq(BIT_EINT3);
EnableIrq(BIT_EINT4_7);
rEINTMASK &= ~(0x01<<4);//使能子中断


}


void disable_irq(void)
{
ClearPending(BIT_EINT2); //清除中断标志,防止勿中断
ClearPending(BIT_EINT3);
ClearPending(BIT_EINT4_7);
rEINTPEND |= (0x01<<4);//清子中断标志

DisableIrq(BIT_EINT2);           //使能中断
DisableIrq(BIT_EINT3);
DisableIrq(BIT_EINT4_7);
rEINTMASK |= (0x01<<4);//使能子中断
}


void __irq EintHandler(void)
{    
    disable_irq(); 
     
CLKCON &= ~(1<<2);//通过中断唤醒空闲模式

    rGPGDAT |= 0x07;//全亮
     
}


void gpio_init(void)
{
//初始化 LED IO
rGPGCON &= ~((0x03<<(0<<1))|(0x03<<(1<<1))|(0x03<<(2<<1)));
rGPGCON |= ((0x01<<(0<<1))|(0x01<<(1<<1))|(0x01<<(2<<1)));
rGPGUP &= ~((0x01<<0)|(0x01<<1)|(0x01<<2));

//中断IO初始化
rGPFCON &= ~((0x03<<(0<<1))|(0x03<<(1<<1))|(0x03<<(2<<1))|(0x03<<(3<<1))|(0x03<<(4<<1)));
rGPFCON |= ((0x02<<(2<<1))|(0x02<<(3<<1))|(0x02<<(4<<1)));
rGPFUP &= ~((0x01<<2)|(0x01<<3)|(0x01<<4)); //使能上拉
rGPFDAT &= ~((0x01<<0)|(0x01<<1)); //低两位输出0

pISR_EINT2 = (unsigned)EintHandler; //初始化中断入口
pISR_EINT3 = (unsigned)EintHandler;
pISR_EINT4_7 = (unsigned)EintHandler;

rEXTINT0 &= ~((0x07<<8)|(0x07<<12)|(0x07<<16)); //中断触发方式
rEXTINT0 |= ((0x02<<8)|(0x02<<12)|(0x02<<16));

disable_irq();

}

int Main(void)
{
int cont = CONT_NUM;  
int led_value = 1;

memcpy(0x0,(unsigned char *)0x30000000,0x1000);     //拷贝程序到0地址

gpio_init();

while(1)
{
cont++;
//无PLL时钟,采用上电初始时钟,较慢
if(16 == cont)//初始化PLL
{
MPLLCON = MPLL400MHz;      //MPLL = FCLK = 400M
CLKDIVN = CLKDIV2;   //HCLK = FCLK/4 = 100MHZ;PCLK = HCLK/2 = 50MHz
CAMDIVN = 0;
}
if(32 == cont)//进入慢速模式
{


CLKSLOW |= (1<<4)|(1<<5)|(1<<7);
CLKSLOW &= ~0x07;
}
else if(35 == cont)//退出慢速模式
{
CLKSLOW &= ~((1<<4)|(1<<5)|(1<<7));
}
else if(51 == cont)//进入空闲模式 CPU 停止工作
{
cont = 17;
enable_irq_pend();
CLKCON |= (1<<2);
}

rGPGDAT = led_value;
led_value <<=1;
if(led_value == 0x08)
led_value = 1;
delay(150000);


}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值