Boot中timer定时器的设置(4)

5、timer_load_val是一个全局变量,顾名思义它是装入TCNTB4寄存器的值。看下面的注释:

/*
        * for 10 ms clock period @ PCLK with 4 bit divider = 1/2
        * (default) and prescaler = 16. Should be 10390
        * @33.25MHz and 15625 @ 50 MHz
        */

它的意思是如果要将timer4的时钟周期设置为10ms的话,要通过PCLK、分配器divider默认的值1/2和prescaler = 16来设置如何设置(?)来看一下下面这个函数

/* return PCLK frequency */
ulong get_PCLK(void)

    struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
   
    return (readl(&clk_power->CLKDIVN) & 1) ? get_HCLK() / 2 : get_HCLK();

看看结构s3c24x0_clock_power

/* CLOCK & POWER MANAGEMENT (see S3C2400 manual chapter 6) */
/*                          (see S3C2410 manual chapter 7) */
struct s3c24x0_clock_power {
    u32 LOCKTIME;
    u32 MPLLCON;
    u32 UPLLCON;
    u32 CLKCON;
    u32 CLKSLOW;
    u32 CLKDIVN;
#if defined(CONFIG_S3C2440)
    U32 CAMDIVN;
#endif
}; 

涵盖了所有时钟设置的寄存器,s3c24x0_get_base_clock_power();返回的是(struct s3c24x0_clock_power *)0x4C000000也就是时钟设置寄存器的起始地址

return (readl(&clk_power->CLKDIVN) & 1) ? get_HCLK() / 2 : get_HCLK();

判断一下CLKDIVN是不是被设置成了1,如果是说明PCLK = 1/2HCLK,不在去看get_HCLK了。前面我已经说过PCLK = 101.25MHz,至于timer_load_val = 101.25MHz / (2*16*100);这个公式,分析如下:
 
我们要设置timer4的时钟周期是T = 10ms;
 
又  T = [1 /(PCLK / (预分频器的值(prescaler)*分频器的值(div)))] *timer_load_val
 
已知T、PCLK、perscaler、div,就可以求的
 
timer_load_val = PCLK / (perscaler * div)
 
但是这里为什么会有100呢?(暂时不清楚,望大家给我一个解释)
 timer_clk下面暂时没有遇到,先不考虑。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/eca2c79d2e59d3745d8e4b7814130343.html