CODE
// (NXP IAP) Status Codes
typedef enum
{
CMD_SUCCESS,
INVALID_CMD,
SRC_ADDR_ERROR,
DST_ADDR_ERROR,
SRC_ADDR_NOT_MAPPED,
DST_ADDR_NOT_MAPPED,
COUNT_ERROR,
INVALID_SECTOR,
SECTOR_NOT_BLANK,
SECTOR_NOT_PREPARED,
COMPARE_ERROR,
BUSY,
PARAM_ERROR,
ADDR_ERROR,
ADDR_NOT_MAPPED,
CMD_LOCKED,
INVALID_CODE,
INVALID_BAUD_RATE,
INVALID_STOP_BIT,
CODE_READ_PROT_ENABLED,
MAX_ERROR
} iap_status_t;
typedef enum
{
PREPARE = 50,
COPY,
ERASE,
BLANK_CHECK,
GET_PART_ID,
GET_BOOT_VER,
COMPARE,
REINVOKE_ISP,
READ_UID,
SIZE_ALIGN = 0xFFFFFFFF
} iap_cmd_code_t;
typedef struct
{
iap_cmd_code_t Code;
uint32_t Param[4];
} iap_command_t;
typedef struct
{
iap_status_t Status;
uint32_t Result[4];
} iap_result_t;
void (* const IAP)(iap_command_t *params, iap_result_t *result) = (void(*)(iap_command_t *params, iap_result_t *result))0x1fff1ff1;
iap_status_t iap_erase (uint_fast8_t start_sector, uint_fast8_t end_sector)
{
iap_command_t Command;
iap_result_t Result;
Command.Code = PREPARE;
Command.Param[0] = start_sector;
Command.Param[1] = end_sector;
IAP(&Command, &Result);
if (Result.Status == CMD_SUCCESS)
{
Command.Code = ERASE;
Command.Param[0] = start_sector;
Command.Param[1] = end_sector;
Command.Param[2] = SYS_CLK_FREQ / 1000;
IAP(&Command, &Result);
}
return Result.Status;
}
Это функция стирания. Остальные нужные вам допишите по образу и подобию самостоятельно. Не забывайте запрещать прерывания на время работы этих функций.