定時器實驗
時鐘是同步工作系統的同步節拍。
一、時鐘的獲得有很多種方式
1、外部直接輸入時鐘信号
2、外部晶振+内部時鐘發生器(低頻單片機)
3、外部晶振+内部時鐘發生器+PLL+内部分頻器
二、定時器内部結構
1、總時鐘系統

詳細說明:在2440剛剛開機的時候,由于PLL尚未開啟,FCLK即等于外部輸入時鐘(12MHz),如果想提供時鐘頻率,則要開啟PLL。PLL分為
MPLL和UPLL。其中UPLL是控制USB的,這與本實驗無關。MPLL分為三種時鐘FCLK(CPU核時鐘)、HCLK(AHB總線裝置時鐘)、PCLK(APK總線裝置時鐘)。
2、實驗内容:用定時器0實作led燈按固定時間閃爍
如上圖所示:定時器0獲得時鐘頻率的路線是:PCLK->預分頻器->分頻器->MUX電路->控制邏輯單元->定時器0
三、實驗前分析
通過上述路線,可知接下來我們要進行如下步驟:
1、獲得PCLK時鐘(由于PCLK是MPLL分出來的,是以我們要先設定MPLL的值,然後通過分頻(寄存器CLKDIV)來進行對PCLK的設定)
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定時器的認識。我要堅持繼續寫下去。☀