天嵌 ARM开发社区

 找回密码
 注册
查看: 1451|回复: 0

计时器程序不能亮灯,找不到原因

[复制链接]
zhjd211 发表于 2011-11-5 22:35:47 | 显示全部楼层 |阅读模式
如题,请帮忙看一下

#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)
{
     
    ClearPending(BIT_TIMER0);
    Led1_run();  
}

/*系统时钟设置函数*/
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);
//  rGPBDAT &= ~(0xf << 5);
    if(rGPBDAT &(0x1<<5))
       rGPBDAT &=~(0x1<<5);
    else
       rGPBDAT |=(0x1<<5);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-26 13:37 , Processed in 1.031256 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表