TI E2E™ 英文论坛海量技术问答的中文版全新上线,可点击相关论坛查看,或在站内搜索 “参考译文” 获取。

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.

AM5748: 硬件定时器使用问题。

Part Number: AM5748

采用AM5748, 搭载RT-Linux操作系统。参考以下链接:

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/415079/dm-timer-beaglebone-black-questions

主要代码如下,采用系统时钟20MHz,可以达到2s定时。

 

    //得到定时器
    priv->timer_ptr = omap_dm_timer_request_by_node(priv->dm_node);

    /* Set the Clock source to the SystemClock */// 设置为系统时钟
    omap_dm_timer_set_source(priv->timer_ptr, OMAP_TIMER_SRC_SYS_CLK);
    
    /* Set prescaler to 1:1 */
    omap_dm_timer_set_prescaler(priv->timer_ptr, 0); //设置分频器一比一
    
    /* Determine what IRQ the timer triggers *///得到中断号
    priv->timer_irq = omap_dm_timer_get_irq(priv->timer_ptr);
    
    
    /* Setup the IRQ handler *///设置中断处理函数
    ret = request_irq(priv->timer_irq, zhx_timer_irq_handler, IRQF_TIMER, DRIVER_NAME, priv);

其中,system clock为:

 

然后,

    /*  Get the Clock rate in Hz */
   timer_clk = omap_dm_timer_get_fclk(priv->timer_ptr);
    priv->timer_rate = clk_get_rate(timer_clk);
    //此时打印出来该数值,priv->timer_rate为20Mhz。
    
    priv->owner = task_pid_nr(current); //得到pid号
    priv->current_task = pid_task(find_vpid(priv->owner), PIDTYPE_PID); //pid_task( )---根据pid获取task_struct

    omap_dm_timer_enable(priv->timer_ptr);
    omap_dm_timer_set_int_enable(priv->timer_ptr, OMAP_TIMER_INT_OVERFLOW); //使能溢出中断

在定时器开始工作时候,我通过ioctl传入arg参数赋值到priv->timer_ratio

priv->timer_ratio = arg;

然后设置定时器初值:

定时器从该初值开始计数,当计数到 0xffffffff 时候中断溢出,然后重新回到该初值计数。

omap_dm_timer_set_load_start(priv->timer_ptr, 1, 0xffffffff - (priv->timer_ratio * priv->timer_rate));

omap_dm_timer_set_load_start(priv->timer_ptr, 1, 0xffffffff - (priv->timer_ratio * priv->timer_rate));

 

我的疑问在于:

通过clk_get_rate()函数获取的priv->timer_rate数值为20M(printk打印结果),即采用的系统时钟为20MHz,但是为什么当priv->timer_ratio为1的时候,即设置定时器初值为0xffffffff - priv->timer_rate的时候,定时周期为2s,在我理解,应该是1秒钟。是否为定时器计数的时候,上升沿和下降沿都计数了,因此翻倍变成2s了呢?