片外Flash存儲器IAP的一種方案

原文地址: http://www.laogu.com/wz_11820.htm

引言 

       以ARM芯片爲處理器核的嵌入式應用系統,以其小體積、低功耗、低成本、高性能、豐富的片內資源以及對操做系統的普遍支持,獲得了人們愈來愈多的青睞。包括工業控制領域、無線通訊領域、網絡應用、消費電子、成像和安全產品等,現在,ARM微處理器及嵌入式技術的應用幾乎已經滲透到了各個領域。其中,ARM7做爲ARM微處理器系列中的一員,是低功耗的32位RISC處理器。Samsung公司的S3C4510B、Philips公司的LPC20XX、LPC21XX、LPC22XX系列等都是ARM7處理器。這些爲數繁多的ARM7處理器,因其片內外設不一樣而各擅所長,但都應用一樣的ARM7TDMI核(或ARM7TDMI-S核,這是ARM7TDMI的綜合版本,這兩種覈對處理器應用人員來講沒有區別)。能夠說,ARM7TDMI是目前使用最爲普遍的32位嵌入式RISC處理器。

       ARM7TDMI核應用馮·諾依曼結構,處理器使用的存儲器中數據和程序指令不予區分,PC寄存器指向的存儲器單元,不管是ROM區仍是RAM區,只要符合ARM指令的格式均可以執行,這就爲系統自修改提供了可能。在應用編程IAP(In Application Program)就是這樣的自修改程序。它先在RAM存儲器中寫入數據值,而後使PC指向該存儲段,把該段做爲程序段來執行。不少ARM7芯片自帶IAP處理器,應用其自帶的IAP處理器能夠方便地對其片內集成的Flash存儲器進行在應用編程,但幾乎全部的ARM核芯片均不支持片外IAP處理,由於片外Flash存儲器是用戶選型的,芯片生產廠家沒法先知先覺,而不一樣Flash存儲器其編程時序也不盡相同,致使芯片生產廠家沒法提供通用的IAP代碼。那麼,如何對嵌入式系統的片外Flash存儲器進行在應用編程呢?這裏分兩種狀況:一是普通代碼存放在片外單獨1片Flash中,IAP代碼在另外一片Flash中完成,此時只要依據Flash的操做時序執行IAP代碼,完成擦除或寫入操做便可。這種狀況雖然簡單,但應用了2片Flash;而IAP代碼很小,通常徹底能夠集成到1片中,因此這裏對這種狀況不予考慮,另外一種狀況是1片Flash中既要存儲普通代碼,又要實現IAP。下面以Philips公司的LPC2210和Silicon Storage Technology公司的SST39VF160爲例,詳細討論這種狀況IAP的解決方案。 

       1 硬件結構 

       1.1 LPC2210介紹 

       Philips公司的LPC2210是一款基於支持實時仿真和嵌入式跟蹤的16/32位ARM7TDMI-S CPU的微控制器。芯片採用144腳封裝,有16KB片內靜態RAM,開放外部總線;經過外部存儲器接口可將外部存儲器配置成4組,每組的容量高達16Mb,數據寬度8/16/32位都可;具備多個32位定時器、8路10位PWM輸出、多個串行接口(包括2個16C550工業標準UART、高速I2C接口和2個SPI接口)以及9個外部中斷、多達76個可承受5V電壓的通用I/O口,同時內嵌實時時鐘和看門狗,片內外設功能豐富強大;片內晶振頻率範圍1-30MHz,經過片內PLL可實現最大爲60MHz的CPU工做頻率,具備2種低功耗模式--空閒和掉電,經過外部中斷將處理器從掉電模式中喚醒,並可經過個別使能/禁止外部功能來優化功耗。以上特性,使其特別適用於工業控制、醫療系統、訪問控制和POS機,同時也很是適合於通訊網關協議轉換器、嵌入式軟Modem,以及其餘各類類型的應用。 

       1.2 SST39VF160介紹 

       Silicon Storage Technology公司的SST39VF160是一個1M×16b的COMS多功能Flash器件,單電壓的讀和寫操做,電壓範圍3.0-3.6V,提供48腳TSOP和48腳TFBGA兩種封裝形式。 

       該器件主要操做包括讀、寫編程、扇區/塊擦除和芯片擦除操做。擦除和字編程必須遵循必定的時序,表1列出了扇區擦除和字編程過程及時序。擦除或編程操做過程當中讀取觸發位DQ6將獲得"1"和"0"的循環跳變;而操做結束後讀DQ6,獲得的是不變的固定值。這是器件提供的寫操做狀態檢測軟件方法。

       1.3 硬件鏈接 

       SST39VF160做爲系統的程序存儲器,以LPC2210的CS0做爲Flash的片選信號,處理器配置Boot引腳爲16位數據總線寬度後,上電可直接執行SST39VF160中代碼。此Flash芯片爲16位數據寬度,無字節控制總線,因此應用中不使用LPC2210的BLS引腳。系統結構示意圖如圖1所示。 
編程


點擊看原圖安全


       2.軟件實現 

       2.1 IAP實現要點分析 

       在嵌入式應用系統中,一般要求記錄一些現場的傳感、交互輸入數據,一般把數據記錄在Flash存儲器中,以便下次上電能得到之前的數據。若是系統程序和數據分開存儲。那麼只要對存放數據的Flash器件進行編程便可。然而大多數嵌入式系統,程序和需保存的數據都共存於同一Flash存儲器中,那麼是否也如前所述,可對Flash存儲器直接編程呢?理論和實踐都代表不能夠。 

       先從理論上計算:LPC2210容許的芯片核工做頻率(CCLK)範圍是10-60MHz,存儲器讀訪問長度由存儲器組配置寄存器BCFG中讀訪問的長度域控制WST1控制,其最大可用長度爲35個CCLK,而SST39VF160的扇區擦除典型時間爲18ms。下面是計算算式:

       TRDmax=RDLenmax/CCLKmin=35/10×10-6=3.5μs 
       Tp=18ms>>3.5μs 
       其中:TRDmax--最大讀訪問的時間; 
       RDLenmax--最大讀訪問可用長度; 
       CCLKmin--最小核工做時鐘頻率;
       Tp--扇區擦除典型時間。 

       算式得出扇區擦除典型時間遠大於最大讀訪問時間。這樣一來,若是再給某Flash寫數據,同時於其中預取指,那麼因Flash執行命令期間,對其餘操做不響應,預取出的一定是其數據引腳上的不肯定數據,預取指失敗。實踐也表現,若是在程序執行過程當中,對同一Flash進行扇區擦除,一定引發預取指中斷。 

       爲了解決在同一Flash芯片存放程序並IAP這一問題,引進代碼重映射的思想。所謂重映射就是代碼先自複製到制定存儲區,而後跳轉到制定區的起點開始執行。這裏,IAP程序先自複製到LPC2210片內SRAM中,而後跳轉到SRAM執行IAP代碼。前面過說,ARM7爲馮·諾依曼結構,這就爲IAP程序重映射提供了可能。 

       編寫可重映射代碼的關鍵是要解決程序中相對偏移的問題,ARM7指令系列中涉及相對偏移的指令主要有LDR/STR以跳轉指令。這裏的解決方案是:凡涉及偏移值的指令統統採用基址變址尋址方式,以PC寄存器做基址寄存器,以當即數爲變址,這樣當程序塊整塊移動時,要加載的數據或跳轉的地址與當前PC值的偏移值固定,解決了相對偏移問題。

       2.2 扇區擦除 

       事先編程在Flash中的程序前自複製到SRAM制定的位置,而後,賦PC爲SRAM中扇區編程代碼段的起點ERASEPART。程序於SRAM中的ERASEPART起點開始執行,按照SST39VF160扇區擦除的時序要求開始擦除。按照ARM公司提出的ATPCS規定,C語言程序調用匯編程序時,寄存器R0-R3傳遞參數,返回值由寄存器R0傳遞原則,扇區擦除程序的一個參數,要擦除的扇區號,網絡

由R0傳遞;返回參數置於R0,扇區擦除成功返回"1",不然返回"0"。 

        2.3 字編程 

       程序於SRAM中的PROGRAMPART起點開始執行,按照SST39VF160字編程的時序要求開始編程。入口參數有三個,一次爲編程地址、數據起始地址、編程數據長度。字編程成功返回"1",不然返回"0"。  

        3.結論 

       在嵌入式應用系統中,IAP是極爲有效的一種技術。根據本文提出的方案,在實際應用中只需針對選用的Flash,更改特定的擦、寫操做代碼就可實現系統片外存儲器的在應用編程。本文提出的IAP代碼重入到SRAM執行的方法,有效地解決了應用無片內程序存儲器的32位ARM處理器的嵌入式系統IAP難題,有很大的應用價值。