Цитата(Metallist64 @ Jun 16 2011, 13:32)

На сколько я понимаю физически флэш память одна. Она просто логически разделена(судя по карте памяти) на разелы BOOT и скажем так пользовательский код?
Сам код, который будет обновлять флэш будет находиться в области зарузчика ? И писать пользовательский код туда нельзя. Судя по карте памяти в нем есть как ROM так FLASH области?
Таким образом общий объем памяти складывается из = BOOT ROM + BOOT FLASH + USER CODE FLASH ?
Опять таки, насколько я понял, что для LPC2367 объем BOOT области = 8кб. И писать тудо ничего ненадо? Там лежат именно те самые функции IAP, я должен только использовать их, вызывая и передавая аргументы?
FLASH одна и имеет линейное адресное пространство от и до.
Вы можете выделить под Ваш загрузчик скажем первые 8к (2 первых сектора по 4к, если их будет мало добавите сколько нужно - для lpc23хх нет разграничений flash на boot не boot области как у атмег). В этой области разместите код загрузчика который будет каким-либо образом принимать прошивку (по uart или как сделано у меня 122к зашифрованной прошивки хранятся во внешней flash-памяти). Код загрузчика анализирует наличие прошивки, закидывает в буффер скажем 4к блок прошивки приложения, из IAP вызывает процедуру подготовки соотв. сектора, процедуру стирания и потом процедуру записи. Там по сути всё настолько просто что работает с первого раза (скажем у меня за полдня получилось полностью освоить код работы с IAP и написать загрузчик для lpc2368).
CODE
//-----------------------------------------
//стирание выбранного сектора
unsigned int eraseSector(unsigned int SECTOR)
{
unsigned int status=0;
//---------------------------------------
//подготовка сектора
status = iapSelectSector(SECTOR, SECTOR);
if(status != IAP_CMD_SUCCESS)
{
return 0; //сбой подготовки
}
//---------------------------------------
//---------------------------------------
//стирание сектора
__disable_interrupt();
status = iapEraseSector(SECTOR, SECTOR);
__enable_interrupt();
if(status != IAP_CMD_SUCCESS)
{
return 0; //сбой стирания
}
else
{
return 1; //стирание OK
}
//---------------------------------------
}
//-----------------------------------------
//-----------------------------------------
//запись вектора
unsigned int writeSector(unsigned int* pData, unsigned int SECTOR, unsigned int addr, unsigned int size)
{
unsigned int status=0;
//---------------------------------------
//подготовка сектора
status = iapSelectSector(SECTOR, SECTOR);
if(status != IAP_CMD_SUCCESS)
{
return 0; //сбой подготовки
}
//---------------------------------------
//---------------------------------------
//запись сектора
__disable_interrupt();
status = iapRamToFlash( addr, (unsigned int) pData, size);
__enable_interrupt();
if(status != IAP_CMD_SUCCESS)
{
return 0; //сбой записи
}
else
{
return 1; //запись OK
}
//---------------------------------------
}
//-----------------------
Сообщение отредактировал mempfis_ - Jun 19 2011, 12:23