天嵌 ARM开发社区

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

求教TQ6410板子PWM问题

[复制链接]
星云 发表于 2013-6-28 16:14:53 | 显示全部楼层 |阅读模式
各位老师,求教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[4:7]
        tcfg1 &= ~S3C2410_TCFG1_MUX1_MASK;
        //设置分割值为2
        tcfg1 |= S3C2410_TCFG1_MUX1_DIV4;//set [4:7]== 1/2

        //清零预分频位TCFG0[0:7]
        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[8:10]
        tcon &= ~(7<<8); //set bit [8:10] to zero
        //设置定时器工作模式为自动加载模式(auto-reload)
        tcon |= S3C2410_TCON_T1RELOAD|S3C2410_TCON_T1INVERT;
        __raw_writel(tcon, S3C2410_TCON);
//下面是设置计数初值和脉宽初值
tcon = __raw_readl(S3C2410_TCON);
        //准备更新TCMPB1数值,先置1 TCON[9]
        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板子的蜂鸣器驱动程序。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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

GMT+8, 2024-11-1 06:48 , Processed in 1.031250 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

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