工程中startup_LPC17XX.s是M3的啟動(dòng)文件,啟動(dòng)文件由匯編語(yǔ)言寫(xiě)的,它的作用一般是下面這幾個(gè):
1)堆和棧的初始化
2)中斷向量表定義
3)地址重映射及中斷向量表的轉(zhuǎn)移
4)設(shè)置系統(tǒng)時(shí)鐘頻率
5)中斷寄存器的初始化
6)進(jìn)入C應(yīng)用程序
core_cm3.c與core_cm3.h主要是M3外圍驅(qū)動(dòng)源代碼與頭文件,使用時(shí)一般不需要修改,直接調(diào)用就可以。system_LPC17xx.c與system_LPC17xx.h是關(guān)于系統(tǒng)的文件,里面主要提供了系統(tǒng)初始化函數(shù)SystemInit(),文件中默認(rèn)情況下定義的晶振的大小為12M,使用的是外部晶振,還使用了PLL0倍頻,關(guān)于倍頻的問(wèn)題,以后慢慢再總結(jié)。芯片LPC1768的初始化主要包括時(shí)鐘配置,電源管理,功耗管理等。相比較而言,時(shí)鐘配置相對(duì)復(fù)雜,因?yàn)樗▋蓚€(gè)PLL倍頻電路,一個(gè)是主PLL0主要是為系統(tǒng)和USB提供時(shí)鐘,另一個(gè)是PLL1專門為USB提供48M時(shí)鐘,但也可以不使用它們。由于時(shí)鐘配置比較靈活,所以相以設(shè)置這些參數(shù)也比較復(fù)雜,但是這些在系統(tǒng)文件中已有明確的定義,所以想要變動(dòng)時(shí)只需修改系統(tǒng)文件中相應(yīng)的宏或函數(shù)即可。
程序完成如下內(nèi)容的工作:
開(kāi)辟一塊大小為Stack_Size的棧空間;
標(biāo)號(hào)__initial_sp指向棧頂位置;
定義堆空間大小為Heap_Size;
建立中斷向量表Vectors,cortex-M3規(guī)定起始地址必須存放棧頂?shù)刂芳確_initial_sp,緊接著存放復(fù)位入口地址,這樣內(nèi)核復(fù)位后就會(huì)自動(dòng)從起始地址的下32位取出復(fù)位地址執(zhí)行復(fù)位中斷服務(wù)函數(shù)。
Reset_Handler復(fù)位中斷函數(shù)中先EXPORT聲明Reset_Handler的全局性,然后分別執(zhí)行外部的函數(shù)SystemInit和__main。
下面對(duì)匯編程序中的幾個(gè)關(guān)鍵字做說(shuō)明:
AREA偽指令:用于定義代碼段和數(shù)據(jù)段,后跟屬性標(biāo)號(hào)。其中“READWRITE”表示可讀寫(xiě),“READONLY”只讀屬性。根據(jù)LPC1788的數(shù)據(jù)手冊(cè)描述的存儲(chǔ)介質(zhì),可知可讀寫(xiě)段保持在SRAM區(qū),起始地址為0x1000 0000,代碼中的堆棧保存在SRAM空間。只讀段保存在Flash區(qū),起始地址為0x0000 0000,代碼中的中斷向量表保存在Flash空間。 因此可以總結(jié)出,在0x0000 0000 存放的是棧頂?shù)牡刂穇_initial_sp(即0x1000 0200),在0x0000 0004 存放的是Reset_Handler的地址。

圖1:LPC1788 地址映射

圖2: debug中 0地址的值0x1000 0200 即棧頂?shù)刂罚?0x0000 0004 地址值為0x0000 00F9(看反匯編可知該值 即Reset_Handler的入口如下圖)

DCD指令:開(kāi)辟內(nèi)存空間,中斷向量表建立中使用相當(dāng)于C語(yǔ)言中的函數(shù)指針,每個(gè)成員都是函數(shù)指針,指向各個(gè)中斷服務(wù)函數(shù)。
自此分析了LPC1788的啟動(dòng),主要包括堆棧初始化,和中斷向量表的初始化。LPC1788有內(nèi)部Flash,所以上電從內(nèi)部Flash啟動(dòng),內(nèi)部Flash的起始地址為0x0000 0000,存放棧頂?shù)牡刂?x1000 0200。 0x0000 0004存放復(fù)位中斷的入口地址。LPC1788復(fù)位后,從0x0000 0004取出復(fù)位入口地址,執(zhí)行中斷復(fù)位函數(shù),從而跳轉(zhuǎn)到SystemInit和main C語(yǔ)言函數(shù)執(zhí)行
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注