天天看點

s3c2440實驗---定時器

  定時器實驗

 時鐘是同步工作系統的同步節拍。

 一、時鐘的獲得有很多種方式

  1、外部直接輸入時鐘信号

  2、外部晶振+内部時鐘發生器(低頻單片機)

  3、外部晶振+内部時鐘發生器+PLL+内部分頻器

  二、定時器内部結構

  1、總時鐘系統

  

s3c2440實驗---定時器

    詳細說明:在2440剛剛開機的時候,由于PLL尚未開啟,FCLK即等于外部輸入時鐘(12MHz),如果想提供時鐘頻率,則要開啟PLL。PLL分為

MPLL和UPLL。其中UPLL是控制USB的,這與本實驗無關。MPLL分為三種時鐘FCLK(CPU核時鐘)、HCLK(AHB總線裝置時鐘)、PCLK(APK總線裝置時鐘)。

    

s3c2440實驗---定時器

  2、實驗内容:用定時器0實作led燈按固定時間閃爍

    

s3c2440實驗---定時器

  如上圖所示:定時器0獲得時鐘頻率的路線是:PCLK->預分頻器->分頻器->MUX電路->控制邏輯單元->定時器0

三、實驗前分析

  通過上述路線,可知接下來我們要進行如下步驟:

  1、獲得PCLK時鐘(由于PCLK是MPLL分出來的,是以我們要先設定MPLL的值,然後通過分頻(寄存器CLKDIV)來進行對PCLK的設定)

  

s3c2440實驗---定時器

  

s3c2440實驗---定時器

  2、設定預分頻器(TCFG0)

  3、設定分頻器(TCFG1)

  4、設定MUX電路(預設)

  5、設定控制單元 (TCNTB0)

  在第一次使用定時器時,需要将“手動更新”位置1,使得TCNTB0寄存器的數值裝入TCNT0中。之後就可以通過自動重裝載将數字自動裝入寄存器中。

四、核心代碼分析

  1、初始化時鐘  

    void init_timer(void)

    {

      //第一步:配置FCLK:HCLK:PCLK

      CLKDIVN = 0x03;

      /* 如果HDIVN非0,CPU的總線模式應該從“fast bus mode”變為“asynchronous bus mode” */

      __asm__(

      "mrc p15, 0, r1, c1, c0, 0\n" /* 讀出控制寄存器 */

      "orr r1, r1, #0xc0000000\n" /* 設定為“asynchronous bus mode” */

      "mcr p15, 0, r1, c1, c0, 0\n" /* 寫入控制寄存器 */

      );

      //第二步:配置MPLL

      MPLLCON = FCLK; //200MHz

      //第三步:設定定時器0 此時PCLK為50MHz

      TCFG0 = 99; //預分頻器

      TCFG1 = 0x03; //分頻器

      TCNTB0 = 31250; //定時時間

      TCON |= (1<<1);

      TCON = 0x09;

      //定時器0使能

      INTMSK &= (~(1<<10));

    }

  

  2、當定時器時間結束後發生中斷

  

    void irq_timer(void)

    {

  

      if(INTOFFSET == 10)

      {

        GPFDAT &= (~(1<<4));

      }

     SRCPND = (1<<INTOFFSET);

     INTPND = INTPND;

      }

五、總結

  在定時器中,定時器0的時鐘配置是重點。從PLL到定時器0,中間需要配置的内容不少。特别是在第一次設定重裝載值得時候要手動更新。通過寫部落格,加深了我對s3c2440定時器的認識。我要堅持繼續寫下去。☀   

    

s3c2440實驗---定時器