自己動手編寫嵌入式Bootloader之(3)

2021-05-24 10:20:50 字數 1954 閱讀 2950

因為在 cs8900a的驅動程式中需要用到延時,因此有必要對s3c2440的計時器進行使能和初始化,並編寫延時程式。

s3c2440a共有5個定時器,編號為timer0 ~ timer4。其中timer0 ~ timer3都有輸出引腳,可以通過定時器來控制引腳電平週期性的變化,這稱為脈衝寬度調製(pwm:pulse width modulation)功能。而timer4沒有輸出引腳,也就沒有pwm功能,所以timer4常被程式裡的延時函式使用。

定時器部件的時鐘源為pclk,但是需要經過兩級預分頻之後才真正供定時器使用。第一級預分頻由tcfg0暫存器控制,其位[7:0]設定預分頻器0的值,供timer0和timer1使用,位[15:8]設定預分頻器1的值,供timer2 ~ timer4使用。第二級預分頻由tcfg1暫存器控制,其每四位控制乙個定時器,可以從2分頻、4分頻、8分頻、16分頻、外接tclk0/tclk1 這五種頻率中選擇。

我們的延時函式使用timer4,其它定時器全部關閉。初始化程式中設定:tcfg0 = 0x0f00; 表示timer4的第一級預分頻值為 15+1 = 16。暫存器tcfg1使用預設值全0,表示第二級預分頻為2分頻。前面已經設定pclk為50mhz,這樣timer4實際的工作頻率為:

50mhz/16/2 = 50000000/32 = 1562500hz

注意計算時鐘頻率時的mhz是指10^6,而不是2^20;同理khz是指1000hz,而不是1024hz。

我們在tcon中把timer4設為」自動載入「。當timer4啟動時,tcntb4的值將被自動裝入內部暫存器tcnt4,然後在工作頻率下,tcnt4開始減1計數,當到達0時,tcntb4的值又被自動裝入tcnt4,下乙個計數流程開始。我們把tcntb4設為15625,則乙個計數流程的的長度為10毫秒。

假設要延時的時間為msec毫秒,則共需要的計數值為 tmo = msec*15625/10,設乙個變數timestamp儲存已經過去的時間戳,每次讀取tcnt4的值後更新timestamp,直到它大於 tmo 。程式如下:

while

(if(

>

=/**/

+=-/*..

.*/+=+

-=}tcnt4的值可由暫存器tcnto4讀出。程式中儲存了最近兩次讀出的tcnto4值, 如果本次值比上次小,說明在同乙個計數流程內;如果本次值比上次大,說明已經進入了下乙個計數流程。

要想在bootloader中使用scanf()和print()並不容易,因為不能直接使用c庫函式。scanf()要從串列埠獲得輸入, print()要向串列埠進行輸出。必須自己實現常用的c庫函式, 不僅包括輸入輸出函式,還包括字串操作函式如strcmp(), strcpy()等。幸好在《嵌入式linux應用開發完全手冊》這本書的源**中提供了這樣簡化的c庫,所以就直接拿來用了。

**中定義了兩個全域性陣列作為輸入輸出緩衝區:

static unsigned char g_pcoutbuf[ 1024 ];

static unsigned char g_pcinbuf[ 1024 ];

其實我們可以把這兩個緩衝區定位在cpu的 steppingstone 裡面,這樣可以節省2k的空間。

scanf()的實現裡面呼叫 getc() 函式, printf() 的實現裡面呼叫 putc() 函式。我們自己寫getc()函式為從串列埠讀取字元, putc()函式實現為向串列埠傳送字元, 這樣標準輸入輸出就跟串列埠聯絡在一起了。

/* 傳送乙個字元 */

void

putc

(unsigned

char

/* 接收字元 */

unsigned

char

getc

(void

)else

return

}檔案:s-boot.tar.gz

大小:41kb

armlinux

bootloader

自己動手打造嵌入式Linux軟硬體開發環境

linux和uclinux 1991年8月,芬蘭的乙個學生在comp.os.minix新聞組貼上了以下這段話 你好所有使用minix的人 我正在為386 486 at做乙個免費的作業系統 只是為了愛好,不會象gnu那樣很大很專業.這名學生就是linus torvalds,而他所說的 愛好 就變成我們...

自己動手編寫 IronPython IDE

這段時間對ironpython充滿了極大的興趣,學習越深入,越感覺到現有ironpython ide實在不太好用,正好專案中也需要乙個ironpython編輯器,所以就動手做了起來。整整花費了我三天的時間 熬了幾個通宵 總算有了點成果,不過在除錯方面還是存在不足。支援錯誤定位,不過效果不是很好,對開...

自己動手編寫 IronPython IDE

這段時間對ironpython充滿了極大的興趣,學習越深入,越感覺到現有ironpython ide實在不太好用,正好專案中也需要乙個ironpython編輯器,所以就動手做了起來。整整花費了我三天的時間 熬了幾個通宵 總算有了點成果,不過在除錯方面還是存在不足。支援錯誤定位,不過效果不是很好,對開...