新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 系統(tǒng)時(shí)鐘和定時(shí)器——PWM定時(shí)器

系統(tǒng)時(shí)鐘和定時(shí)器——PWM定時(shí)器

作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò) 收藏
時(shí)鐘控制邏輯給整個(gè)芯片提供3種時(shí)鐘:FCLK用于CPU核;HCLK用于AHB總線設(shè)備,比如CPU核、存儲(chǔ)器控制器、中斷控制器、DMA和USB主機(jī)模塊等;PCLK用于APB總線上的設(shè)備,比如WATCHDOG、IIS、IIC、PWM、MMC、ADC、RTC等等。

S3C2440 CPU核的工作電壓為1.2V時(shí),主頻可以達(dá)到300MHz;工作電壓為1.3V時(shí),主頻可以達(dá)到400MHz。開發(fā)板為12MHz,需要通過(guò)時(shí)鐘控制邏輯的PLL提高系統(tǒng)時(shí)鐘。

本文引用地址:http://2s4d.com/article/201611/316624.htm

S3C2440有兩個(gè)PLL:MPLL和UPLL。UPLL專用于USB設(shè)備,MPLL用于設(shè)置FCLK、HCLK、PCLK。

圖1 上電后MPLL的啟動(dòng)過(guò)程
LocK Time的長(zhǎng)短由寄存器LOCKTIME設(shè)定。一般采用默認(rèn)值。
查看芯片手冊(cè),MPLL計(jì)算公式如下圖:

其中 m=MDIV+8, p=PDIV+2, s=SDIV

CLKDIVN寄存器:用于設(shè)置FCLK、HCLK、PCLK 三者比例。各種時(shí)鐘比例對(duì)應(yīng)的寄存器設(shè)置如下圖所示:

1、 PWM(Pulse Width Modulation)定時(shí)器
S3C2440 有5個(gè)16位定時(shí)器。其中定時(shí)器0、1、2、3有PWM功能,即他們都有一個(gè)引腳,可以用過(guò)定時(shí)器來(lái)控制引腳周期性的高低電平變化;定時(shí)器4沒(méi)有輸出引腳。定時(shí)器時(shí)鐘源為PCLK。內(nèi)部結(jié)構(gòu)如圖所示:
定時(shí)器0 、1 共用第一個(gè)預(yù)分頻器,定時(shí)器2 、3、 4 共用第2個(gè)預(yù)分頻器。預(yù)分頻器的輸出進(jìn)入第二級(jí)分頻器,它有5種頻率的時(shí)鐘:2、4、8、16分頻。預(yù)分頻通過(guò)TCFG0設(shè)置,分頻值(2、4、8、16)通過(guò)TCFG1設(shè)置。
現(xiàn)在我們可以歸結(jié)啟動(dòng)一個(gè)PWM功能可以分為以下幾步:
1、設(shè)置TOUT0-TOUT3,這需要配置相關(guān)外部引腳為TOUT模式。外部引腳GPB與TOUT為復(fù)用引腳
2、設(shè)置定時(shí)器的輸出頻率,并且通過(guò)TCFG0設(shè)置prescaler(預(yù)分頻)的值。通過(guò)TCFG1設(shè)置divider的值。
3、具體脈沖寬度要通過(guò)TCMPBn與TCNTBn兩個(gè)寄存器的設(shè)置來(lái)完成。這步涉及到寄存器內(nèi)部邏輯的工作流程。如下:
將TCMPBn和TCNTBn裝入初始值,在設(shè)置TCON寄存器之后會(huì)啟動(dòng)定時(shí)器,這時(shí)將過(guò)TCMPBn與TCNTBn兩個(gè)寄存器的值裝入內(nèi)部寄存器TCMPn和TCNTn中,在定時(shí)器n的工作頻率下,TCNTn開始減一計(jì)數(shù),在TCNTn的值等于TCMPn的值的時(shí)候,TOUTn翻轉(zhuǎn),當(dāng)TCNTn的值達(dá)到0的時(shí)候,再次翻轉(zhuǎn),就這樣周而復(fù)始,形成了脈沖。并且觸發(fā)定時(shí)器n的中斷(如果設(shè)置中斷的話)。
4、具體控制要交給TCON寄存器。它有以下幾個(gè)功能:(先看一下數(shù)據(jù)手冊(cè))
由此可以看出,它有以下4個(gè)作用:
1、定時(shí)器的開始/停止。TCON[0]
2、手動(dòng)更新。用于手動(dòng)更新TCNTBn和TCMPBn,這里要注意的是在開始定時(shí)時(shí),一定要把這位清零,否則是不能開啟定時(shí)器。TCON[1]
3、輸出反轉(zhuǎn)。TOUTn不反轉(zhuǎn)(0)/反轉(zhuǎn)(1)TCON[2]
4、自動(dòng)加載。當(dāng)定時(shí)器計(jì)數(shù)到0時(shí),TCMPBn和TCNTBn寄存器的值自動(dòng)裝入內(nèi)部寄存器TCMPn和TCNTn中。TCON[3]
程序分析如下:(這程序是趙春江老師的程序)

#include "2440addr.h"

#define U32 unsigned int

typedef unsigned char BOOL;

#define TRUE 1

#define FALSE 0

BOOL stop;

static void __irq Key3_ISR(void) /*暫停鍵,關(guān)閉蜂鳴器*/

{

rSRCPND = rSRCPND | (0x1<<2); /*定義EINT2*/

rINTPND = rINTPND | (0x1<<2);

rTCON &= ~0x8; /*禁止定時(shí)器自動(dòng)重載,即關(guān)閉定時(shí)器0111*/

stop = TRUE;

}

void __irq Key2_ISR(void) /*重啟鍵,開啟蜂鳴器*/

{

rSRCPND = rSRCPND | 0x1; /*定義EINT0*/

rINTPND = rINTPND | 0x1;

stop = FALSE;

}

void delay(int a)

{

int k;

for(k=0;k

;

}

void Main(void)

{

int freq;

rGPBCON = 0x155556; /*B0為TOUT0,B5~B8為輸出,給LED 0001 0101 0101 0101 0101 0110*/

rGPBUP = 0x7ff; /*0111 1111 1111關(guān)閉上拉使能*/

rGPFCON = 0xaaaa; /*F口為EINT,給按鈕 1010 1010 1010 1010*/

/*按鈕的一些必要配置*/

rSRCPND = 0x0f; /*中斷設(shè)置*/

rINTMSK = ~0x0f;

rINTPND =0x0f;

rEXTINT0 = 0x2222; /*EINT0/EINT1均設(shè)置為下降沿觸發(fā)*/

freq = 2500;

rTCFG0 &= 0xFFFF00;

rTCFG0 |= 0x31; /*prescal 是49 3*16+1=49 timer0 and timer1*/

rTCFG1 &= ~0xF; /*低四位清零 divider value=1/2,因?yàn)镻CLK為50MHz,所以50MHz/50/2=500kHz/

rTCNTB0 = 5000; /*定時(shí)器計(jì)數(shù)初始值*/

rTCMPB0 = freq; /*定時(shí)器比較值*/

rTCON &= ~0x1F;

rTCON |= 0xf; /*死區(qū)無(wú)效,自動(dòng)裝載,電平反轉(zhuǎn),手動(dòng)更新,定時(shí)器開啟*/

rTCON &= ~0x2 ; /*手動(dòng)更新位清零,PWM開始工作*/

pISR_EINT0 = (U32)Key2_ISR;

pISR_EINT2 = (U32)Key3_ISR;

stop = FALSE;

rGPBDAT = ~0x60; /*兩個(gè)LED亮*/

while(1)

{

/*頻率遞增*/

for ( ; freq<4950 ; )

{

freq+=10;

rTCMPB0 = freq; /*重新賦值*/

delay(20000);

while (stop == TRUE) /*是否暫停*/

{

delay(1000);

if (stop ==FALSE) /*判斷是否重啟*/

{

rTCON &= ~0x1F;

rTCON |= 0xf;

rTCON &= ~0x2 ; /*恢復(fù)PWM功能*/

}

}

/*4個(gè)LED隨著頻率的高低,時(shí)滅時(shí)亮。燈亮的數(shù)目4-3-2-1*/

if(freq == 100)

rGPBDAT = ~0x560; /*0001 1110 0000 取反之后1110 0001 1111*/

if(freq == 1300)

rGPBDAT = ~0x160; /*1110 0000取反之后 0001 1111*/

if(freq == 2500)

rGPBDAT = ~0x60; /*0110 0000取反之后 1001 1111*/

if(freq == 3700)

rGPBDAT = ~0x20; /*0010 0000取反之后 1101 1111*/

if(freq == 4900)

rGPBDAT = ~0x0; /*0000取反之后 1111111111*/

}

/*頻率遞減*/

for( ; freq>50 ; )

{

freq-=10;

rTCMPB0 = freq;

delay(20000);

while (stop == TRUE)

{

delay(1000);

if (stop ==FALSE)

{

rTCON &= ~0x1F;

rTCON |= 0xf;

rTCON &= ~0x2 ;

}

}

if(freq == 100)

rGPBDAT = ~0x560;

if(freq == 1300)

rGPBDAT = ~0x160;

if(freq == 2500)

rGPBDAT = ~0x60;

if(freq == 3700)

rGPBDAT = ~0x20;

if(freq == 4900)

rGPBDAT = ~0x0;

}

}

}

TOUT輸出的波形是:
 
上圖是頻率上升時(shí)的大致波形圖。由此可以看出高電平在每個(gè)周期中維持的時(shí)間越來(lái)越長(zhǎng),低電平時(shí)間越來(lái)越短。頻率下降時(shí)的波形圖正好相反。


評(píng)論


技術(shù)專區(qū)

關(guān)閉