一種片外Flash存儲器IAP的方案
2.軟件實(shí)現
2.1 IAP實(shí)現要點(diǎn)分析
在嵌入式應用系統中,通常要求記錄一些現場(chǎng)的傳感、交互輸入數據,通常把數據記錄在Flash存儲器中,以 便下次上電能獲得以前的數據。如果系統程序和數據分開(kāi)存儲。那么只要對存放數據的Flash器件進(jìn)行編程即可。然而大多數嵌入式系統,程序和需保存的數據都共存于同一Flash存儲器中,那么是否也如前所述,可對Flash存儲器直接編程呢?理論和實(shí)踐都表明不可以。
先從理論上計算:LPC2210允許的芯片核工作頻率(CCLK)范圍是10-60MHz,存儲器讀訪(fǎng)問(wèn)長(cháng)度由存儲器組配置寄存器BCFG中讀訪(fǎng)問(wèn)的長(cháng)度域控制WST1控制,其最大可用長(cháng)度為35個(gè)CCLK,而SST39VF160的扇區擦除典型時(shí)間為18ms。下面是計算算式:
TRDmax=RDLenmax/CCLKmin=35/10×10-6=3.5μs
Tp=18ms>>3.5μs其中:TRDmax--最大讀訪(fǎng)問(wèn)的時(shí)間;
RDLenmax--最大讀訪(fǎng)問(wèn)可用長(cháng)度;
CCLKmin--最小核工作時(shí)鐘頻率;
Tp--扇區擦除典型時(shí)間。
算式得出扇區擦除典型時(shí)間遠大于最大讀訪(fǎng)問(wèn)時(shí)間。這樣一來(lái),如果再給某FLASH寫(xiě)數據,同時(shí)于其中預取指,那么因Flash執行命令期間,對其他操作不響應,預取出的必定是其數據引腳上的不確定數據,預取指失敗。實(shí)踐也表現,如果在程序執行過(guò)程中,對同一Flash進(jìn)行扇區擦除,必定引起預取指中斷。
為了解決在同一Flash芯片存放程序并IAP這一問(wèn)題,引進(jìn)代碼重映射的思想。所謂重映射就是代碼先自復制到制定存儲區,然后跳轉到制定區的起點(diǎn)開(kāi)始執行。這里,IAP程序先自復制到LPC2210片內SRAM中,然后跳轉到SRAM執行IAP代碼。前面過(guò)說(shuō),ARM7為馮·諾依曼結構,這就為IAP程序重映射提供了可能。
編寫(xiě)可重映射代碼的關(guān)鍵是要解決程序中相對偏移的問(wèn)題,ARM7指令系列中涉及相對偏移的指令主要有LDR/STR以跳轉指令。這里的解決方案是:凡涉及偏移值的指令通通采用基址變址尋址方式,以PC寄存器作基址寄存器,以立即數為變址,這樣當程序塊整塊移動(dòng)時(shí),要加載的數據或跳轉的地址與當前PC值的偏移值固定,解決了相對偏移問(wèn)題。
2.2 扇區擦除
移值固定,解決了相對偏移問(wèn)題。事先編程在Flash中的程序前自復制到SRAM制定的位置,然后,賦PC為SRAM中扇區編程代碼段的起點(diǎn)ERASEPART。程序于SRAM中的ERASEPART起點(diǎn)開(kāi)始執行,按照SST39VF160扇區擦除的時(shí)序要求開(kāi)始擦除。按照ARM公司提出的ATPCS規定,C語(yǔ)言程序調用匯編程序時(shí),寄存器R0-R3傳遞參數,返回值由寄存器R0傳遞原則,扇區擦除程序的一個(gè)參數,要擦除的扇區號,由R0傳遞;返回參數置于R0,扇區擦除成功返回"1",否則返回"0"。
2.3 字編程
程序于SRAM中的PROGRAMPART起點(diǎn)開(kāi)始執行,按照SST39VF160字編程的時(shí)序要求開(kāi)始編程。入口參數有三個(gè),一次為編程地址、數據起始地址、編程數據長(cháng)度。字編程成功返回"1",否則返回"0"。
3.結論
在嵌入式應用系統中,IAP是極為有效的一種技術(shù)。根據本文提出的方案,在實(shí)際應用中只需針對選用的Flash,更改特定的擦、寫(xiě)操作代碼就可實(shí)現系統片外存儲器的在應用編程。本文提出的IAP代碼重入到SRAM執行的方法,有效地解決了應用無(wú)片內程序存儲器的32位ARM處理器的嵌入式系統IAP難題,有很大的應用價(jià)值。
評論