久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5048|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

s3c2410 Timer工作原理

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:26661 發(fā)表于 2010-11-3 10:49 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

【轉(zhuǎn)自互聯(lián)網(wǎng),如需引用請(qǐng)聯(lián)系原作者】

s3c2410提供了5個(gè)16位的Timer(Timer0~Timer4),其中Timer0~Timer3支持Pulse Width Modulation—— PWM(脈寬調(diào)制 )。Timer4是一個(gè)內(nèi)部定時(shí)器(internal timer),他沒(méi)有輸出引腳(output pins)。
    下面是Timer的工作原理圖。
 
    如上圖所示,PCLK是Timer的信號(hào)源,我們通過(guò)設(shè)置每個(gè)Timer相應(yīng)的Prescaler和Clock Divider把PCLK轉(zhuǎn)換成輸入時(shí)鐘信號(hào)傳送給各個(gè)Timer的邏輯控制單元(Control Logic),事實(shí)上每個(gè)Timer都有一個(gè)稱為輸入時(shí)鐘頻率(Timer input clock Frequency)的參數(shù),這個(gè)頻率就是通過(guò)PCLK,Prescaler和Clock Divider確定下來(lái)的,每個(gè)Timer 的邏輯控制單元就是以這個(gè)頻率在工作。下面給出輸入時(shí)鐘頻率的公式:

Timer input clock Frequency = PCLK / {prescaler value+1} / {clock divider }
{prescaler value} = 0~255
{ clock divider } = 2, 4, 8, 16

    然而并不是每一個(gè)Timer都有對(duì)應(yīng)的Prescaler和Clock Divider,從上面的原理圖我們可以看到Timer0,Timer1共用一對(duì)Prescaler和Clock Divider,Timer2,Timer3,Timer4共用另一對(duì)Prescaler和Clock Divider,s3c2410的整個(gè)時(shí)鐘系統(tǒng)模塊只存在兩對(duì)Prescaler和Clock Divider。
    我曾經(jīng)在討論watchdog的文章中提到,watchdog也是一種定時(shí)器,他的工作就是在一個(gè)單位時(shí)間內(nèi)對(duì)一個(gè)給定的數(shù)值進(jìn)行遞減和比較的操作,而我們這篇文章討論的定時(shí)器他的工作內(nèi)容和watchdog在本質(zhì)上是一樣的。定時(shí)器在一個(gè)工作周期(Timer input clock cycle)內(nèi)的具體工作內(nèi)容主要有3個(gè)。分別是:

  1. 對(duì)一個(gè)數(shù)值進(jìn)行遞減操作
  2. 把遞減后的數(shù)值和另一個(gè)數(shù)值進(jìn)行比較操作
  3. 產(chǎn)生中斷或執(zhí)行DMA操作

     在啟用Timer之前我們會(huì)對(duì)Timer進(jìn)行一系列初始化操作,這些操作包括上面提到的設(shè)置Prescaler和Clock Divider,其中還有一個(gè)非常重要的就是要給Timer兩個(gè)數(shù)值,我們分別稱之為Counter(變量,用于遞減)和Comparer(定值,用于比較),Counter會(huì)被Timer 加載到COUNT BUFFER REGISTER(TCNTB),而Comparer會(huì)被Timer 加載到和COMPARE BUFFER REGISTER(TCMPB),每個(gè)Timer都有這樣兩個(gè)寄存器。當(dāng)我們?cè)O(shè)置完畢啟動(dòng)Timer之后,Timer在一個(gè)工作周期內(nèi)所做的就是先把TCNTB中的數(shù)值(Counter)減1,之后把TCNTB中的數(shù)值和TCMPB中的數(shù)值(Comparer)進(jìn)行對(duì)比,若Counter已經(jīng)被遞減到等于Comparer,發(fā)生計(jì)數(shù)超出,則Timer產(chǎn)生中斷信號(hào)(或是執(zhí)行DMA操作)并自動(dòng)把Counter重新裝入TCNTB(刷新TCNTB以重新進(jìn)行遞減)。以上就是Timer的工作原理。

下面我們結(jié)合代碼具體說(shuō)明如何對(duì)Timer0進(jìn)行初始化并開(kāi)啟它。
首先我假設(shè)我的PCLK是50700000Hz

// define Timer register
#define rTCFG0 (*(volatile unsigned int *)0x51000000)
#define rTCFG1 (*(volatile unsigned int *)0x51000004)
#define rTCON (*(volatile unsigned int *)0x51000008)
#define rTCNTB0 (*(volatile unsigned int *)0x5100000C)
#define rTCMPB0 (*(volatile unsigned int *)0x51000010)
#define rTCNTO0 (*(volatile unsigned int *)0x51000014)
#define rTCNTB1 (*(volatile unsigned int *)0x51000018)
#define rTCMPB1 (*(volatile unsigned int *)0x5100001C)
#define rTCNTO1 (*(volatile unsigned int *)0x51000020)
#define rTCNTB2 (*(volatile unsigned int *)0x51000024)
#define rTCMPB2 (*(volatile unsigned int *)0x51000028)
#define rTCNTO2 (*(volatile unsigned int *)0x5100002C)
#define rTCNTB3 (*(volatile unsigned int *)0x51000030)
#define rTCMPB3 (*(volatile unsigned int *)0x51000034)
#define rTCNTO3 (*(volatile unsigned int *)0x51000038)
#define rTCNTB4 (*(volatile unsigned int *)0x5100003C)
#define rTCNTO4 (*(volatile unsigned int *)0x51000040)

void timer0_config()
{
/*
                Timer0的prescaler由rTCFG0 的 0~7 bit決定
                Prescaler=119

*/
                rTCFG0=119       
/*
                Timer0的divider value由TCFG1的 0~3 bit決定,設(shè)置為3表示divider value = 1/16
                rTCFG1的第20~23bit用于決定Timer計(jì)數(shù)超出后所采取的響應(yīng),我們使用了中斷模式(20~23bit全部為0),
                即計(jì)數(shù)超出后產(chǎn)生中斷

*/
                rTCFG1=3;
       
                rTCNTB0=26406;
                rTCMPB0=0;
}
由于我們的PCLK是50700000Hz, 根據(jù)Timer input clock Frequency的計(jì)算公式我們?nèi)缦掠?jì)算Timer0的時(shí)鐘輸入頻率:

prescaler value = 119
divider value = 1/16
PCLK= 50700000
Timer input clock Frequency =50700000/ (119+1)/(1/16)=26406

   
也就是說(shuō)通過(guò)設(shè)置prescaler和divider value之后,Timer0的工作頻率為26406,也就是說(shuō)一秒內(nèi)Timer0會(huì)進(jìn)行26406次遞減和比較操作,假設(shè)我們現(xiàn)在是要讓Timer0每1秒產(chǎn)生一次中斷的話,我們應(yīng)該設(shè)置Counter=26406和Camparer=0,既:

rTCNTB0=26406;
rTCMPB0=0;

如果我們要讓Timer0每0.5秒產(chǎn)生一次中斷,則我們應(yīng)該設(shè)置Counter=26406/2和Camparer=0,既:

rTCNTB0=13203;
rTCMPB0=0;

如果我們要讓Timer0每0.25秒產(chǎn)生一次中斷,則我們應(yīng)該設(shè)置Counter=26406/4和Camparer=0,既:

rTCNTB0=6601;
rTCMPB0=0;

初始化完Timer后我們要開(kāi)啟它。

void timer0_start()
{
/*
               Update TCNTB0 & TCMPB0
               rTCON寄存器的第1位是刷新Timer0的COUNT BUFFER REGISTER(TCNTB)和
                COMPARE BUFFER REGISTER(TCMPB),由于是第一次加載Counter和Comparer,
                所以我們需要手動(dòng)刷新它們

*/
               rTCON|=1<<1;
/*
               置rTCON第0位為1,開(kāi)啟Timer0
               把rTCON第1位置為0,停止刷新TCNTB0 和 TCMPB0
               置rTCON第3位為1,設(shè)置Counter的加載模式為自動(dòng)加載(auto reload),這樣每當(dāng)
               Timer計(jì)數(shù)超出之后(此時(shí)TCNTB的值等于TCMPB的值),Timer會(huì)自動(dòng)把原來(lái)我們給
               定的Counter重新加載到TCNTB中

*/
        rTCON=0x09;       
}

    要使你的Timer能夠正常的工作,除了調(diào)用timer0_config()和timer0_start()之外,我們還必須設(shè)置Timer的中斷服務(wù)例程并取消對(duì)Timer的中斷的屏蔽.

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品中文字幕在线播放 | 国产在线精品免费 | 日韩乱码一二三 | 99久久久无码国产精品 | 深夜福利亚洲 | 日日干干夜夜 | 久久久久国产一区二区三区四区 | 成人不卡 | 二区视频 | 每日更新av | 久久99精品久久久久久 | 在线播放中文字幕 | 偷拍自拍网站 | 天天爱av | аⅴ资源新版在线天堂 | 天天干在线播放 | 久久久国产精品网站 | 中文字幕在线电影观看 | 精品国产乱码久久久久久蜜退臀 | 中文字幕三区 | 久久久久久蜜桃一区二区 | 欧美成人综合 | 久久久久久久久久久一区二区 | 91久久久久久久久久久久久 | 国产成人在线一区 | 午夜精品久久久久久久久久久久久 | 国产精品视频不卡 | www九色 | 成人在线 | 亚洲综合大片69999 | 日韩在线视频免费观看 | 精品一区二区三区在线观看国产 | 成人亚洲一区 | 一级做受毛片免费大片 | 日日噜噜噜夜夜爽爽狠狠视频97 | 国产在线h| 99九色| 国产成人精品a视频一区www | 91精品国产高清一区二区三区 | 亚洲永久字幕 | 日韩欧美综合在线视频 |