女人被狂躁到高潮视频免费无遮挡,内射人妻骚骚骚,免费人成小说在线观看网站,九九影院午夜理论片少妇,免费av永久免费网址

當前位置:首頁 > > 充電吧
[導讀]郁悶,剛才寫了N百字的東西,就在我系統(tǒng)崩潰的一瞬間,沒有。。。。傷心欲死。。。。,但從哪兒完蛋的就從哪不讓它完蛋的信念告訴我,一定接著寫。。。在學校的時候裸跑了2410的PWM來控制直流電動機,之后來

郁悶,剛才寫了N百字的東西,就在我系統(tǒng)崩潰的一瞬間,沒有。。。。傷心欲死。。。。,但從哪兒完蛋的就從哪不讓它完蛋的信念告訴我,一定接著寫。。。

在學校的時候裸跑了2410的PWM來控制直流電動機,之后來到公司先后寫了蜂鳴器(有點兒簡單,都不好意思提)、CC1100定時器部分的WIN CE驅動,算是對2410的TIMER有所了解了,現記錄如下:

在寫之前請各位先看一下我轉蔡于清老師的一篇文章,因為我也是在看了這篇文章之后才著手弄s3c2410 Timer的,但一定要抱著試試看的態(tài)度閱讀喲,不然小心中招。嘻嘻^_^先賣個關子。
?

s3c2410 Timer 作者:蔡于清
www.another-prj.com


s3c2410提供了5個16位的Timer(Timer0~Timer4),其中Timer0~Timer3支持Pulse Width Modulation—— PWM(脈寬調制 )。Timer4是一個內部定時器(internal timer),他沒有輸出引腳(output pins)。
下面是Timer的工作原理圖。
clip_image002.gif (34.3 KB)
2007-3-23 21:32
[attach]60[/attach]
如上圖所示,PCLK是Timer的信號源,我們通過設置每個Timer相應的Prescaler和Clock Divider把PCLK轉換成輸入時鐘信號傳送給各個Timer的邏輯控制單元(Control Logic),事實上每個Timer都有一個稱為輸入時鐘頻率(Timer input clock Frequency)的參數,這個頻率就是通過PCLK,Prescaler和Clock Divider確定下來的,每個Timer 的邏輯控制單元就是以這個頻率在工作。下面給出輸入時鐘頻率的公式:

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

然而并不是每一個Timer都有對應的Prescaler和Clock Divider,從上面的原理圖我們可以看到Timer0,Timer1共用一對Prescaler和Clock Divider,Timer2,Timer3,Timer4共用另一對Prescaler和Clock Divider,s3c2410的整個時鐘系統(tǒng)模塊只存在兩對Prescaler和Clock Divider。

我曾經在討論watchdog的文章中提到,watchdog也是一種定時器,他的工作就是在一個單位時間內對一個給定的數值進行遞減和比較的操作,而我們這篇文章討論的定時器他的工作內容和watchdog在本質上是一樣的。定時器在一個工作周期(Timer input clock cycle)內的具體工作內容主要有3個。分別是:

1.? ?? ???對一個數值進行遞減操作
2.? ?? ???把遞減后的數值和另一個數值進行比較操作
3.? ?? ???產生中斷或執(zhí)行DMA操作

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

下面我們結合代碼具體說明如何對Timer0進行初始化并開啟它。
首先我假設我的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決定,設置為3表示divider value = 1/16
? ?? ?? ?? ?? ? rTCFG1的第20~23bit用于決定Timer計數超出后所采取的響應,我們使用了中斷模式(20~23bit全部為0),
? ?? ?? ?? ?? ? 即計數超出后產生中斷
*/
? ?? ?? ?? ?? ? rTCFG1=3;
? ?? ???
? ?? ?? ?? ?? ? rTCNTB0=26406;
? ?? ?? ?? ?? ? rTCMPB0=0;
}
由于我們的PCLK是50700000Hz, 根據Timer input clock Frequency的計算公式我們如下計算Timer0的時鐘輸入頻率:

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

也就是說通過設置prescaler和divider value之后,Timer0的工作頻率為26406,也就是說一秒內Timer0會進行26406次遞減和比較操作,假設我們現在是要讓Timer0每1秒產生一次中斷的話,我們應該設置Counter=26406和Camparer=0,既:
rTCNTB0=26406;
rTCMPB0=0;

如果我們要讓Timer0每0.5秒產生一次中斷,則我們應該設置Counter=26406/2和Camparer=0,既:
rTCNTB0=13203;
rTCMPB0=0;

如果我們要讓Timer0每0.25秒產生一次中斷,則我們應該設置Counter=26406/4和Camparer=0,既:
rTCNTB0=6601;
rTCMPB0=0;

初始化完Timer后我們要開啟它。

void timer0_start()
{
/*
? ?? ?? ?? ?? ?Update TCNTB0 & TCMPB0
? ?? ?? ?? ?? ?rTCON寄存器的第1位是刷新Timer0的COUNT BUFFER REGISTER(TCNTB)和
? ?? ?? ?? ?? ? COMPARE BUFFER REGISTER(TCMPB),由于是第一次加載Counter和Comparer,
? ?? ?? ?? ?? ? 所以我們需要手動刷新它們
*/
? ?? ?? ?? ??? rTCON|=1<<1;
/*
? ?? ?? ?? ?? ?置rTCON第0位為1,開啟Timer0
? ?? ?? ?? ?? ?把rTCON第1位置為0,停止刷新TCNTB0 和 TCMPB0
? ?? ?? ?? ?? ?置rTCON第3位為1,設置Counter的加載模式為自動加載(auto reload),這樣每當
? ?? ?? ?? ?? ?Timer計數超出之后(此時TCNTB的值等于TCMPB的值),Timer會自動把原來我們給
? ?? ?? ?? ?? ?定的Counter重新加載到TCNTB中
*/
? ?? ???rTCON=0x09;? ?? ???
}

要使你的Timer能夠正常的工作,除了調用timer0_config()和timer0_start()之外,我們還必須設置Timer的中斷服務例程并取消對Timer的中斷的屏蔽.這些操作可以參考<

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除。
換一批
延伸閱讀

以前都只是在網上搜的能用的例子,對一些參數不是很清楚,這次匯總。而且網絡通信還是很常用的通信手段。

關鍵字: api c Linux socket

什么是Littelfuse setP?溫度指示器?它有什么作用?2019年6月12日訊 - - Littelfuse, Inc. (NASDAQ: LFUS)今日宣布推出經過擴展的PolySwitch? setP? 系列...

關鍵字: c littelfuse type USB 連接器

第三方代碼的使用是企業(yè)能夠快速高效建立新系統(tǒng)、新產品、新平臺的關鍵因素,能大幅度縮短開發(fā)周期,減少人力和資金的投入。目前大部分第三方代碼包含大量的開源代碼,并且主要是以二進制代碼或是源代碼的方式

關鍵字: c 代碼

作為初學者,我想記錄一下我的學習狀況,一是可以回頭尋找自己的進步,二是希望我可以通過這種學習方式來指導未來想學的伙伴們。

關鍵字: c C語言 Linux

根據今年早些時候發(fā)布的2019年關于嵌入式市場研究的報告,雖然物聯網、嵌入式視覺、機器學習和其他新興技術的重要性日益提高,但C和C ++仍是嵌入式開發(fā)中占主導地位的編程語言。

關鍵字: c python 嵌入式 技術前沿 ++

單例模式 單例模式,可以說設計模式中最常應用的一種模式了,據說也是面試官最喜歡的題目。但是如果沒有學過設計模式的人,可能不會想到要去應用單例模式,面對單例模式適用的情況,可能會優(yōu)先考慮使用全局或者靜

關鍵字: c 單例 qt單例模式

智能家居是在互聯網影響之下物聯化的體現。現在是智能家居產業(yè)最好的時代,用戶需求明顯,產品廠商極其活躍,供銷兩旺的勢頭越來越明顯。但智能家居畢竟是一個新興事物,加上5G、AIoT等新技術的加持,在市場定位、渠道建設、商業(yè)...

關鍵字: c to 智能家居 b

剛剛寫的SPI驅動,想移植到LINUX上面用來讀寫SD卡 只測試了發(fā)送,沒有測試接收. spi.c /***********************************************

關鍵字: c delay

1.gets()函數 #include int main(int argc, char *argv[]) { char buff[10]; memset(buff, 0, sizeof(buf

關鍵字: c Linux

1.準備工作 ? 首先得安裝好gcc工具鏈,以及開發(fā)環(huán)境,可以看看我的前面的幾步。 ?? 還得編譯好內核,一般開發(fā)板都帶了,現在我還不知道配置內核,只能按照開發(fā)板默認的去編譯,編譯前需要先編譯uboo

關鍵字: c
關閉