1. 程式人生 > >JZ2440系統時鐘和定時器

JZ2440系統時鐘和定時器

系統時鐘

首先看下各個模組與時鐘匯流排的關係:


晶片剛開始上電時, 執行的時鐘就等於晶振的時鐘Fin, 通過設定MPLL和UPLL可以提升執行頻率.

MPLL計算方法:

例: Fout = (2 * (MDIV + 8) * Fin) / ((PDIV + 2) * (2^SDIV))
Fout = 200MHz = (2 * (92 + 8) * 12) / (1 + 2) * (2^2)
MDIV = 92
PDIV = 1
SDIV = 2 
#define S3C2440_MPLL_200MHZ ((0x5c << 12) | (0x01 << 4) | (0x02))
也可以使用官方推薦的值: 


CLKDIVN = 0x03; // FCLK:HCLK:PCLK=4:2:1, HDIVN=1,PDIVN=1

補充: LockTime是指配置了MPLL/UPLL之後時鐘需要一段時間來穩定下來, 這段時間就是locktime
PWM定時器

S3C2440A 有 5 個 16 位定時器。其中定時器 0、1、2 和 3 具有脈寬調製(PWM)功能。定時器 4 是一個無輸出引腳的內部定時器。定時器 0 還包含用於大電流驅動的死區發生器。

以PWM定時器的暫存器說明:

工作原理:

(1)TCMPBn 和 TCNTBn 分別裝入定時器 n 的比較值和初始值

(2)設定 TCON 來啟動定時器 n. 這時 TCMPBn / TCNTBn 分別自動裝入 TCMPn / TCNTn 中, 然後 TCNTn開始遞減

(3)當 TCMPn == TCNTn , TIMn輸出引腳的電平翻轉

(4)當 TCNTn == 0, TIMn 輸出引腳再次翻轉, 並且申請中斷

(5)當 TCNTn == 0, 且 TCON 配置了定時器為自動重灌, 則TCMPBn / TCNTBn 自動裝入 TCMPn / TCNTn中, 開始新一輪的遞減. 


TCFG0: TIMn 的 預分頻值

TCFG1: TIMn 的 分頻值

例: timer0_clock = 100MHz / (99+1) / 16 = 62500Hz

void timer0_init(void)
{
    TCFG0  = 99;        // 預分頻器0 = 99        
    TCFG1  = 0x03;      // 選擇16分頻
    TCNTB0 = 31250;     // 0.5秒鐘觸發一次中斷
    TCON   |= (1<<1);   // 手動更新
    TCON   = 0x09;      // 自動載入,清“手動更新”位,啟動定時器0
}
1
2
3
4
5
6
7
8
看門狗定時器


(1) 首先是兩級分頻, 和TIM一樣, 看門狗模組分為兩個模式, 1. 普通定時器 2. 看門狗. 如果當做普通定時器時則應使能中斷且禁止看門狗定時器

(2) 在 WTDAT 中裝入初值, 因為一旦使能WTD之後, WTDAT的值不能自動載入到WTCNT中, 所以必須一開始就為 WTCNT 裝載初值, 開始遞減。減到0的時候,需要手動重新賦值。

(3)如果WTD作為普通定時器, WTCNT==0時, 產生中斷. 如果作為WTD, WTCNT==0時則產生復位訊號
--------------------- 
作者:種瓜大爺 
來源:CSDN 
原文:https://blog.csdn.net/czg13548930186/article/details/75425759 
版權宣告:本文為博主原創文章,轉載請附上博文連結!