注:下文都以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的值需要手動加載。