LPC2000 內部flash用作EEPROM使用詳解
1.LPC2000的Flash簡介
Flash存儲器系統包含128kB Flash器件的16個扇區和256kB Flash器件的17個扇區。Flash存儲器從地址0開始并向上增加。Flash boot裝載程序同時提供片內Flash存儲器的ISP和IAP編程接口。IAP、ISP和RealMonitor程序都位于boot扇區。boot扇區存在于所有的器件當中。ISP和IAP命令不允許對boot扇區執行寫/擦除/運行操作。在128kB Flash器件中只有120kB Flash可供用戶程序使用。器件共包含256kB的Flash,其中,248kB的Flash可供用戶程序使用。Boot Block一般位于片內Flash存儲器頂端。在128kB Flash中,它是第16個扇區(對應的扇區號是15),在256kB Flash中,它是第18個扇區(對應的扇區號是17)。Boot Block占有的Flash存儲器扇區不能用來存放用戶數據。
LPC2000系列提供在在應用中編程IAP,最終用戶代碼直接執行在應用編程 (IAP)對片內Flash存儲器進行擦除和編程操作。Falsh可以擦寫10000次,512字節行編程時間為1ms。單扇區或整片擦除時間為400ms。
Flash存儲器在寫或擦除操作過程中不可被訪問。
執行Flash寫/擦除操作的IAP命令使用片內RAM頂端的32個字節空間。如果應用程序中允許IAP編程,那么用戶程序不應使用該空間。
很多8位單片機中有頁的概念,頁為Flash編程的最小單位,每次可以擦除和編程一個頁的內容,由于頁中包含的字節較少,在這種情況下把Flash用作EEPROM靈活性會很好。而LPC2000系列沒有頁的概念,它只有扇區這個最小的Flash編程單位,即用戶即使是只修改一個字節,也需要首先擦除8K的Flash。
把Flash當作EEPROM的過程,其實就是對Flash進行讀-修改-寫的過程。
2.向Flash中寫數據
Flash必須遵循選擇扇區,擦除,選擇扇區,寫的過程,具體到程序的編寫,必須先后有下面的代碼:
- SelSector(1,1); // 選擇扇區1
- EraseSector(1,1); // 擦除扇區1
- SelSector(1,1); // 選擇扇區1
- for(i=0;i<512;i++)
- source[i]=0x41;
- RamToFlash(0x00002000, (uint32)source, 512); // 寫數據到扇區1
應用的時候需要注意下面幾點:
- 1)如果寫之前沒有選擇扇區,是不能正確寫入的。
- 2)如果寫之前沒有擦除,寫入是不正確的。
- 3)最少寫512字節,寫入的字節數應當為512 或 1024 或 4096 或 8192.
- 4)Flash在擦寫時不能訪問,這也是IAP是要關閉中斷的原因。關中斷可以用下面的語句來實現:__asm{MSR CPSR_c, #0xdf},與此對應,開中斷可以下面的語句:__asm{MSR CPSR_c, #0x5f}。
另外,經常有人問如何將一個常量的數值定義在Flash的特定地址上,我覺得這個功能不太實用,因為每次擦除的最小單位是8K,到不如直接寫數據到Flash的一個地址,這個地址是在一個空扇區中,讀和寫都以這個地址為基址。由于編譯后的代碼是向下靠緊的,所以你可以查看一下編譯后的代碼量,然后選擇靠上的地址做為用的變量區。如果實在想把數組定義在Flash的特定位置好像可以用分散加載。
3. 從Flash中讀數據
從Flash中讀數據比較簡單,可以定義一個指針變量,該指針變量指向特定的Flash地址,例如可以寫成下面的樣子:
- uint32 i;
- uint8 * p;
- p=(uint8 *)0x1C000;
- for(i=0;i<400;i++)
- {
- Puthexbyte(*(p++));
- }
4. Flash的加密
代碼讀保護 這是Bootloader修訂版1.61的特性。代碼讀保護通過向Flash地址單元0x1FC(用戶Flash扇區0)寫入0x87654321(十進制表示為2271560481)來使能。地址單元0x1FC用來允許為fiq異常處理程序保留部分空間。當JTAG調試端口的代碼讀保護被使能時,外部存儲器引導和以下ISP命令將被禁能:
- 讀存儲器
- 寫RAM
- 運行
- 將RAM內容復制到Flash
上述ISP命令終止時返回CODE_READ_PROTECTION_ENABLED。代碼讀保護使能時,ISP擦除命令只允許擦除用戶扇區的內容。這種限制是代碼讀保護不使能時所沒有的。IAP命令不受代碼讀保護的影響。
采用工程模板的RelInFlash會自動加密。
5. 采用工程模板時需要注意的地方
采用ZLG的工程模板時需要注意下面幾點:
1)修改堆棧,在STARTUP.S文件中的初始化堆棧為 StackUsr-20*4
2)設置編譯參數-apcs/intervork,需要注意是修改 Language Settings/ARM C Compiler/ATPS下面的。我一開始的時候不小心選擇的語言設置是ARM Assembler ,結果運行程序后一寫Flash就錯,大家要選準語言設置。
3)變量定義,由于一次至少寫512個字節,所以跟讀寫操作的變量最好定義為uint32類型的,我犯的一個錯誤是將變量定義為uint8類型的,如下面:
- uint8 i;
- for(i=0;i<512;i++)
- source[i]=0x41;
- RamToFlash(0x00002000, (uint32)source, 512); // 寫數據到扇區1
結果可想而知,一直在for循環中運行而跳不出來,這到給我們一個IAP不好用的假象
相關資料:
聲明:本站部分內容根據互聯網資料整理而成,若侵犯您的權益,請聯系我們,我們會盡快處理。