新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 牛人業(yè)話 > 2440開發(fā)板啟動代碼學(xué)習(xí)

        2440開發(fā)板啟動代碼學(xué)習(xí)

        作者: 時間:2016-12-02 來源:網(wǎng)絡(luò) 收藏

          init.s是啟動代碼的主文件,包括3個頭文件,option.inc,memcfg.inc,addr.inc。

        本文引用地址:http://www.104case.com/article/201612/341051.htm

          option.inc定義了3個堆棧起始地址,總線寬度,時鐘相關(guān)參數(shù)的定義等。其中這個總線寬度將作為一個IF判斷量,決定了各Bank的位寬設(shè)置,參見memcfg.inc文件及datasheet。

          memcfg.inc是存儲器Bank的配置文件,定義了存儲器相關(guān)寄存器位的值。各bank的位寬的設(shè)置定義也是在這個文件中,注意bank0的位寬沒有相關(guān)的定義,因為它的位寬取決于OM[1:0]引腳,即啟動方式。

          addr.inc定義了相關(guān)寄存器地址,包括存儲器控制寄存器,時鐘電源管理寄存器,中斷,看門狗,IO,NAND,雜項等相關(guān)用到的寄存器。

          2440init.s是主要的啟動代碼文件,它配置了存儲器,中斷服務(wù)程序,堆棧等重要內(nèi)容,并且最后開始跳到C代碼。

          Init段是開始點,跳轉(zhuǎn)到ResetHandler。然后執(zhí)行以下步驟:

          禁止看門狗,禁止中斷,禁止子中斷,然后調(diào)節(jié)鎖定時間,接著設(shè)定FCLK與HCLK與PCLK的比例1:2:4,然后設(shè)置UPLL為48M,延時7個時鐘周期后設(shè)置MPLL為400M。

          這時通過讀取復(fù)位狀態(tài)寄存器判斷此時的復(fù)位到底是上電復(fù)位,喚醒復(fù)位還是看門狗復(fù)位等,如果是喚醒復(fù)位則跳轉(zhuǎn)到相應(yīng)位置然后釋放SCLK,設(shè)置SDRAM,返回等。

          如果不是喚醒復(fù)位則繼續(xù)向下配置SDRAM,它實際上是把一個名為SMRDATA的數(shù)據(jù)緩沖池一個一個的送入相關(guān)的控制寄存器,相關(guān)的初始化配置的定義在memcfg.inc文件中。

          然后跳轉(zhuǎn)到初始化堆棧,具體以后再看。

          接著讀取BWSCON寄存器的相關(guān)位判斷是從NOR還是NAND引導(dǎo)的,如果是NOR引導(dǎo),則跳轉(zhuǎn)到copy_proc_beg。

          這部分主要是把RW區(qū)在ROM中的地址開始處搬移到RAM區(qū),然后接著在這后面ZI區(qū)清0。

          如果是NAND引導(dǎo),則跳轉(zhuǎn)到nand_boot_beg。

          先配置NAND的時序參數(shù)和相關(guān)控制功能,然后跳轉(zhuǎn)到ReadNandID等等,最后還是類似上面的完成RAM的復(fù)制,相關(guān)內(nèi)容以后再學(xué)。

          接著將IsrIRQ的地址放到HandleIRQ地址中。這樣當(dāng)中斷發(fā)生后便能找到中斷服務(wù)程序。

          最后跳轉(zhuǎn)到MAIN函數(shù)中,匯編部分的啟動代碼結(jié)束。

          中斷的內(nèi)容詳細(xì)解說如下:

          首先,定義了一個宏,宏名為“$HandlerLabel HANDLER $HandleLabel”,這個宏展開后是一個以$HandlerLabel為入口名的代碼段,例如“比如“HandlerIRQ HANDLER HandleIRQ”,宏執(zhí)行以后將執(zhí)行$HandleLabel地址中的內(nèi)容,例如上則執(zhí)行HandleIRQ地址中的內(nèi)容。

          當(dāng)中斷發(fā)生以后,ARM將從地址0x18處執(zhí)行指令,即是一條跳轉(zhuǎn)指令“b HandlerIRQ”,然后即是執(zhí)行上面的宏,宏執(zhí)行完以后則執(zhí)行 HandleIRQ地址中的內(nèi)容,而這正是入口名為IsrIRQ的代碼部分。而IsrIRQ代碼段的執(zhí)行作用是首先讀取INTOFFSET寄存器判斷中斷 源是哪個,記錄其中斷服務(wù)子程序的地址偏移量,然后將這個偏移量加上基地址,即EINT0中斷服務(wù)子程序的入口地址所在的地址,最后從這個地址開始執(zhí)行。

          而所有的各個中斷源觸發(fā)的中斷的中斷服務(wù)子程序的入口地址都是固定的,所以在啟動代碼的后面有一個以_ISR_STARTADDRESS為開始的數(shù)據(jù)段,所有的地址名都是以Handle為開頭的定義,如HandleTIMER0等。

          當(dāng)IsrIRQ執(zhí)行后即從固定的中斷服務(wù)子程序地址所在的地址處找到真正的中斷服務(wù)子程序的地址,并執(zhí)行之。



        關(guān)鍵詞: 2440

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 渑池县| 泌阳县| 沾化县| 新巴尔虎左旗| 石渠县| 望江县| 合肥市| 仙桃市| 广河县| 辉南县| 四川省| 四会市| 威远县| 万源市| 武鸣县| 彭州市| 中山市| 宜都市| 义马市| 夏津县| 上饶市| 祁门县| 长治市| 宾川县| 平湖市| 西宁市| 上蔡县| 宁城县| 察雅县| 庐江县| 禄劝| 五河县| 越西县| 浮山县| 峨眉山市| 锡林浩特市| 聂荣县| 忻州市| 南丰县| 东平县| 沅江市|