TI中文支持网
TI专业的中文技术问题搜集分享网站

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_structomap_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了呢?

Shine:

请问SDK是什么版本?

,

GuangKai Meng:

您好,所使用的SDK版本是:ti-processor-sdk-linux-rt-am57xx-evm-05.02.00.10-Linux-x86-Install.bin

疑问点就在于,为什么设置了定时器初值为  0xffffffff – priv->timer_rate ,该数值为system clock: 20M(printk打印出验证过),

为什么设定初值后,默认定时周期为2s??

,

Shine:

请设置其他值试试。在TRM文档里TLDR寄存器初始值不能设置0xFFFF FFFF。CAUTIONDo not put the overflow value (0xFFFF FFFF) in the TLDR register because it can lead to undesirable results.https://www.ti.com/lit/ug/spruih8b/spruih8b.pdf

,

GuangKai Meng:

(昨天好像论坛崩掉了…)

您好,我并不是将初始值设置为0xFFFF FFFF!而是设置为了 (0xFFFF FFFF – 20000000)! ,即初值为 0xFECED2FF (从该数值计时到 0xFFFFFFFF 就会溢出定时到的溢出中断)其中20 000 000 (十进制)是系统时钟通过clk_get_rate()函数转换过来的系统时钟。希望您能解答我的疑问,即为什么设置系统时钟后,从数值 (0xFFFF FFFF – 20000000) = 0xFECED2FF 计时到 0xFFFFFFFF 的周期为2s??

我认为该问题和TRM手册 5609 页,

为什么当采用非PWM模式, 32KHz的时候,明明 1/32KHz = 31.25 us ,但是为什么这个interrupt period 是62.5 us,为什么翻倍了呢?

不理解前面所讲的,希望您能给出解答。

,

Shine:

我把您的问题转到e2e上了,请等待产品线工程师的回复。https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1040159/am5748-dtimer-period-issue

,

GuangKai Meng:

Thx.

,

GuangKai Meng:

已解决,之前计算存在错误。感谢shine的回复~~谢谢拉

,

Shine:

感谢分享解决办法!

赞(0)
未经允许不得转载:TI中文支持网 » AM5748: 硬件定时器使用问题。
分享到: 更多 (0)