打印
[嵌入式linux]

linux定时器0驱动进入定时器中断29次就重起!!

[复制链接]
3269|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LiangXinJi|  楼主 | 2010-6-14 09:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
linux定时器0驱动进入定时器中断29次就重起!!而在这29次中其它的程序都死了,请楼主,和知道的朋友帮我看下什么原因!!下面是定时器的初始化代码》谢谢了!!

static int init_timer0(void)
{
   // printk("timer init is on!");
   
    unsigned long tcon=0;
    unsigned long tcnt;
    unsigned long tcfg1;
    unsigned long tcfg0;
  //    unsigned long prescaler0;
//    unsigned long timer_mux0;

    struct clk *clk_p;
    unsigned long pclk;
       printk("timer init is on!");
   
    tcfg1= __raw_readl(S3C2410_TCFG0);//读取定时器配置寄存器1的值
    tcfg0=__raw_readl(S3C2410_TCFG0); //读取定时器配置寄存器0的值
    //prescaler = 50
    tcfg0&=~S3C2410_TCFG_PRESCALER0_MASK;
    tcfg0 |=49; //设置tcfg0的值为49
   
    //mux = 1/16
    tcfg1 &=~S3C2410_TCFG1_MUX0_MASK;
    tcfg1 |=S3C2410_TCFG1_MUX0_DIV16; //设置tcfg1的值为0x0011即:1/16
   
    __raw_writel(tcfg1,S3C2410_TCFG1);// 将值tcfg1写入定时器配置寄存器1中
    __raw_writel(tcfg0,S3C2410_TCFG0); //将值tcfg0写入定时器配置寄存器0中
   
    clk_p=clk_get(NULL,"pclk");
    pclk=clk_get_rate(clk_p); //从系统平台时钟队列中获取pclk的时钟频率,在include/linux/clk.h中定义
    tcnt=(pclk/50/16);   //计算定时器0的输出时钟频率(pclk/(prescaler0+1))/divider value
    if(tcnt&(~0xffff))
      {
         printk("tcnt setting error\n");
        // return;
      }
    printk("tcnt=%ld\n",tcnt);
   
    __raw_writel(tcnt, S3C2410_TCNTB(0));//设置定时器0的计数缓存寄存器的值
    __raw_writel(tcnt/10,S3C2410_TCMPB(0));//设置定时器0比较缓存寄存器的值

    tcon &= __raw_readl(S3C2410_TCON); //读取定时器控制寄存器的值
     tcon &=(~0x1f);
    tcon |=0x1b;
    __raw_writel(tcon, S3C2410_TCON);
      tcon &=~2; //clear manual updata bit
    tcon |=S3C2410_TCON_T0RELOAD; //设置定时器0为自动重装0x04
   //    tcon |=S3C2410_TCON_T0MANUALUPD; // 0x02设置定时器0 Updata TCNTB0&TCMPB0
   // tcon |=S3C2410_TCON_T0START;    //启动时器开始计数0x01
    __raw_writel(tcon, S3C2410_TCON);

    return 0;
}
int isp;
static irqreturn_t  timer0_irq(void)
{ isp++;
  printk("into the ISR=%d\n",isp);
return IRQ_RETVAL (IRQ_HANDLED);
}      

static int analog_freq_input_open(struct inode *inode, struct file *file)
{
  int err;
  if(!down_trylock(&lock))
      {                    
          init_timer0();
          printk("init timer0 finish\n");
          err=request_irq(IRQ_TIMER0, (void*)&timer0_irq,IRQF_DISABLED,"S3C2410_timer0", NULL);
          if(err==0)
          printk("timeri init irq finish\n");
          return 0;
       }
   else
        return -EBUSY;
}

相关帖子

沙发
LiangXinJi|  楼主 | 2010-6-14 10:06 | 只看该作者
大虾们,在那a ??

使用特权

评论回复
板凳
LiangXinJi|  楼主 | 2010-6-14 11:47 | 只看该作者
问题已解决!!!

使用特权

评论回复
地板
lelee007| | 2010-6-14 14:34 | 只看该作者
怎么解决的?贴出来分享一下哦

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

127

帖子

1

粉丝