新聞中心

6410中的PWM 定時(shí)器

作者: 時(shí)間:2016-11-10 來源:網(wǎng)絡(luò) 收藏
看了OK6410的手冊(cè),感覺暈暈的。需要整理一下思路。
我覺得主要的知道下面這幾個(gè)內(nèi)容吧。
  1. 定時(shí)器的電路結(jié)構(gòu)。
  2. 定時(shí)器的工作原理是什么。定時(shí)器如何來使用。{使用的時(shí)序是什么,在時(shí)間軸上各個(gè)寄存器應(yīng)該如何配置}
  3. 里面涉及的寄存器都有哪些。各個(gè)寄存器的職責(zé)是什么。

1.簡單介紹:
S3C6410X中有5個(gè)定時(shí)器,這些定時(shí)器產(chǎn)生內(nèi)部中斷。其中,Timer0和Timer1具有PWM功能,而Timer2,3,4沒有此功能。
PWM具有兩種操作模式:自動(dòng)裝載模式,一次觸發(fā)模式。為實(shí)現(xiàn)PWM功能,芯片提供了16個(gè)功能寄存器。這些功能寄存器都連接APB總線。
定時(shí)器具有雙緩沖特性,這樣就能在不停止當(dāng)前定時(shí)器操作的情況下,為下次定時(shí)器運(yùn)行裝入新的數(shù)值。盡管為定時(shí)器設(shè)置了新數(shù)值,但當(dāng)前的定時(shí)操作能夠成功完成。定時(shí)器從TCNTBn讀取的值是為下次延時(shí)定時(shí)用的,并不影響當(dāng)前定時(shí)器的運(yùn)行。當(dāng)TCNTn減小到0的時(shí)候,TCNTBn的值會(huì)自動(dòng)復(fù)制到TCNTn中,這就是說的自動(dòng)裝載操作。定時(shí)器的當(dāng)前計(jì)數(shù)值可以從定時(shí)計(jì)數(shù)觀察寄存器中TCNTOn讀取。如果TCNTn為0且從裝載也為0的話則TCNTn不在進(jìn)行下次操作。
2.定時(shí)器的電路結(jié)夠圖: 


  1. 定時(shí)器架構(gòu)流程。
    • à經(jīng)過8位的預(yù)分頻器【8bit prescaler0】--à分頻器divider[1/1 1/2 1/4 1/8 1/16]-à多路選擇器MUX-à邏輯控制器【比較TCMPBn和TCNTBn的數(shù)值】--à(deadzone generator )--à時(shí)鐘
計(jì)算公式:
4. 定時(shí)器的工作原理是什么?!?br />

每個(gè)定時(shí)器有32位的遞減計(jì)數(shù)器。遞減計(jì)數(shù)器的初始值由TCNTBn來加載。當(dāng)計(jì)數(shù)器的值變?yōu)?時(shí),定時(shí)器產(chǎn)生中斷信號(hào)通知cpu定時(shí)器操作完成。當(dāng)計(jì)數(shù)器的值變?yōu)?時(shí),TCNTBn的值自動(dòng)加載到遞減計(jì)數(shù)器并開始下個(gè)周期的操作。如果定時(shí)器停止工作(比如,在定時(shí)器工作模式期間清空寄存器TCONn的定時(shí)器使能位,這樣對(duì)應(yīng)的定時(shí)器就會(huì)停止工作),這時(shí)TCNTBn的值就不會(huì)加載到定時(shí)器。


而對(duì)于PWM功能,要用到寄存器TCMPBn,當(dāng)遞減計(jì)數(shù)器down-counter的值和比較寄存器TCMPBn的值相同時(shí),定時(shí)控制邏輯模塊就會(huì)改變輸出電平。因此比較寄存器TCMPBn決定了PWM的輸出。
而且TCNTBn和TCMPBn寄存器具有雙緩沖特性,這樣就能在不停止當(dāng)前定時(shí)器操作的情況下,為下次定時(shí)器運(yùn)行裝入新的數(shù)值。盡管為定時(shí)器設(shè)置了新數(shù)值,但當(dāng)前的定時(shí)操作能夠成功完成。
5.定時(shí)器的工作時(shí)序




我說怎么在上面的第一步中突然冒出個(gè)TCNTn和TCMPn,我以為是數(shù)據(jù)手冊(cè)錯(cuò)了,因?yàn)樵赑WM提供的16個(gè)寄存器中沒有這兩個(gè)寄存器。那么請(qǐng)看下面: 


從上面內(nèi)容看出。TCNTn和TCMPn是內(nèi)部的寄存器(internal registers).而TCNTn寄存器的值可以通過讀取寄存器TCNTOn來獲得。
6.16個(gè)特殊功能寄存器


7.接下來看一下飛凌提供的精確控制LED的程序?!纠枚〞r(shí)器來精確控制LED跑馬燈,每隔1s輪詢點(diǎn)亮】

#define rGPMCON (*(volatile unsigned*)(0x7F008820))
#define rGPMDAT (*(volatile unsigned*)(0x7F008824))
#define rGPMPUD (*(volatile unsigned*)(0x7F008828))


#define PCLK 66000000 //forS3C6410 66MHZ
#define HCLK 133000000 //forS3C6410 133MHZ


#define rTCFG0 (*(volatile unsigned*)(0x7F006000))
#define rTCFG1 (*(volatile unsigned*)(0x7F006004))


#define rTCON (*(volatile unsigned*)(0x7F006008))
#define rTCNTB0 (*(volatile unsigned*)(0x7F00600C))
#define rTCMPB0 (*(volatile unsigned*)(0x7F006010))


#define rTCNTO0 (*(volatile unsigned*)(0x7F006014))
#define rTCNTB1 (*(volatile unsigned*)(0x7F006018))
#define rTCMPB1 (*(volatile unsigned*)(0x7F00601c))


#define rTCNTO1 (*(volatile unsigned*)(0x7F006020))
#define rTCNTB2 (*(volatile unsigned*)(0x7F006024))
#define rTCNTO2 (*(volatile unsigned*)(0x7F00602c))


#define rTCNTB3 (*(volatile unsigned*)(0x7F006030))
#define rTCNTO3 (*(volatile unsigned*)(0x7F006038))
#define rTCNTB4 (*(volatile unsigned*)(0x7F00603c))


#define rTCNTO4 (*(volatile unsigned*)(0x7F006040))
#define rTINT_CSTAT (*(volatile unsigned*)(0x7F006044))


void uDelay(int usec)
{
unsigned int val=(PCLK)/1000000-1; //val = 65

//configure prescaler and divider
rTCFG0&=~(0xff<<8); //0000_0000_1111_1111 TCFG0[15:8-7:0]
rTCFG0|=0<<8; //0000_0000_0000_0000 | 0000_0000_1111_1111 prescalar0 = 255 timer0,timer1 的prescalar value= 255 timer2,3,4的prescalar1 value = 0

rTCFG1&=~(0xf<<8); // 0000_1111_1111 TCFG1 [7:0] = 1111_1111 TCFG1[11:8] = 0000(select mux for timer2 . divider value = 1 );
rTCFG1|=0<<8;

//compute :
//timer input clock frequency = PCLK /({prescaler value + 1})/{divider value}
// timer2 input clock frequency = 66M /(1)/(1)= 66M hz

//configure timer counter buffer and enable timer2
rTCNTB2=val;

rTCON&=~(0xf<<12); // 0000_1111_1111_1111
rTCON|=0xb<<12; // 1011_0000_0000_0000 |0000_1111_1111_1111 = 1011_1111_1111_1111
rTCON&=~(2<<12); // 1101_1111_1111_1111 &1011_1111_1111_1111 = 1001_1111_1111_1111
【// TCON(Timer control register)

//1001:表示:auto-reload,start timer2】
//TCON[15]=1 auto-reload
//TCON[14] Reserved bits
//TCON[13]=0 no operatin , =1,update TCNTB2 TCMPB2
//TCON[12]=0 stop , =1 ,start timer2


//rTCON&= 0x9fff; //這樣不就可以了嗎 ,為什么要花三條語句來寫。
while(usec--){
while(rTCNTO2 >= val>>1);
while(rTCNTO2 < val>>1);
};


}


void msDelay(int time)


{
volatile unsigned int i,j;
for(i=0;i<2000000;i++)
for(j=0;j}


void GPIO_Init(void)


{
rGPMCON =0x11111;
rGPMPUD =0x00;


rGPMDAT =0X1F;
}


void LedTest(void)
{
volatile unsigned int i ,j;


while(1)
{
for(i=0;i<4;i++)


{
rGPMDAT =~(1< for(j=0;j<1000;j++)


uDelay(1000);
}
}


}
void Main(void)
{
GPIO_Init();
LedTest();
}




備注: 這里只是使用了定時(shí)器來精確定時(shí),并沒用用定時(shí)中斷服務(wù)。


關(guān)鍵詞: 6410PWM定時(shí)

評(píng)論


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

關(guān)閉