工程中startup_LPC17XX.s是M3的啟動文件,啟動文件由匯編語言寫的,它的作用一般是下面這幾個:
1)堆和棧的初始化
2)中斷向量表定義
3)地址重映射及中斷向量表的轉移
4)設置系統時鐘頻率
5)中斷寄存器的初始化
6)進入C應用程序
core_cm3.c與core_cm3.h主要是M3外圍驅動源代碼與頭文件,使用時一般不需要修改,直接調用就可以。system_LPC17xx.c與system_LPC17xx.h是關于系統的文件,里面主要提供了系統初始化函數SystemInit(),文件中默認情況下定義的晶振的大小為12M,使用的是外部晶振,還使用了PLL0倍頻,關于倍頻的問題,以后慢慢再總結。芯片LPC1768的初始化主要包括時鐘配置,電源管理,功耗管理等。相比較而言,時鐘配置相對復雜,因為它包括兩個PLL倍頻電路,一個是主PLL0主要是為系統和USB提供時鐘,另一個是PLL1專門為USB提供48M時鐘,但也可以不使用它們。由于時鐘配置比較靈活,所以相以設置這些參數也比較復雜,但是這些在系統文件中已有明確的定義,所以想要變動時只需修改系統文件中相應的宏或函數即可。
程序完成如下內容的工作:
開辟一塊大小為Stack_Size的棧空間;
標號__initial_sp指向棧頂位置;
定義堆空間大小為Heap_Size;
建立中斷向量表Vectors,cortex-M3規定起始地址必須存放棧頂地址即__initial_sp,緊接著存放復位入口地址,這樣內核復位后就會自動從起始地址的下32位取出復位地址執行復位中斷服務函數。
Reset_Handler復位中斷函數中先EXPORT聲明Reset_Handler的全局性,然后分別執行外部的函數SystemInit和__main。
下面對匯編程序中的幾個關鍵字做說明:
AREA偽指令:用于定義代碼段和數據段,后跟屬性標號。其中“READWRITE”表示可讀寫,“READONLY”只讀屬性。根據LPC1788的數據手冊描述的存儲介質,可知可讀寫段保持在SRAM區,起始地址為0x1000 0000,代碼中的堆棧保存在SRAM空間。只讀段保存在Flash區,起始地址為0x0000 0000,代碼中的中斷向量表保存在Flash空間。 因此可以總結出,在0x0000 0000 存放的是棧頂的地址__initial_sp(即0x1000 0200),在0x0000 0004 存放的是Reset_Handler的地址。
圖1:LPC1788 地址映射
圖2: debug中 0地址的值0x1000 0200 即棧頂地址, 0x0000 0004 地址值為0x0000 00F9(看反匯編可知該值 即Reset_Handler的入口如下圖)
DCD指令:開辟內存空間,中斷向量表建立中使用相當于C語言中的函數指針,每個成員都是函數指針,指向各個中斷服務函數。
自此分析了LPC1788的啟動,主要包括堆棧初始化,和中斷向量表的初始化。LPC1788有內部Flash,所以上電從內部Flash啟動,內部Flash的起始地址為0x0000 0000,存放棧頂的地址0x1000 0200。 0x0000 0004存放復位中斷的入口地址。LPC1788復位后,從0x0000 0004取出復位入口地址,執行中斷復位函數,從而跳轉到SystemInit和main C語言函數執行
新聞熱點
疑難解答