This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于AM335x处理器的Timer4~Timer7的专用管脚输出问题?

Other Parts Discussed in Thread: AM3352

Hi, Ti的技术支持:

AM335x处理器,有专用的定时器输出管脚,分别Timer4~Timer7,总共只有4个,请问这些管脚是不是只有在PWM工作模式下,可以直接输出,

如果我工作于其它模式,比如one-shot模式,是否可以从相应的管脚输出单脉冲?

谢谢!

  • 可以配置成GPIO模式啊,有什么特殊要求么?

  • 要求是自动从相应管脚上输出,而不是通过软件去干预,意思就是定时器产生的波形要自动从相应的管脚上输出,如果配置成GPIO模式,是不会输出相应的波形信号的。

    目前我只有配置成PWM模式时才自动输出,其它模式输出不了,不知道是不是还有哪里设置不对,还是本来就是这样子的?

  • 从datasheet上来看,timer4-time7是有对应管脚可以配置的,应该是可以有定时器PWM输出的,你可以看下TRM20.1这部分怎么配置

  • Jian Zhou,你好

    你可能还没有理解我的意思。

    Timer有多种工作模式,其中目前我已经证实的是只有在PWM模式下,才能从相应的管脚输出波形,如果设置成其它工作模式却无法输出波形。

    我想知道的是:这是芯片本设计就是这样子的,还是我的使用有问题,以住在用单片机时不存在这种问题。

  • TRM上写,timer可以工作在三种模式:

    • Timer mode
    • Capture mode
    • Compare mode

    这三种模式的timer mode和compare mode是可以通过寄存器配置输出各种波形的:

    A dedicated output pin (PORTIMERPWM) is
    programmed through TCLR (TRG and PT bits) to generate one positive pulse (prescaler duration) or to
    invert the current value (toggle mode) when an overflow occurs

  • Jian Zhou,你好

    按照你的意思,我又重新做了各种测试,发现,还是不能到到我的要求。

    在timer模式下,我无法实现波形输出,在compare模式下,可以有波形输出。

    下面这段程序初始化后可以产生单次定时器中断,只要不断的使能定时器,就可以连续产生,我在中断程序中有监控,功能是正常的,就是相对应的定时器Timer7管脚上没有波形输入,如果改成比较模式就是可以的,很奇怪。

    static int heat_timer_init(void)
    {
          int ret = 0;

          prn->heat_timer_ptr = omap_dm_timer_request_specific(7);
          if(prn->heat_timer_ptr == NULL){
                printk("heat_timer_init: No more gp timers available\n");
                return -1;
          }
          omap_dm_timer_set_prescaler(prn->heat_timer_ptr, 0);
          omap_dm_timer_set_pwm(prn->heat_timer_ptr, 0, 1, 2);

          prn->heat_timer_irq = omap_dm_timer_get_irq(prn->heat_timer_ptr);
          ret = request_irq(prn->heat_timer_irq, heat_irq_handler, IRQF_DISABLED | IRQF_TIMER , "heat_timer_init", heat_irq_handler);
          if(ret){
                printk("heat_timer_init: request_irq failed (on irq %d)\n", prn->heat_timer_irq);
                return ret;
         }
         omap_dm_timer_set_load(prn->heat_timer_ptr, 0, 0xFFFFFFFF - heat_time_tbl[prn->heat_index] + 1);
         omap_dm_timer_write_counter(prn->heat_timer_ptr, 0xFFFFFFFF - heat_time_tbl[prn->heat_index] + 1);

         omap_dm_timer_set_int_enable(prn->heat_timer_ptr, OMAP_TIMER_INT_OVERFLOW);
         // start the timer!
         omap_dm_timer_start(prn->heat_timer_ptr);
         // stop the timer!
         omap_dm_timer_stop(prn->heat_timer_ptr);
         return 0;
    }

  • 按照你的意思,我又重新做了各种测试,发现还是不能达到我的要求。
    在timer模式下,我无法实现波形输出,在compare模式下,可以有波形输出。
    下面这段程序初始化后可以产生单次定时器中断,只要不断的使能定时器,就可以连续产生,我在中断程序中有监控,功能是正常的,就是相对应的定时器Timer7管脚上没有波形输出,如果改成比较模式就是可以的,很奇怪。

    static int heat_timer_init(void)
    {
    int ret = 0;

    prn->heat_timer_ptr = omap_dm_timer_request_specific(7);
    if(prn->heat_timer_ptr == NULL){
    printk("heat_timer_init: No more gp timers available\n");
    return -1;
    }
    omap_dm_timer_set_prescaler(prn->heat_timer_ptr, 0);
    omap_dm_timer_set_pwm(prn->heat_timer_ptr, 0, 1, 2);

    prn->heat_timer_irq = omap_dm_timer_get_irq(prn->heat_timer_ptr);
    ret = request_irq(prn->heat_timer_irq, heat_irq_handler, IRQF_DISABLED | IRQF_TIMER , "heat_timer_init", heat_irq_handler);
    if(ret){
    printk("heat_timer_init: request_irq failed (on irq %d)\n", prn->heat_timer_irq);
    return ret;
    }
    omap_dm_timer_set_load(prn->heat_timer_ptr, 0, 0xFFFFFFFF - heat_time_tbl[prn->heat_index] + 1);
    omap_dm_timer_write_counter(prn->heat_timer_ptr, 0xFFFFFFFF - heat_time_tbl[prn->heat_index] + 1);

    omap_dm_timer_set_int_enable(prn->heat_timer_ptr, OMAP_TIMER_INT_OVERFLOW);
    // start the timer!
    omap_dm_timer_start(prn->heat_timer_ptr);
    // stop the timer!
    omap_dm_timer_stop(prn->heat_timer_ptr);
    return 0;
    }

  • 最后我确认是Timer7有问题,无论它是什么模式,都不会有输出,但定时器是可以工作的,这是为什么?

    联想到网驱动中,将定时器改成Timer7也是不能用的,这是不是说明这个Timer7内部是有bug的,我用的处理器是AM3352。

  • 没有看到芯片的errata有关于这部分问题的描述。你确定timer7的管脚的pinmux的设置是对的么?

  • mux肯定是对的,我用同样的方法,去配置其它timer没有问题,而且将timer7配置成普通的gpio模式,工作也没有问题,所以问题就是怪在这个地方。

  • 请问一下你的这个timer7输出PWM的问题解决了吗?目前我也是要用TIMER7输出pwm,请问一下,这个驱动的大概思路是怎么样的?