星云 发表于 2013-6-28 16:14:53

求教TQ6410板子PWM问题

各位老师,求教TQ6410板子PWM问题:
想用板子上的S3C64XX_GPF15_PWM_TOUT1做频率发生源。遇到问题,各方面设置感觉都没错误,就是没有波形输出,运行后观察tcnto1的值一直为0,不会变。printk("tcnto1 =%x\n",__raw_readl(S3C2410_TCNTO(1)));
代码如下:   /* 读取TCON,TCFG0以及TCFG1寄存器的数值*/
      tcon = __raw_readl(S3C2410_TCON);
      tcfg1 =__raw_readl(S3C2410_TCFG1);
      tcfg0 =__raw_readl(S3C2410_TCFG0);

        /*定时器输入频率 = PCLK / ( {预分频数值 + 1} ) / {分割数值}
        *{预分频数值} = 1~255,由TCFG0配置寄存器来配置
        *{分割数值} = 1, 2, 4, 8, 16, TCLK,由TCFG1配置寄存器来配置
        */
      printk("old value tcon=%lx,tcfg1=%lx,tcfg0=%lx\n",tcon,tcfg1,tcfg0);
        //配置GPF15为输出
        s3c_gpio_cfgpin(S3C64XX_GPF(15),S3C64XX_GPF15_PWM_TOUT1);
        //清零TCFG1
      tcfg1 &= ~S3C2410_TCFG1_MUX1_MASK;
        //设置分割值为2
      tcfg1 |= S3C2410_TCFG1_MUX1_DIV4;//set == 1/2

        //清零预分频位TCFG0
      tcfg0 &= ~S3C2410_TCFG_PRESCALER0_MASK;
        //设置预分频数值,这里是254
      tcfg0 |= (PRESCALER1) << S3C6410_TCFG_PRESCALER0_SHIFT;//66625000/255/2=130637hz

        //将配置好的TCON,TCFG0,TCFG1的数值写回寄存器
        __raw_writel(tcfg1, S3C2410_TCFG1);
        __raw_writel(tcfg0, S3C2410_TCFG0);
       printk("ini tcfg0 =%x,write=0xFE;tcfg1=%x,write=0x10\n",__raw_readl(S3C2410_TCFG0),__raw_readl(S3C2410_TCFG1));
        //清零TCON
      tcon &= ~(7<<8); //set bit to zero
        //设置定时器工作模式为自动加载模式(auto-reload)
      tcon |= S3C2410_TCON_T1RELOAD|S3C2410_TCON_T1INVERT;
        __raw_writel(tcon, S3C2410_TCON);
//下面是设置计数初值和脉宽初值
tcon = __raw_readl(S3C2410_TCON);
        //准备更新TCMPB1数值,先置1 TCON
        tcon |= S3C2410_TCON_T1MANUALUPD;
        __raw_writel(tcon, S3C2410_TCON);
   
        printk("set tcon =%x,write=0xE00, tcfg0=%x,tcfg1=%x\n",__raw_readl(S3C2410_TCON),__raw_readl(S3C2410_TCFG0),__raw_readl(S3C2410_TCFG1));
        //TCNTB1==200,改数值决定了PWM的频率
        //tcnt = 1000;
        tcmp=Val;
       __raw_writel(tcmp, S3C2410_TCNTB(1));
        //改变TCMPB1的数值,改数值决定PWM的频宽
        tcmp = Val/2;
        __raw_writel(tcmp, S3C2410_TCMPB(1));
//下面启动定时器
tcon = __raw_readl(S3C2410_TCON);//读取时钟控制寄存器
        tcon &= ~S3C2410_TCON_T1MANUALUPD;//之前已经设置好了TCNTB1 以及 TCMPB1,这里无须任何操作
        tcon |= S3C2410_TCON_T1START;//开始位置1,让定时器开始工作
       
        //设置定时器工作模式为自动加载模式(auto-reload)
//      tcon |= S3C2410_TCON_T1RELOAD;
        __raw_writel(tcon, S3C2410_TCON);//将设置写回寄存器
        s3c_gpio_cfgpin(S3C64XX_GPF(15),S3C64XX_GPF15_PWM_TOUT1);


请版主和各位老师帮忙啊,已经几天了,也不知道原因何在?代码也参考了tq6410板子的蜂鸣器驱动程序。


页: [1]
查看完整版本: 求教TQ6410板子PWM问题