LPC2378的IAP讀寫編程

通過 IAP,用戶可以使用片內Flash 作爲非易失性數據存儲器,存儲一些設備的配置信息。這樣不僅可以節約成本,而且還可以減小線路板的面積。

利用IAP 將Flash 作爲數據存儲器時,用戶需要控制自身代碼量的大小及代碼定位。絕對不能夠出現Flash 數據區和Flash 代碼區重疊的現象。因爲在利用IAP 向片內Flash 存儲器寫入數據時,需要對數據扇區進行擦除。如果數據區和代碼區重合,就有可能會破壞系統的代碼空間,造成系統死機或崩潰。

一、編程片內Flash 的步驟

使用 IAP 函數對片內Flash 執行編程操作時,需要按以下步驟進行操作。


(1)確定參數
在使用 IAP 代碼之前,需要定義一些常量,如系統時鐘、IAP 函數入口、IAP 入口緩衝
區和出口緩衝區等。

(2)選擇扇區
對某一個扇區執行擦除、寫入等操作之前,必須先選擇該扇區。但也可以一次選擇多個
扇區。

(3)擦除扇區
同其它的 Flash 芯片一樣,LPC2300 的片內Flash 在寫入數據前也需要執行擦除操作。
不過這一步是可選的。如果目標區域已經被擦除了,那麼就不必重複擦除,直接寫入數據即可。擦除操作一次可以擦除多個扇區。

(4)編程Flash
以上幾步執行完畢後,就可以編程Flash 了。執行編程扇區的操作時,IAP 函數會將RAM中的數據拷貝到Flash 中,此時有幾個限制:

1.Flash 的目標地址必須是256 字節對齊,即目標地址[7:0]爲0,如下圖所示;

2.RAM 數據區的源地址必須字對齊,即起始地址[1:0]爲0,如下圖所示;

3.源數據區必須是局部總線上的 SRAM,不能使用通用USB SRAM 和以太網SRAM;

4.一次寫入的字節數固定:256、512、1024 或者4096。

(5)校驗數據
IAP 代碼還爲用戶提供了一個數據校驗的手段,這樣用戶就可以不必自己動手來校驗寫入Flash 中的數據是否正確。用戶需要提供目標地址、源地址和比較字節的個數。注意:源地址、目的地址和比較字節的個數都必須是字對齊。

二、程序主體

在這個程序中,我們向扇區7 寫入512 個字節的數據。

                           主程序代碼
#define DestAddr 0x00007000 // 扇區7 的起始地址
/******************************************************************************************
** 函數名稱:main
** 函數功能:數據存儲解決方案。
******************************************************************************************/
int main (void)
{
__align(4) uint8 SendData[512]; // 定義變量區
uint32 i;
for(i = 0; i < 512; i++) // 初始化變量區數據
{
SendData[i] = i;
}
SelSector(7, 7); // 選擇扇區
EraseSector(7,7); // 擦除扇區
SelSector(7, 7); // 選擇扇區
RamToFlash(DestAddr, (uint32)SendData, 512); // 寫數據到FLASH
while(1);
return 0;
}
三、IAP讀操作

很多資料只有寫,沒有讀操作。寫Flash必須用IAP命令,從Flash中讀取數據不需要使用IAP命令,直接通過指針讀Flash絕對地址裏的數據即可。

volatile const unsigned char *pucdata;
unsigned char ucData = 0;
pucdata = (volatile unsigned int *) 0x00000254;
ucData = * pucdata;
通過以上語句即可將0x00000254地址的數據讀取到變量ucData中。

IAP的讀操作注意事項在我的資源裏(IAP例程)有說明。

IAP寫和讀例程在我的資源裏下載


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章