arm(lpc22xx)存儲器尋址
片內(nèi)FLASH
本文引用地址:http://butianyuan.cn/article/201611/317252.htmLPC2000系列ARM的片內(nèi)FLASH通過128位寬度的總線與ARM內(nèi)核相連,具有很高的速度,加上后面要介紹的存儲器加速功能,可以使程序直接在FLASH上運行,而不需要象其它公同的ARM微控制器一樣把程序復(fù)制到RAM中運行
對處內(nèi)FLASH的編程有三種方法來實現(xiàn)
(1)使用JTAG仿真/調(diào)試,通過芯片的JTAG接口下載程序
(2)使用在系統(tǒng)編程技術(shù)(ISP),通過UART0接口下載程序
(3)使用在應(yīng)用編程技術(shù)(IAP)使用這種方式,可以實現(xiàn)用戶程序運行時對FLASH進行擦除/編程,這樣就為數(shù)據(jù)存儲和現(xiàn)場固件的升級都帶來極大的靈活性.
片內(nèi)靜態(tài)RAM
LPC2000系列ARM的片內(nèi)RAM為靜態(tài)的RAM,它可以用作代碼和數(shù)據(jù)的存儲.
片外存儲器
CPU外部擴展連接的存儲器芯片稱為片外存儲器.它們都具有數(shù)據(jù)線、地址線和控制線。(LPC2100系列不存在這種總線接口:所以只能通過I/O口的模擬總線時序來操作片外存儲器,或者使用I2C、SPI等串行接口來連片外存儲器)
LPC2200系列ARM微控制器具備符合ARM公司的外部存儲器接口,通過它可以連接8位、16位或32位的片外存儲器。最多可以擴展4個BAND 的存儲器組,每存儲器組尋址范圍最大為16M。實際慶用中,使用16位總線寬度的存儲器可以獲得較好的性價比
片外存儲器的讀寫
對于外擴的SRAM存儲器只需要一條LDR(STR)指令就可以進行讀寫操作。
對于外擴的FLASH(NOR型),可以使用LDR指令讀取數(shù)據(jù),但是不能使用STR指令直接寫數(shù)據(jù),需要根據(jù)FLASH芯片寫操作時序進行控制,實現(xiàn)FLASH的擦除編程。如果需要將程序代碼燒寫到FLASH芯片內(nèi),則需要在CPU內(nèi)運行一個裝載程序Loder程序.
存儲器映射
給存儲器分配地址的過程稱為存儲器映射。
存儲器的重映射:有部分存儲器單元可以出現(xiàn)在不同聽地址上
注意:這個重映射不是將對映射單元內(nèi)容的復(fù)制,而只是將多個地址指向了同一個存儲單元,這個效果是通過芯片內(nèi)部的"存儲器管理部件"實現(xiàn)的.
引導(dǎo)塊(Boot Block)及其得映射
BOOT BLOCK是芯片設(shè)計廠家在LPC2000系列ARM內(nèi)部固定的一段代碼,用戶無法對其修改或刪除.代碼在芯片復(fù)位后首先運行.其功能為 判斷運行哪個存儲器上的程序\檢查用戶代碼是否有效\判斷芯片是否加密\芯片的在應(yīng)用編程以及在系統(tǒng)編程.
BOOT BLOCK占用了片內(nèi)FLASH的空間(除LPC2138的BOOT?。拢蹋希茫瞬徽加茫疲蹋粒樱瓤臻g),其大小為8KB..但由于各個芯片內(nèi)部FLASH的空間不同所以BOOT BLOCK的位置也有所不同.,而BOOT?。拢蹋希茫酥械挠幸恍┏绦蚴强梢员挥脩羲{(diào)用的,為了增加用戶代碼的可移植性則將BOOT BLOCK 程序得映射在內(nèi)部存儲器的最高位置!即接近2G(0x80000000)的地方
注意:部分器件內(nèi)部雖然沒有用戶FLASH空間,但是它們?nèi)匀淮嬖冢拢希希浴。拢蹋希茫恕。⑶覐?fù)位后首先運行.
***************************************************************************
LPC2000系列ARM芯片啟動過程LPC2000處理器啟動過程是:Memory Map--Remap--Boot--Remap四步。以LPC2292為例:片內(nèi)Flash的最高8kB在芯片出廠前寫入了Bootload程序和64字節(jié)的中斷向量表,這是啟動過程中重要的內(nèi)容。
1.Memory Map(不受控制)LPC2292上電復(fù)位后,F(xiàn)lash和SRAM映射:SRAM占據(jù)0x40000000~0x40003FFF;Flash占據(jù)0x0~0x0003FFFF。此過程不受開發(fā)人員控制。 Memory Map是一個邏輯概念,是計算機系統(tǒng)在(上電)復(fù)位后才建立起來的。Memory Map相當于這樣一個數(shù)學(xué)函數(shù):函數(shù)的輸入量是地址編碼,輸出量被尋址單元中的數(shù)據(jù)。當計算機系統(tǒng)掉電后或復(fù)位時,這個數(shù)學(xué)函數(shù)不復(fù)存在,只剩下計算機系統(tǒng)中實現(xiàn)這個數(shù)學(xué)函數(shù)的物理基礎(chǔ)——電路連接。也可以這樣認為:Memory Map是計算機系統(tǒng)(上電)復(fù)位時的預(yù)備動作,是一個將CPU所擁有的地址編碼資源向系統(tǒng)內(nèi)各個物理存儲器塊分配的自動過程。
2.Remap(不受控制)Boot Block被整體Remap到了0x7fffe000~0x7fffffff。同時,0x0~0x3f的64字節(jié)中斷向量區(qū)被暫時注銷映射關(guān)系,由Boot Block中的中斷向量代替。此過程不受開發(fā)人員控制。此時地址空間分配: 除去Remap暫時注銷映射關(guān)系的64字節(jié),F(xiàn)lash整體占用0x40~0x3ffff。 Boot Block占用0x7fffe000~0x7fffffff,Boot Block中斷向量表占用0x0~0x3f?!∈聦嵣?,Boot Block中斷向量表占用了三段地址編碼空間:0x0~0x3f,0x3e000~0x3e03f,0x7fffe000~0x7fffe03f。
3.Boot(不受控制)復(fù)位后Boot運作就是從0x0處起始字中取出跳轉(zhuǎn)指令,開始程序的執(zhí)行。由于Boot Block中斷向量映射到0x0,CPU實際執(zhí)行的是Boot Block內(nèi)的程序。然后,程序首先檢查看門狗溢出標志,置位表明系統(tǒng)內(nèi)部軟復(fù)位。再檢查BOOT1和BOOT0是不是都為1,如果不是,則CPU從片外BANK0(0x80000000)執(zhí)行用戶代碼,如果BOOT1和BOOT0是都為1,則CPU將對內(nèi)部Flash中的中斷向量表進行加和校驗,檢查用戶代碼是否有效,如果結(jié)果為0,Bootload程序?qū)⒊废鸅oot Block中斷向量表在0x0~0x3f地址空間的映射,恢復(fù)Flash中斷向量表在這64字節(jié)地址空間的映射,然后跳轉(zhuǎn)到地址0x00處轉(zhuǎn)入用戶程序的執(zhí)行。如果加和校驗結(jié)果不為0,Bootload程序?qū)⑦M行UART0接口的波特率自動偵測,隨時響應(yīng)ISP宿主機的編程請求,執(zhí)行ISP編程工作。若Bootload沒有發(fā)現(xiàn)看門狗溢出標志置位,則表明當前系統(tǒng)是外部硬復(fù)位,CPU將采樣P0.14引腳外部邏輯電平輸入。如為0,Bootload執(zhí)行UART0的自動波特率偵測,隨時響應(yīng)ISP宿主機的編程請求,執(zhí)行ISP編程工作;如為1,Bootload的后續(xù)運作將與前面檢測到看門狗溢出標志置位的程序執(zhí)行完全相同。 這部分復(fù)位流程具體可參見《ARM嵌入式基礎(chǔ)教程(上)》
4.Remap(可以控制)Remap的對象是片內(nèi)SRAM存儲器的異常向量部分。用戶可編程決定何時Remap,Remap后是否再修改中斷向量表等等。引發(fā)Remap運作指令與建立SRAM塊中異常向量的所有功能代碼全部駐留在Flash塊的用戶編程區(qū)中,是用戶軟件的一部分。另:此Remap對IAP操作有重要意義。 整個過程存儲器變化如下:1.Memory Map(不受控制)芯片上電復(fù)位后,CPU給各個物理存儲器塊分配地址編碼資源。這時不存在多個地址對應(yīng)同一個物理內(nèi)存的現(xiàn)象。2.Remap(不受控制)在執(zhí)行了Memory Map 后,Boot Block整體被Remap到了0x7fffe000~0x7fffffff,也就是將地址空間0x7fffe000~0x7fffffff用來表示Boot Block同一段物理內(nèi)存。同時,0x0~0x3f的64字節(jié)中斷向量區(qū)被暫時注銷映射關(guān)系(因為在判斷用戶代碼存在于哪個存儲空間之前,能存放異常向量表的存儲空間有兩個,一個在片內(nèi)flash的0x00-0x3f,另個在片內(nèi)flash的頂端即bootblock區(qū),所以在同一時間,二者只能有一個起作用。),由Boot Block中的中斷向量代替。這時Boot Block中斷向量表占用了三段地址編碼空間:0x0~0x3f,0x3e000~0x3e03f,0x7fffe000~0x7fffe03f,即這三段地址編碼空間都指向bootblock中的中斷向量表。3與4同上所述。
評論