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