2440開發板啟動代碼學習
2440init.s是啟動代碼的主文件,包括3個頭文件,option.inc,memcfg.inc,2440addr.inc。
本文引用地址:http://cqxgywz.com/article/201612/341051.htmoption.inc定義了3個堆棧起始地址,總線寬度,時鐘相關參數的定義等。其中這個總線寬度將作為一個IF判斷量,決定了各Bank的位寬設置,參見memcfg.inc文件及datasheet。
memcfg.inc是存儲器Bank的配置文件,定義了存儲器相關寄存器位的值。各bank的位寬的設置定義也是在這個文件中,注意bank0的位寬沒有相關的定義,因為它的位寬取決于OM[1:0]引腳,即啟動方式。
2440addr.inc定義了相關寄存器地址,包括存儲器控制寄存器,時鐘電源管理寄存器,中斷,看門狗,IO,NAND,雜項等相關用到的寄存器。
2440init.s是主要的啟動代碼文件,它配置了存儲器,中斷服務程序,堆棧等重要內容,并且最后開始跳到C代碼。
Init段是開始點,跳轉到ResetHandler。然后執行以下步驟:
禁止看門狗,禁止中斷,禁止子中斷,然后調節鎖定時間,接著設定FCLK與HCLK與PCLK的比例1:2:4,然后設置UPLL為48M,延時7個時鐘周期后設置MPLL為400M。
這時通過讀取復位狀態寄存器判斷此時的復位到底是上電復位,喚醒復位還是看門狗復位等,如果是喚醒復位則跳轉到相應位置然后釋放SCLK,設置SDRAM,返回等。
如果不是喚醒復位則繼續向下配置SDRAM,它實際上是把一個名為SMRDATA的數據緩沖池一個一個的送入相關的控制寄存器,相關的初始化配置的定義在memcfg.inc文件中。
然后跳轉到初始化堆棧,具體以后再看。
接著讀取BWSCON寄存器的相關位判斷是從NOR還是NAND引導的,如果是NOR引導,則跳轉到copy_proc_beg。
這部分主要是把RW區在ROM中的地址開始處搬移到RAM區,然后接著在這后面ZI區清0。
如果是NAND引導,則跳轉到nand_boot_beg。
先配置NAND的時序參數和相關控制功能,然后跳轉到ReadNandID等等,最后還是類似上面的完成RAM的復制,相關內容以后再學。
接著將IsrIRQ的地址放到HandleIRQ地址中。這樣當中斷發生后便能找到中斷服務程序。
最后跳轉到MAIN函數中,匯編部分的啟動代碼結束。
中斷的內容詳細解說如下:
首先,定義了一個宏,宏名為“$HandlerLabel HANDLER $HandleLabel”,這個宏展開后是一個以$HandlerLabel為入口名的代碼段,例如“比如“HandlerIRQ HANDLER HandleIRQ”,宏執行以后將執行$HandleLabel地址中的內容,例如上則執行HandleIRQ地址中的內容。
當中斷發生以后,ARM將從地址0x18處執行指令,即是一條跳轉指令“b HandlerIRQ”,然后即是執行上面的宏,宏執行完以后則執行 HandleIRQ地址中的內容,而這正是入口名為IsrIRQ的代碼部分。而IsrIRQ代碼段的執行作用是首先讀取INTOFFSET寄存器判斷中斷 源是哪個,記錄其中斷服務子程序的地址偏移量,然后將這個偏移量加上基地址,即EINT0中斷服務子程序的入口地址所在的地址,最后從這個地址開始執行。
而所有的各個中斷源觸發的中斷的中斷服務子程序的入口地址都是固定的,所以在啟動代碼的后面有一個以_ISR_STARTADDRESS為開始的數據段,所有的地址名都是以Handle為開頭的定義,如HandleTIMER0等。
當IsrIRQ執行后即從固定的中斷服務子程序地址所在的地址處找到真正的中斷服務子程序的地址,并執行之。



評論