2011年1月24日 星期一

LPC1114 Flash如何當eeprom來使用? (IAP)


Ethan 提到...
請問LPC1114 Flash如何當eeprom來使用? 有範例程式可提供嗎?

Hi Ethan,
謝謝你來瀏覽MCU DIY.





將Flash當作eeprom的方式稱為IAP(In Application Program)目前在NXP 找到的範例是AN10995 2nd boot loader內部就有呼叫IAP函式 ( http://ics.nxp.com/support/documents/microcontrollers/zip/an10995.zip ) 提供給你參考.

可以參考其中static uint32_t u32BootLoader_ProgramFlash(uint8_t *pu8Data, uint16_t u16Len) 就能作到IAP.



/*****************************************************************************
** Function name: u32BootLoader_ProgramFlash
**
** Description:
**
** Parameters: None
**
** Returned value: 0 if programming failed, otherwise 1.
**
*****************************************************************************/
static uint32_t u32BootLoader_ProgramFlash(uint8_t *pu8Data, uint16_t u16Len)
{
uint32_t u32Result = 0;

static uint32_t u32NextFlashWriteAddr = APP_START_ADDR;

if ((pu8Data != 0) && (u16Len != 0))
{
/* Prepare the flash application sectors for reprogramming */
if (u32IAP_PrepareSectors(APP_START_SECTOR, APP_END_SECTOR) == IAP_STA_CMD_SUCCESS)
{
/* Ensure that amount of data written to flash is at minimum the
size of a flash page */
if (u16Len < IAP_FLASH_PAGE_SIZE_BYTES) { u16Len = IAP_FLASH_PAGE_SIZE_BYTES; } /* Write the data to flash */ if (u32IAP_CopyRAMToFlash(u32NextFlashWriteAddr, (uint32_t)pu8Data, u16Len) == IAP_STA_CMD_SUCCESS) { /* Check that the write was successful */ if (u32IAP_Compare(u32NextFlashWriteAddr, (uint32_t)pu8Data, u16Len, 0) == IAP_STA_CMD_SUCCESS) { /* Write was successful */ u32NextFlashWriteAddr += u16Len; u32Result = 1; } } } } return (u32Result); }


參考的文件除了AN10995內文件外,還可參考UM10398 20.7 IAP command.

其中有兩點特別注意:
1. FLASH 清除的次數約為10000次.
2.清除必須以Sector為單位, LPC111x系列的Sector為4096 Bytes.
如果經常需要更新其資料,建議要多些機制來延長Flash壽命,
可參考
AN11008 Flash based non-volatile storage V1 (Jan 5, 2011) with software (Oct 5, 2010)

裡面有更多對於Flash programming以及上述兩個注意項目的更多說明. 

實作在LPCXpresso上請參考 : 將Flash當EEPROM使用 

2 則留言:

  1. 以4096bytes為一個單位,有點大,也許所有ARM base的mcu,都是如此吧,8x51一般是以512bytes
    為一個單位,好像silicon lab的51是以256bytes,為一個單位

    回覆刪除
  2. Hi Bluek,
    是真的4096 bytes真的不少。
    不過不是Arm mcu都這樣。
    你拿到的LPC1227系列就降為512B

    回覆刪除

Related Posts Plugin for WordPress, Blogger...