基於S3C2440的bootloader移植詳解

2021-05-04 21:49:23 字數 2297 閱讀 3754

首先:在彙編中初始化堆疊,中斷向量表,mmu,時鐘,串列埠等,然後跳到c語言的main函式。這部分**小於4k,放在block0。這個main函式用來將第二段**拷備到dram中並執行。

不說這麼多廢話了,說多了無益,讓我們一起來揭開bootloader的神秘的面紗吧!

先說下我移植的bootloader的功能,以及燒錄時間,和揚創的做下對比。

方法一:通過揚創的老掉牙的方法,先在ads1.2裡面生成bootloader.bin檔案,然後用sjf2440燒寫工具,配合giveio將bin檔案燒寫進從block0開始的塊。大概要花上十分鐘左右的樣子吧!bin檔案有點大。

方法四:將ads1.2的**移植到mdk,通過ulink2**,讓程式執行在dram,然後通過bootloader程式將bin檔案燒寫進nand。

其二:如果手上沒有usb的**器,那麼也僅僅是用並口燒寫過一次bootloader就不用了,除非nand的bootloader被格掉了。如果手上有usb的**器,那就徹底不用並口了,這不正是廣大筆記本開發者頭痛之處麼?

其三:整個bootloader檔案只需乙個工程檔案,即只用乙個bin檔案,而且是直接燒寫至以block0開始的塊。繼續神奇?哈哈,2440手冊上不是說第一段**不能大於4k嗎?這不是與手冊衝突了?再覺得神奇就看**吧!

先將整個bootloader的流程圖放上來:

先從全域性對整個工程有個大體的了解很重要,這樣區域性一條條的看更容易懂。

由於程式實在太長,這裡分幾個部分逐步說明。

一:串列埠配置。

整個bootloader的互動環境全部是通過串列埠顯示的,那麼怎麼樣才能準確無誤的顯示出想要的字元呢?

首先要知道的是:串列埠的clk是掛在pclk上的。波特率與pclk有著密切的關係,因此正確設定pclk,是和正確設定波特率有著千絲萬縷的聯絡的。

s3c2440內建兩個pll電路,即mpll和upll。mpll給fclk,hclk,pclk提供時鐘,upll給usb提供時鐘。

mpll=fclk=(2*m*fin)/(p*2^s);

m=m+8;

p=p+2;

m,p由暫存器mpllcon設定。

確定了fclk後,hclk和pclk由暫存器clkdivn確定。

詳細設定請參考s3c2440的spec。

這裡設定mdiv=92,pdiv=1,s=1,計算得fclk=400mhz.

相應的設定clkdivn,使得fclk:hclk:pclk=1:4:8,

這樣pclk=400/8=50mhz.

再通過pclk設定波特率為115200,這樣串列埠配置就完成了。

二:timer4的設定

從上面的流程圖可以看出,timer4用於倒計時,當在規定時間內沒有響應鍵盤後,自動裝載系統並執行。

timer4的時鐘也是以pclk為基準的。具體輸入的時鐘頻率為:

timer input clock frequency = pclk / /

其中prescaler value由暫存器rtcfg0確定,divider value由暫存器rtcfg1確定。

這裡設定輸入的頻率fin=pclk/(3+1)/4=312500hz.

然後設定定時器裝載的初始值,由暫存器rtcntb4確定。

這裡設定rtcntb4=3125.

由此可以算出,定時器產生一次中斷所花的時間為:t=n/f=3125/312500=0.01s。

具體**如下:

static void init_autorun_timer(int sec)

static __irq void autorun_proc(void)

}中斷程式中有個變數enrunwince,預設為0.當autorun_10ms值減到0後,即定時的時間已到,

這時enrunwince=1,後面的程式通過該變數判斷時間到了,然後執行自動載入nk的**。

具體**如下:

if(enrunwince)

三:lcd設定

由於暫存器較多,這裡不一一枚舉,僅給lcd顯示的函式如下:

void lcd_play()

前面各暫存器初始化完成後,進入這個死迴圈,預設menuused=0,這時將執行函式waitdownload()。

downloadfilesize=0,這時執行下面的**:

timer_initex();  

timer_startex();

time=timer_stopex();

if(download_run==1)

run();

}

基於S3C2440的UART傳輸小結

這裡簡單地介紹一下通過暫存器來控制s3c2440的uart傳輸。檢視s3c2440的晶元手冊可以發現uart有著傳送和接收的快取區,在快取區有資料後其便乙個位元組乙個位元組地將資料傳輸到對應埠處。這裡介紹其中使用到的幾個暫存器。ulconx 用於設定資料的資料位 校驗位 停止位之類的資訊。uconx...

求教 s3c2440問題

趙老師您好,我把您的程式新增到我的程式中去了,下面是主要 1 main函式 int main void a a b rgpbdat liushui delay 20 liushui liushui 0xffe 2 pwm初始化 void pwm init void 3 定時器中斷 static vo...

s3c2440系統時鐘

1 flck hclk和pclk的關係 一般來說,mcu的主時鐘源主要是外部晶振或外部時鐘,而用的最多的是外部晶振。在正確情況下,系統內所使用的時鐘都是外部時鐘源經過一定的處理得到的。由於外部時鐘源的頻率一般不能滿足系統所需要的高頻條件,所以往往需要pll 鎖相環 進行倍頻處理。在s3c2440中,...