ARM學習中LPC2104的Boot與Remap詳解
至此,Flash塊對內存地址空間的占用情況如下:
1、除去因Remap被暫時注銷了映射關系的那小部分64字節(jié)的Flash子塊外,Flash塊作為一個整體占用的地址編碼空間為0x00000040—0x0001FFFF;
2、同時,Bootload子塊又占用了0x7FFFE000—0x7FFFFFF的地址編碼空間,Bootload子塊中的異常向量表部分占用了0x00000000—0x0000003F。
因此,Bootload子塊中的異常向量表部分實際上是占用了重復占用了三段地址編碼空間:0x00000000—0x0000003F、0x0001E000—0x0001E03F以及0x7FFFE000—0x7FFFE03F。
圖2中,存儲器的映射順序為:Memory Map-〉Reset Remap-〉Bootload Remap。
SRAM塊和內核外圍模塊的映射關系在Remap之后保持不變,可參見圖1。
* - 本貼最后修改時間:2005-3-10 17:31:19 修改者:andrewpei
* - 修改原因:Append
Boot
LPC2104有效的異常向量表地址編碼空間是0x00000000—0x0000003F(嚴格來說應該是0x00000000—0x0000001F)。處理器復位后的Boot動作就是從0x00000000處起始字中取出跳轉指令,開始程序的執(zhí)行。由于處理器復位后,映射到0x00000000—0x0000003F地址空間的異常向量表源于Bootload子塊,因此CPU實際上開始執(zhí)行的是Philips在芯片出廠前寫入的Bootload程序。
進入Bootload后,程序首先檢查看門狗溢出標志是否置位。
若看門狗溢出標志置位,則表明當前的系統(tǒng)復位是內部軟復位,CPU下一步將對Flash塊中的異常向量表進行加和校驗。如果加和檢驗結果為零,Bootload程序將撤銷Bootload子塊中異常向量表部分在0x00000000—0x00000003F地址空間上的映射,恢復Flash塊的異常向量表在這64字節(jié)地址空間上的映射關系(如圖3),然后跳轉到異常向量表地址0x00000000處轉入用戶程序的執(zhí)行。如果加和校驗結果不為零,Bootload程序將進行UART0接口的波特率自動偵測,隨時響應ISP宿主機的編程請求,執(zhí)行處理器芯片的ISP編程工作。
若Bootload沒有發(fā)現(xiàn)看門狗溢出標志置位,則表明當前的系統(tǒng)復位是外部硬復位,CPU將采樣P0.14引腳的外部邏輯電平輸入。如果為0,Bootload執(zhí)行UART0的自動波特率偵測,隨時響應ISP宿主機的編程請求;如果為1,Bootload的后續(xù)動作將與前面檢測到看門狗溢出標志置位的程序執(zhí)行完全相同。
Remap(可選)
最后這一步可選的Remap動作完全處于用戶的控制之下,Remap的對象是片內SRAM存儲器塊的異常向量部分,共計64字節(jié)大小。用戶可以編程決定何時Remap、Remap之后是否再修改異常向量表以及如何修改異常向量表等等。需要強調的是,引發(fā)Remap動作的指令與建立SRAM塊中異常向量的所有功能代碼全部駐留在Flash塊的用戶編程區(qū)中,是用戶應用軟件的一部分。
曾經(jīng)有網(wǎng)友對Philips在LPC2000系列處理器中引入這個可選的Remap功能提出質疑:LPC2000系列處理器片內的Flash塊被分割成了兩組,每組都配備了相互獨立的128位寬度的讀取緩沖,在絕大多數(shù)情況下,CPU從Flash塊的訪問是全速進行的,不存在有等待的狀況;另一方面,一般應用LPC2000的嵌入式系統(tǒng)并不需要動態(tài)地改變異常向量表。因此,對片內SRAM進行Remap后,并不能提高處理器對異常的響應能力,實際意義不大。
事實上,LPC2000系列處理器引入SRAM的Remap功能對于IAP操作具有重要的意義。相對于其它基于ARM7DMI內核的處理器而言,LPC2000系列處理器有一個獨具特色的功能—IAP。在IAP擦除/寫入操作時,片上Flash塊,包括該塊上的異常向量部分,是無法被訪問讀取的,為了在IAP擦除/寫入操作時有效地響應異常,必須在調用IAP擦除/寫入操作之前,將SRAM中的異常向量部分提前映射到系統(tǒng)的異常向量表地址空間上。(待續(xù))
評論