從S5PV210學習最基礎的定時器處理(PWM篇)

注:下文都以S5PV210爲背景。

 一.定時器概述

(1)定時器的作用

定時器可以讓SoC在執行主程序的同時,可以(通過定時器)具有計時功能,

到了一定時間(計時結束)後,定時器會產生中斷提醒CPU,CPU會去處理中斷並

執行定時器中斷的ISR。從而去執行預先設定好的事件。

(2)定時器的最重要組成

由於:定時時長 = 計數值×計數時間週期

  所以定時器最重要的就是:

分頻器 ——> 計數時間週期

TCNT ——> 計數值


二.S5PV210中的定時器

PWM定時器,特點能用於生成PWM波。

系統定時器,特點生成的定時(TCNT*時鐘週期)是用來作爲系統固定的時間間隔的,稱systick。

看門狗定時器,特點能產生復位信號。

實時時鐘RTC(real time clock),特點關注的是時間點(xx年x月x日x時x分x秒星期x)。


三.PWM定時器

 1.210中PWM定時器的特點

(1)有5個PWM定時器,其中0,1,2,3有GPIO,可以用於生成PWM波,timer4只能用來產生

內部中斷信號。

(2)clock是通過PCLK_PSYS經過兩次分頻產生。



2.重要寄存器

TCNT&TCMP、TCNTB&TCMPB、TCNTO

TCNT&TCMP是用來計數和生成佔空比的,但不可讀寫。

程序員只能通過寫其buffer寄存器,也就是TCNTB&TCMPB來寫值,

通過TCNTO來讀TCNT的值。


3. 自動重載和雙緩衝(auto-reload and double buffering)

定時器的工作是單次的,當TCNT的值減到0,就會發出中斷,並且定時結束,從前如果需要連續多

次定時,isr就需要重新設置TCNT,210中對此進行了改進,如果開啓自動重加載,那麼TCNT到0後

生成中斷,並且TCNTB被自動加載進TCNT,開始下一次定時。


4.PWM波

佔空比是通過TCNT和TCMP可到的,而PWM的週期也就是定時器的定時時間(TCNT*時間週期)。




5.電平翻轉

由於PWM定時器可以規定:當TCNT>TCMPB時爲高電平,當TCNT<TCMPB時爲低電平。也可以

規定:當TCNT>TCMPB時爲低電平,當TCNT<TCMPB時爲高電平,所以如果當duty從30%變到70%時,我們TCMPB寄存器中的值就要改,但是電平翻轉器開啓後,輸出電平一反轉30%的duty就變成70%了


6.實踐代碼

// 初始化PWM timer2,使其輸出PWM波形:頻率是2KHz、duty爲50%
void timer2_pwm_init(void)
{
    // 設置GPD0_2引腳,將其配置爲XpwmTOUT_2
    rGPD0CON &= ~(0xf<<8);
    rGPD0CON |= (2<<8);
    
    // 設置PWM定時器的一干寄存器,使其工作
    rTCFG0 &= ~(0xff<<8);
    rTCFG0 |= (65<<8);      // prescaler1 = 65, 預分頻後頻率爲1MHz
    
    rTCFG1 &= ~(0x0f<<8);
    rTCFG1 |= (1<<8);       // MUX2設置爲1/2,分頻後時鐘週期爲500KHz
    // 時鐘設置好,我們的時鐘頻率是500KHz,對應的時鐘週期是2us。也就是說每隔2us
    // 計一次數。如果要定的時間是x,則TCNTB中應該寫入x/2us
    
    rCON |= (1<<15);       // 使能auto-reload,反覆定時才能發出PWM波形
    //rTCNTB2 = 250;       // 0.5ms/2us = 500us/2us = 250
    //rTCMPB2 = 125;       // duty = 50%
    
    rTCNTB2 = 50;			
    rTCMPB2 = 25;	
    
    // 第一次需要手工將TCNTB中的值刷新到TCNT中去,以後就可以auto-reload了
    rCON |= (1<<13);       // 打開手動刷新功能
    rCON &= ~(1<<13);       // 關閉手動刷新功能
    
    rCON |= (1<<12);       // 開timer2定時器。要先把其他都設置好才能開定時器
}
總結:

對於PWM的基本編程,主要爲三點:

(1)設置GPIO爲TOUT.

(2)設置定時時長(TCNT*時鐘週期),佔空比(TCNT和TCMP)。

(3)一些功能的選擇(如自動加載等),並啓動時鐘.

需要注意的是:

第一次加載buffer的值需要手動加載。

發佈了45 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章