主题 : 求大神解答,谢谢谢谢谢谢! 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 92011
精华: 0
发帖: 14
金钱: 70 两
威望: 14 点
综合积分: 28 分
注册时间: 2013-05-21
最后登录: 2014-09-14
楼主  发表于: 2013-05-22 17:53

 求大神解答,谢谢谢谢谢谢!

管理提醒: 本帖被 qq2440 从 micro2440技术交流专区 移动到本区(2013-11-18)
用的国嵌的Timer程序可是一直进不去中断,搞了一天也没弄明白,希望有大神可以帮忙,小弟刚学2440,是个十足的菜鸟!!




#define    GLOBAL_CLK        1
#include <stdlib.h>
#include <string.h>
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "profile.h"
#include "memtest.h"

void Timer0_init(void);
static void __irq IRQ_Timer0_Handle(void);
void Set_Clk(void);
static void cal_cpu_bus_clk(void);
void Led1_init(void);
void Led1_run(void);

/*延时函数*/
void delay(int times)
{
    int i,j;
    for(i=0;i<times;i++)
       for(j=0;j<400;j++);
}

/*主函数*/
void Main(void)
{    
    /*系统时钟设置*/
    Set_Clk();

    /*LED初始化*/
    Led1_init();
    
    /*定期器初始化*/
    Timer0_init();
    
    while(1);
}    
    
/*定时器初始化*/    
void Timer0_init(void)
{
  
  //Timer 0 init
  rTCFG0 = 49;              //pclk/(49+1)
  rTCFG1 = 0x03;            //16分频=62500HZ
  rTCNTB0 = 62500/2;          //TCNTB0[15:0]=计数值  
  rTCMPB0 = 0;
        
  rTCON =0x09;  //将计数值装入TCNTB0、TCMPB0
  
  ClearPending(BIT_TIMER0);
  pISR_TIMER0 = (U32)IRQ_Timer0_Handle;
  EnableIrq(BIT_TIMER0);
}

/*定时器中断处理函数*/    
static void __irq IRQ_Timer0_Handle(void)
{  
    Led1_run();
    ClearPending(BIT_TIMER0);    
}
/*系统时钟设置函数*/
void Set_Clk(void)
{
    int i;
    U8 key;
    U32 mpll_val = 0 ;
    i = 2 ;                 //don't use 100M!
                         //boot_params.cpu_clk.val = 3;
    switch ( i ) {
    case 0:    //200
        key = 12;
        mpll_val = (92<<12)|(4<<4)|(1);
        break;
    case 1:    //300
        key = 13;
        mpll_val = (67<<12)|(1<<4)|(1);
        break;
    case 2:    //400
        key = 14;
        mpll_val = (92<<12)|(1<<4)|(1);
        break;
    case 3:    //440!!!
        key = 14;
        mpll_val = (102<<12)|(1<<4)|(1);
        break;
    default:
        key = 14;
        mpll_val = (92<<12)|(1<<4)|(1);
        break;
    }
    
    //init FCLK=400M, so change MPLL first
    ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);   //set the register--rMPLLCON
    ChangeClockDivider(key, 12);    //the result of rCLKDIVN [0:1:0:1] 3-0 bit
    cal_cpu_bus_clk();    //HCLK=100M   PCLK=50M
}



static void cal_cpu_bus_clk(void)
{
    static U32 cpu_freq;
    static U32 UPLL;    
    U32 val;
    U8 m, p, s;    
    val = rMPLLCON;
    m = (val>>12)&0xff;
    p = (val>>4)&0x3f;
    s = val&3;
    //(m+8)*FIN*2 不要超出32位数!
    FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<<s))*100;     //FCLK=400M  FIN=12000000
    val = rCLKDIVN;
    m = (val>>1)&3;
    p = val&1;    
    val = rCAMDIVN;
    s = val>>8;
    
    switch (m) {
    case 0:
        HCLK = FCLK;
        break;
    case 1:
        HCLK = FCLK>>1;
        break;
    case 2:
        if(s&2)
            HCLK = FCLK>>3;
        else
            HCLK = FCLK>>2;
        break;
    case 3:
        if(s&1)
            HCLK = FCLK/6;
        else
            HCLK = FCLK/3;
        break;
    }
    
    if(p)
        PCLK = HCLK>>1;
    else
        PCLK = HCLK;
    
    if(s&0x10)
        cpu_freq = HCLK;
    else
        cpu_freq = FCLK;
        
    val = rUPLLCON;
    m = (val>>12)&0xff;
    p = (val>>4)&0x3f;
    s = val&3;
    UPLL = ((m+8)*FIN)/((p+2)*(1<<s));
    UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;
}

/*LED初始化*/
void Led1_init(void)
{
    rGPBCON &= ~(0x3<<10);
    rGPBCON |=  (0x1<<10);
}

/*LED点亮*/
void Led1_run(void)
{
    //rGPBDAT = rGPBDAT^(0x1<<5);
  
    if(rGPBDAT &(1<<5))
       rGPBDAT &=~(1<<5);
    else
       rGPBDAT |=(1<<5);
}